• 締切済み

JavaのTCPソケット通信プログラムについて

初めてJavaでTCPソケット通信を書いてみたのですが、質問です。ソケット通信をサーバーとクライアント側で確立した後、メッセージの送受信をやるとても簡素なプログラムを作成しました。一回目の送受信をするだけだと上手くいくのですが、同じコネクション内で二回目の送受信をするよう追記したところ動作がおかしくなりました。(一つ目のメッセージも受信しないまま画面が停止した状態になる)何が問題なのでしょうか。 (Receiver.java) public class Receiver { public static final int PORT = 30000; public static void main(String[] args) { try { ServerSocket serverSoc = new ServerSocket(PORT); Socket socket = null; System.out.println("Waiting for Connection.."); socket = serverSoc.accept(); System.out.println("Connection from "+socket.getInetAddress()); // receive message BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); System.out.println("Message from sender ="+new String(br.readLine())); //send message←ここを追記するとおかしくなりました。 String message = "Hey This is receiver"; BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); System.out.println("I will send: "+message); bw.write(message); br.close(); bw.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } (Sender.java) public class Sender { public static final int PORT = 30000; public static void main(String[] args) { try { InetAddress LocalHost = InetAddress.getLocalHost(); InetSocketAddress socketAddress = new InetSocketAddress(LocalHost, PORT); Socket socket = new Socket(); socket.connect(socketAddress, 10000); //send message String message = "Hey This is sender"; BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); System.out.println("I will send: "+message); bw.write(message); // receive message←同じくここを追記するとおかしくなりました。 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); System.out.println("Message from receiver ="+new String(br.readLine())); br.close(); bw.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }

みんなの回答

  • OKwebb
  • ベストアンサー率44% (92/208)
回答No.1

ServerSocketは受信しかできないんじゃないかな。

rio_grande
質問者

お礼

別の掲示板に聞いてみます。有り難うございました。

rio_grande
質問者

補足

ありがとうございます。そうするとサーバとクライアントの間でメッセージの送受信を自由に行うにはどうしたらよいのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • javaプログラム初心者です。

    入力ファイルの内容をWebサーバプログラムへ送信し、サーバからの応答を別ファイルに出力するクライアントプログラムを作っているのですが、出力ファイルにはなにも書き込みがされていません。(サーバからの応答は事前に不明でその長さが可変長である) 以下が作ったプログラムです。間違っているところを詳しくご指摘いただけるとありがたいです。お願いします。 import java.net.*; import java.io.*; public class client{ static final int BUFSIZE = 1792; public static void main(String[] args){ try{ String server = args[0]; //接続先のIPアドレス File file1 = new File(args[1]); //入力ファイル(HTTPリクエスト) FileReader filereader = new FileReader(file1); BufferedReader br = new BufferedReader(filereader); int serverport = Integer.parseInt(args[2]); //ポート番号 File file2 = new File(args[3]); //サーバからの応答をファイルに書き込む用 FileWriter filewriter = new FileWriter(file2); BufferedWriter bw = new BufferedWriter(filewriter); byte[] bytebuffer = new byte[BUFSIZE]; String str; while((str = br.readLine()) != null){ //入力ファイルの内容を1行ずつ読み込む bytebuffer = str.getBytes(); //入力ファイルの文字列をバイトに変換 } Socket socket = new Socket(server,serverport); //ソケットの生成 System.out.println("Connected to server...sending echo string"); InputStream in = socket.getInputStream(); //入出力ストリームの取得 OutputStream out = socket.getOutputStream(); out.write(bytebuffer); //文字列を送信 int receive; while((receive = in.read(bytebuffer))!=-1){ bw.write(new String(bytebuffer)); //サーバからの応答をファイルに出力 } bw.close(); socket.close(); }catch(IOException e){ } } }

  • ソケットを使ったサーバとクライアントのプログラムについて

    はじめまして。 プログラミング初心者です。。 ソケットを使用した 簡単なチャットシステムを作ろうとしたのですが どうしてもエラーが出てしまいます。。。 サーバ側のプログラムを実行して その後、 public class ChatClient { public static void main(String args[]){ BufferedReader br; BufferedWriter inw; String logFileName = "chat.log"; Socket s = null ; InputStream sin; DataInputStream dis; OutputStream sout; DataOutputStream dos; String str ; String str1= ("append,"); String str2; try{ s = new Socket("localhost",5432); }catch(IOException e){ } try{ sin = s.getInputStream(); dis = new DataInputStream(sin); sout = s.getOutputStream(); dos = new DataOutputStream(sout); br = new BufferedReader(new FileReader(logFileName)); String line; while((line = br.readLine()) != null){ System.out.println(line ); } BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); while((str=in.readLine())!= null){ if (str.equals("")){ br = new BufferedReader(new FileReader(logFileName)); String line1; while((line1 = br.readLine()) != null){ System.out.println(line1); } }else{ dos.writeUTF(str1+str); dos.flush(); str2 = dis.readUTF(); System.out.println(str2); } } }catch (IOException e){ System.out.println("Error: reading file:"); System.out.println(e); e.printStackTrace(); System.exit(1); } } } としてクライアント側のプログラムを実行します。 ・標準入力から入力を読み込み"ハンドルネーム「,」メッセージ"の形式で「,」で区切って入力する。 そして何も入力せずに"Enter"だけを入力された場合には、チャットログの更新要求と判断して、別途作成してあるチャットログファイルをサーバ側で読み込みクライアント側に渡す。 という感じで作っているのですが 一回目は上手くいくんです。 二回目、同じようにハンドルネーム「,」メッセージを「,」で 区切って入力してエンターを押すと java,io,EOFExceptionのエラーが出てしまいます。。。 どうやったら解決できるのでしょうか。。。

  • javaプログラムの質問です。お願いします

    1このプログラムの全てのインスタンス変数について、変数名を書いてください。 2全てのメソッド名を書いてください。 よろしくお願いします。 1: import java.awt.event.*; 2: import java.awt.*; 3: import java.io.*; 4: import java.net.*; 5: 6: public class Test71 { 7: private MyCanvas c; 8: public static void main( String[] args ) { 9: Test71 t71 = new Test71(); 10: t71.doEvent(); 11: } 12: 13: Test71() { 14: Frame f = new Frame( "Test71" ); 15: f.setSize( 640, 480 ); 16: f.addWindowListener( new WindowAdapter() { 17: @Override public void windowClosing( WindowEvent e ) { 18: System.exit( 0 ); 19: } 20: }); 21: c = new MyCanvas(); 22: f.add( c ); 23: f.setVisible( true ); 24: } 25: 26: public void doEvent(){ 27: try{ 28: ServerSocket ss = new ServerSocket( 8000 ); 29: while( true ) { 30: Socket socket = ss.accept(); 31: BufferedReader br = new BufferedReader( new InputStreamReader( socket.getInputStream() ) ); 32: BufferedWriter bw = new BufferedWriter( new OutputStreamWriter( socket.getOutputStream() ) ); 33: while( true ) { 34: String command = br.readLine(); 35: String[] words = command.split( " " ); 36: System.out.println( command ); 37: if( words[0].equalsIgnoreCase( "setOval" ) ) { 38: try { 39: c.setPoint( Integer.parseInt( words[1] ), Integer.parseInt( words[2] ) ); 40: } catch( Exception e ) {} 41: } else if( words[0].equalsIgnoreCase( "changeMode" ) ) { 42: //描画方式を変更する処理 43: } 44: else if( words[0].equalsIgnoreCase( "quit" ) ) { 45: break; 46: } 47: } 48: bw.close(); 43 49: br.close(); 50: socket.close(); 51: } 52: } catch( Exception e ) { 53: e.printStackTrace(); 54: } 55: } 56: }

    • ベストアンサー
    • Java
  • Javaのネットワークに関して

    一つのサーバから複数のクライアントにメッセージを送るようにしなさい。いくつのクライアントと接続するか は入力により動的に決めるようにすること。複数のクライアントとの通信にはそのソケットを配列やコンテナを使って実装すればよい。サ ーバを「No23ex04Server」としクライアントを「No23ex04Client」とすること。 とあります。 以下のコードでクライアント側のプログラムは一切変えなくてよいそうなので、サーバー側のプログラムを以下のようにしたのですが、acceptが呼ばれている時点で、ループが止まってしまうので、入力待機状態になりません。スレッドを使わなくてもできるそうなのですが、私にはさっぱりです。 public class No23ex04Client { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ String cIpAddress = null; String hostName = null; String sIpAddress = null; int portNo = 65535; try { cIpAddress = InetAddress.getLocalHost().getHostAddress(); hostName = InetAddress.getLocalHost().getHostName(); } catch (UnknownHostException e) { } System.out.println("Client IP Address : " + cIpAddress); System.out.println("Host Name : " + hostName); Scanner scn = new Scanner(System.in); System.out.print("Server IP Address? : "); sIpAddress = scn.next(); System.out.print("Server Port Number? : "); portNo = scn.nextInt(); System.out.println("■Start■"); try { Socket sc = new Socket(sIpAddress, portNo); BufferedReader br = new BufferedReader(new InputStreamReader(sc.getInputStream())); while (true) { System.out.print("From Server Message : "); String fromServerMessage = br.readLine(); System.out.println(fromServerMessage); if (fromServerMessage.contains("さようなら")) break; } sc.close(); } catch (IOException e) { e.printStackTrace(); } System.out.println("■Shutdown■"); } } public class No23ex04Server { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ String ipAddress = null; String hostName = null; int portNo = 65535; try { ipAddress = InetAddress.getLocalHost().getHostAddress(); hostName = InetAddress.getLocalHost().getHostName(); } catch (UnknownHostException e){ } System.out.println("IP Address : " + ipAddress); System.out.println("Host Name : " + hostName); Scanner scn = new Scanner(System.in); System.out.print("Port Number? : "); portNo = scn.nextInt(); System.out.print("Socket Number? : "); int num = scn.nextInt(); System.out.println("■Start■"); try { ServerSocket ssc = new ServerSocket(portNo); System.out.println("Serverが起動(Port Number : " + ssc.getLocalPort() + ")"); Socket[] sc = new Socket[num]; BufferedWriter[] bw = new BufferedWriter[num]; for (int i = 0; i < num; i++) { sc[i] = ssc.accept(); System.out.println("接続" + i + " : " + sc[i].getRemoteSocketAddress()); bw[i] = new BufferedWriter(new OutputStreamWriter(sc[i].getOutputStream())); } while (true) { System.out.print("To Client Message : "); String toClientMessage = scn.next(); for (BufferedWriter b : bw) { b.write(toClientMessage); b.newLine(); b.flush(); } if (toClientMessage.contains("さようなら")) break; } for (Socket s : sc) s.close(); } catch (IOException e) { e.printStackTrace(); } System.out.println("■Shutdown■"); } }

    • ベストアンサー
    • Java
  • javaの課題プログラムでどうしてもわかりません。

    以下(senderTest)のプログラムを適切に繰り返すように書き換えたいのですが、どうしてもうまくいきません。while文で自分なりに繰り返した結果は同じ文字を送り続けるというものになってしまいました。 本来は送信して、待機状態になりまた新たに文字を入力したら送信、また待機というようにしたいのですがどうしたらよいでしょうか? どうかよろしくおねがいします。 ******************************** senderTest import java.io.*; import java.net.*; public class senderTest { private InetAddress address; private int port = 13400; private DatagramSocket socket; public senderTest() throws Exception { this.address = InetAddress.getByName("192.168.0.16"); this.socket = new DatagramSocket(); } public void send(String s) throws Exception { byte buffer[]; buffer = s.getBytes("Shift_JIS"); DatagramPacket packet = new DatagramPacket(buffer, buffer.length, this.address, this.port); this.socket.send(packet); } public static void main(String[] args)throws IOException { senderTest sender1; System.out.println("↓送信する文字を入力してください↓"); String name = ("健児>"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String msg = name +br.readLine(); try { sender1 = new senderTest(); sender1.send(msg); System.out.println("『" + msg + "』を送信しました。"); } catch (Exception ex) { System.err.println("Error: " + ex.getMessage()); } } } ********************************

    • ベストアンサー
    • Java
  • 今勉強中のjavaで。わからないことがあります。

    import java.io.*; class Ireru { public static void main(String args[]) throws IOException{ System.out.println("あなたは何歳ですか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); int num =Integer.parseInt(str1); System.out.println("あなたは" + num +"歳です。"); } } ------------------------------- import java.io.*; class Ireru { public static void main(String args[]) throws IOException{ System.out.println("あなたは何歳ですか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); System.out.println("あなたは" + str1 +"歳です。"); } } なぜ下では悪いのですか?なぜnum をつかないといけないかがわかりません。正確には str1とnumの違いがわからなくて困っています。何が混乱の原因ですか?

    • ベストアンサー
    • Java
  • javaプログラムの問題です

    1このプログラムの全てのインスタンス変数について、変数名と大まかな役割を書いてください。 c MyCanvasを呼び出す t71 Test71を呼び出す f フレームを呼び出す br 文字列を読み込み bw 文字列を書き込む これであっているかをお願いします。 2全てのメソッド名と大まかな役割を書いてください。 メソッド名 main javaの基本(どのプログラムでも使う) windowClosing ウィンドウを閉じる doEvent 送られてきた処理により何かをする こちらもあっているかをお願いします。 間違っているなら何が違うかを教えてください。 プログラム始めたばかりの初心者ですみません。 よろしくお願いします。 1: import java.awt.event.*; 2: import java.awt.*; 3: import java.io.*; 4: import java.net.*; 5: 6: public class Test71 { 7: private MyCanvas c; 8: public static void main( String[] args ) { 9: Test71 t71 = new Test71(); 10: t71.doEvent(); 11: } 12: 13: Test71() { 14: Frame f = new Frame( "Test71" ); 15: f.setSize( 640, 480 ); 16: f.addWindowListener( new WindowAdapter() { 17: @Override public void windowClosing( WindowEvent e ) { 18: System.exit( 0 ); 19: } 20: }); 21: c = new MyCanvas(); 22: f.add( c ); 23: f.setVisible( true ); 24: } 25: 26: public void doEvent(){ 27: try{ 28: ServerSocket ss = new ServerSocket( 8000 ); 29: while( true ) { 30: Socket socket = ss.accept(); 31: BufferedReader br = new BufferedReader( new InputStreamReader( socket.getInputStream() ) ); 32: BufferedWriter bw = new BufferedWriter( new OutputStreamWriter( socket.getOutputStream() ) ); 33: while( true ) { 34: String command = br.readLine(); 35: String[] words = command.split( " " ); 36: System.out.println( command ); 37: if( words[0].equalsIgnoreCase( "setOval" ) ) { 38: try { 39: c.setPoint( Integer.parseInt( words[1] ), Integer.parseInt( words[2] ) ); 40: } catch( Exception e ) {} 41: } else if( words[0].equalsIgnoreCase( "changeMode" ) ) { 42: //描画方式を変更する処理 43: } 44: else if( words[0].equalsIgnoreCase( "quit" ) ) { 45: break; 46: } 47: } 48: bw.close(); 43 49: br.close(); 50: socket.close(); 51: } 52: } catch( Exception e ) { 53: e.printStackTrace(); 54: } 55: } 56: }

    • ベストアンサー
    • Java
  • JAVAプログラムで質問です

    下のように作動するJAVAプログラムを作成して欲しいと言われたのですが、私には良く分かりませんでした。 プログラムについて分かる方!是非、このプログラムを下のように動くように改良していただけないでしょうか? 宜しくお願い致します。 今の状態は、 --- こんにちは。私はコンピュータです。 あなたの名前を入力してください。 やまもと←入力してエンター やまもとさん。よろしく。 --- となりますが、10秒間、入力しない場合には、 >>の部分が何度も繰り返されるようにしたいのですがどのようなプログラムになりますか? --- こんにちは。私はコンピュータです。 あなたの名前を入力してください。 >>まだ~。早く入力して~。 >>あなたの名前を入力してください。 --- import java.io.*; class Hello2 { public static void main(String[] args) throws Exception { System.out.println("こんにちは。私はコンピュータです。"); System.out.println("あなたの名前を入力してください。"); String name; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); name = br.readLine(); System.out.println(name + "さん。よろしく。"); br.close(); } }

    • ベストアンサー
    • Java
  • TCP関係のjavaプログラム

    TCPでオウム返しをするサーバとクライアントソフトでクライアント側でピリオドだけを入力すると接続を切るプログラムを作っているのですがなかなか思い通りにいきません。 正しいソースコードを教えてください。 クライアント側のソースコード import java.io.*; import java.net.*;   public class echoClient { public static void main(String[] args) { Socket echoSocket = null; DataOutputStream os = null; BufferedReader is = null;   try { echoSocket = new Socket("localhost", 9999); os = new DataOutputStream(echoSocket.getOutputStream()); is = new BufferedReader(new InputStreamReader(echoSocket.getInputStream())); } catch (UnknownHostException e) { System.err.println("Don't know about host: localhost"); } catch (IOException e) { System.err.println("Couldn't get I/O for the connection to: localhost"); }   if (echoSocket != null && os != null && is != null) { try { os.writeBytes("HELLO\n");   String responseLine; if ((responseLine = is.readLine()) != null) { System.out.println("Server: " + responseLine); }   os.close(); is.close(); echoSocket.close(); } catch (UnknownHostException e) { System.err.println("Trying to connect to unknown host: " + e); } catch (IOException e) { System.err.println("IOException: " + e); } } } } サーバー側のプログラム import java.io.*; import java.net.*; public class echoServer { public static void main(String args[]) { ServerSocket echoServer = null; String line; BufferedReader is; PrintStream os; Socket clientSocket = null; try { echoServer = new ServerSocket(9999); } catch (IOException e) { System.out.println(e); } try { clientSocket = echoServer.accept(); is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); os = new PrintStream(clientSocket.getOutputStream()); while (true) { line = is.readLine(); os.println(line); } } catch (IOException e) { System.out.println(e); } }

  • Javaの簡易クライアント

    メールの閲覧ができるプログラムを作成してコンパイルして実行はできるのですが閲覧ができずエラーが出てしまいます。 正しいソースコードを教えてください。プログラムに詳しい方宜しくお願いします。 画像は実行結果です。 import java.io.*; import java.net.*; public class mail2 { public static void main(String args[]) throws IOException { String server,user,pass,str,num; int port = 110; StringBuffer sb = new StringBuffer(""); Socket sock; BufferedReader sockin; BufferedWriter sockout; System.out.println("サーバーを入力"); BufferedReader serverin = new BufferedReader(new InputStreamReader(System.in)); server = serverin.readLine(); System.out.println("ユーザーを入力"); BufferedReader userin = new BufferedReader(new InputStreamReader(System.in)); user = userin.readLine(); System.out.println("パスワードを入力"); BufferedReader passin = new BufferedReader(new InputStreamReader(System.in)); pass = passin.readLine(); try { sock = new Socket(server, port); sockin = new BufferedReader(new InputStreamReader(sock.getInputStream())); sockout = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())); sockout.write("USER " + user + "\r\n"); sockout.write("PASS " + pass + "\r\n"); sockout.write("LIST\r\n"); sockout.write("QUIT\r\n"); sockout.flush(); while ((str = sockin.readLine()) != null) { System.out.println(str); } sockout.close(); sockin.close(); sock.close(); } catch (Exception ex) { ex.printStackTrace(); } System.out.println("どのメールを見ますか?"); BufferedReader numin = new BufferedReader(new InputStreamReader(System.in)); num = numin.readLine(); try { sock = new Socket (server, port); sockin = new BufferedReader(new InputStreamReader(sock.getInputStream())); sockout = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())); sockout.write("USER " + user + "\r\n"); sockout.write("PASS " + pass + "\r\n"); sockout.write("RETR " +num+"\r\n"); sockout.write("QUIT\r\n"); sockout.flush(); while ((str = sockin.readLine()) != null) { System.out.println(str); } sockout.close(); sockin.close(); sock.close(); } catch (Exception ex) { ex.printStackTrace(); } } }

    • ベストアンサー
    • Java
外出先からの接続について
このQ&Aのポイント
  • 外出先での接続ができない場合、ST4500利用時に設定に問題がある可能性があります。
  • 外出先からの接続ができない問題を解決するためには、ペアリングの設定を確認してください。
  • ひかりTVのサービスやISPぷららを利用している場合、外出先での接続には問題がある可能性があります。
回答を見る

専門家に質問してみよう