スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

java socket通信

事例研究でオセロ作ってて、オセロ自体は完成したから次は通信
授業でsocket通信をやったので、過去のプリントみながらどうにか・・
と、思ってたんですが全くもって意味不明で
数多くのサイト見て回ったり、プリントを見直してみたり
恐らく2ヶ月かかりました、理解するのに

できたんですよ・・通信が!!!

もう、ほんとに嬉しくてしょうがない
JavaSocket01
右が俺だとも 左が俺だよー
とりあえず実装したのはBufferedWriter/Readerを使って文字列のやり取りのみです

対戦できないと意味がない・・ので
コマの座標をString化して送り、それをint型に変換・・とか考えてたんですが
DataOutput/InputStreamクラスのwrite/readIntメソッドを使うとint型のやり取りができます
メモを兼ねて・・

//インスタンス生成
Socket socket = new Socket(相手アドレス,ポート番号);
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
DataInputStream dis = new DataInputStream(socket.getInputStream());
//座標の送信(最初にx、次にyを送信)
dos.writeInt(x);
dos.flush();
dos.writeInt(y);
dos.flush();
//座標の受信(最初にx、次にyを受信)
Int receive_x = dis.readInt();
Int receive_y = dis.readInt();
コマを配置し反転するメソッド(x,y);
//ソケットを閉じる
socket.close();

と、こんな感じです
受信用にスレッドを走らせ、送信はコマが置けた時にさせます
そのスレッドを走らせるタイミングは・・
スタートするボタンを押したとき と 相手がそのボタンを押したとき
で、うまいことゲームが始まるんじゃないかと思います

これで完成も間近となりました!
より一層、気合が入ります!

続きはテストで作った通信プログラム
SocketTest
自分でクライアントとサーバーを立ち上げてその間で通信してます
サーバーは予め受信用のスレッドを走らせ、クライアントは送信時にサーバーから受信するスレッドを走らせます
クライアントから受信があったら"ようこそ!!"と、文字列を送り、こちらからも送信が可能になります

これまたメモ用にソースコード載せます

クライアント側のソース
public class TestPanel extends JPanel {
private static final String LINE_SEPARATOR = System.getProperty("line.separator");
private JTextField jtf_msg;
private JTextArea jta_receive = new JTextArea();
private String str_addr = "127.0.0.1";
private int port = 9999;
Thread t = new Thread(){
public void run(){
try{
ServerSocket ss = new ServerSocket(port-1);
while(true){
Socket skt = new Socket();
skt = ss.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(skt.getInputStream()));

jta_receive.append(br.readLine()+"\n");

skt.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
};

public TestPanel() {
setLayout(null);

jtf_msg = new JTextField();
jtf_msg.setBounds(43, 213, 311, 19);
add(jtf_msg);
jtf_msg.setColumns(10);

JButton jbt_send = new JButton("\u9001\u4FE1");
jbt_send.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
try{
Socket skt = new Socket(str_addr,port);

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(skt.getOutputStream()));
String sendMsg = null;

sendMsg = jtf_msg.getText();
jta_receive.append(sendMsg + LINE_SEPARATOR);
bw.write(sendMsg);
bw.newLine();
bw.flush();

if(t.isAlive() == false){
t.start();
BufferedReader br = new BufferedReader(new InputStreamReader(skt.getInputStream()));
jta_receive.append(br.readLine() + LINE_SEPARATOR);
}

skt.close();
}catch(Exception e){
e.printStackTrace();
}
}
});
jbt_send.setBounds(261, 242, 93, 23);
add(jbt_send);

JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(43, 31, 311, 170);
add(scrollPane);

jta_receive.setEditable(false);
scrollPane.setViewportView(jta_receive);
}
}

サーバー側のソース
public class ServerPanel extends JPanel {
private static final String LINE_SEPARATOR = System.getProperty("line.separator");
String str_msg = "ようこそ!!";
JTextArea jta_receive = new JTextArea();
private JTextField jtf_send;
private InetAddress str_addr = null;
private int port = 9999;

ServerPanel(){
setLayout(null);

JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(39, 10, 302, 200);
add(scrollPane);


jta_receive.setEditable(false);
scrollPane.setViewportView(jta_receive);

jtf_send = new JTextField();
jtf_send.setBounds(39, 220, 302, 19);
add(jtf_send);
jtf_send.setColumns(10);

JButton jbt_send = new JButton("\u9001\u4FE1");
jbt_send.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
String send_msg = jtf_send.getText();
jta_receive.append(send_msg + LINE_SEPARATOR);
if(str_addr != null){
try{
Socket skt = new Socket(str_addr,port - 1);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(skt.getOutputStream()));

bw.write(send_msg);
bw.newLine();
bw.flush();

skt.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
});
jbt_send.setBounds(248, 249, 93, 23);
add(jbt_send);


new Thread(){
@Override
public void run(){
boolean flag = false;
try{
ServerSocket ss = new ServerSocket(port);
while(true){
Socket skt = new Socket();
skt = ss.accept();
System.out.println(skt.getInetAddress()+"\n");
str_addr = skt.getInetAddress();
BufferedReader br = new BufferedReader(new InputStreamReader(skt.getInputStream()));

jta_receive.append(br.readLine()+ LINE_SEPARATOR);

if(flag == false){
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(skt.getOutputStream()));
bw.write(str_msg);
bw.newLine();
bw.flush();
flag = true;
}
skt.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
}.start();
}
}
スポンサーサイト

comment

管理者にだけ表示を許可する

No title

なんかすごいですね、前からこの手の記事を見てましたが
↑の記事の内容みたいなのは、パソコンがクラッシュか
コマンドプロントぐらいしか見たことないですw 
全部自分でコードみたいの打ってるんですか?
09 | 2017/10 | 11
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
プロフィール

べ

Author:べ
3DSとWiiUがほしい

FC2カウンター
カテゴリ
最新記事
最新コメント
月別アーカイブ
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。