Socket通信でのデータの受け渡し

このQ&Aのポイント
  • Socket通信において、データの受け渡し方法について悩んでいます。
  • 無限ループでデータを受け取り、必要に応じて送信するプログラムがうまく動作しません。
  • どこに問題があるのか、分かる人にアドバイスをお願いします。
回答を見る
  • ベストアンサー

Socket通信でのデータの受け渡し

サーバーが受けたデータを、クライアントに返す プログラムですが、 サーバーは、クライアントからのデータを、 while(true){ BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream())); str=br.readLine(); if(str!=null){ PrintWriter pr=new PrintWriter(s.getOutputStream()); pr.println(str); pr.flush(); }}で、返すようにしています。 クライアントも大体同じです(PrintWriterは、 Buttonを押した時に、取得しています)。 考え方としては、inputstreamは、無限ループで、 取得し、outputstreamは、必要におうじて、取得し データを送っています。 しかし、これだと、一度データを送ると、次から データの受け渡しが出来なくなります。 socketか、inputstreamかoutputstreamのどれかが、 閉じるか、使えなくなるのだと思いますが、 いつもここで、悩んでいます。 (また、無限ループで、BufferedReaderオブジェクト をつくり続けるというのも、ちょっと不安)。 どこに問題があるのか、分かる人教えてください。 お願いします。

noname#10667
noname#10667
  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.1

普通はこういう書き方をします。 プログラム全体が載っていないので何とも言えませんが、同じような書き方でもちゃんと動きます。 たぶんクライアント側のPGも何かおかしいのではないでしょうか? br = new BufferedReader(new InputStreamReader(s.getInputStream())); pw = new PrintWriter(s.getOutputStream()); while((str = br.readLine()) != null){ pw.println(str); pw.flush(); } br.close(); pw.close(); s.close();

noname#10667
質問者

お礼

回答ありがとうございます。 本当は、プログラム全部をのせる必要がありそう ですが、これだけでも相当長いので、そういうわけ にもいきません。 もうすこし、考えて、まとまってから、また質問 しようと思います。

関連するQ&A

  • ソケット通信について

    自分はJAVAで、クライアント・サーバ形式の ネットワークゲームを作ろうとしているのですが、 チャットシステムで BufferedReader NetInput; // ネットワーク経由入力ストリーム PrintStream NetOutput; // ネットワーク経由出力ストリーム Socket socket; // ソケット ChatServer chatserver; // ChatServerオブジェクト int clientnumber; // クライアント番号 ChatClient(Socket socket, ChatServer chatserver, int clientnumber) { this.socket = socket; this.chatserver = chatserver; this.clientnumber = clientnumber; try { InputStream inputstream = socket.getInputStream( ); NetInput = new BufferedReader(new InputStreamReader(inputstream)); OutputStream outputstream = socket.getOutputStream( ); NetOutput = new PrintStream(outputstream); } catch(Exception e) { System.out.println("->" + e); } } // メッセージ送信 ------------------------ synchronized void sendMessage(String message) { NetOutput.println(message); // サーバからクライアントに送信 NetOutput.flush( ); } とString型の文字列messageを送受信し合う様に、 int型の配列や、boolean型の配列を送受信する方法があったら 教えていただきたいです。

  • BufferedReaderで配列のデータを取り出したい

    PrintWriterで配列のデータを書き込み、 BufferedReaderで書き込んだデータを呼び出したい のですが、下記のソースで書き込むと [Ljava.lang.String;@1add2dd のように表示されてしまいます。 テキストファイルに 1,Server1 のような感じで 書き込んで読み込むにはどのようにしたら いいでしょうか? すみません、ご教授下さい。 よろしくお願いします。 import java.io.*; public class IOTest { public static void main(String[] args) { try{ PrintWriter pr = new PrintWriter( new BufferedWriter(new FileWriter("test.txt")),true); String index = "1"; String serverName = "Server1"; String Server [] = {index, serverName}; pr.println(Server); System.out.println("登録したデータは:" + Server + "です。\n"); BufferedReader br = new BufferedReader( new FileReader("test.txt")); String line; while((line = br.readLine()) != null){ System.out.println("取り出したデータは:" + line + "です。"); } }catch(Exception e){ e.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • Socket + XML

    ・クライアントはサーバへXML形式のクエリを送信し、 ・サーバからXML形式のデータを受け取る という単純なプログラムを実装しています。 しかしサーバ側の、InputStreamを引数とするXMLパースメソッドでwaitしてしまって困っています。 かといって、クライアント側のOutputStreamを閉じると、クライアントのソケット自体も閉じてしまいます。 なるべく一度のコネクションで送受信を終了させたいのですが、よい方法はないでしょうか? 一応、BufferedReaderを利用してXML文章を文字列に落としてから StringReaderをbuilder.parseの引数に与えることで解決出来てはいるのですがスマートではない気がしまして。 [Server側]  ServerSocket server_sock = new ServerSocket(12345);  Socket sock = server_sock.accept();  /* XMLパーサビルダ生成 */  DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();  DocumentBuilder builder = fact.newDocumentBuilder();  /* ドキュメント docIn の解析 */  Document docIn = builder.parse(sock.getInputStream());//ここから動かない(clientがoutputを終了するまで待っている?)  (略)  /* 結果ドキュメント docOut の構築*/  Document docOut = builder.newDocument();  (略)  /* docOut 送信 */  TransformerFactory tfactory = TransformerFactory.newInstance();  Transformer transformer = tfactory.newTransformer();  transformer.transform(new DOMSource(docOut), new StreamResult(sock.getOutputStream()));  sock.getInputStream().close();  sock.getOutputStream().close();  sock.close(); [Client側]  Socket sock = new Socket("localhost", 12345);  /* XMLパーサビルダ生成 */  DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();  DocumentBuilder builder = fact.newDocumentBuilder();  /* クエリドキュメント docOut の構築*/  Document docOut = builder.newDocument();  (略)  /* docOut 送信 */  TransformerFactory tfactory = TransformerFactory.newInstance();  Transformer transformer = tfactory.newTransformer();  transformer.transform(new DOMSource(docOut), new StreamResult(sock.getOutputStream()));  sock.getOutputStream().flush();  //sock.getOutputSream().close();//これにすると、socketが閉じてしまう  /* 結果ドキュメント docIn の解析 */  Document docIn = builder.parse(sock.getInputStream());//サーバから結果が送信されないので、クライアントはここで停止  (略)

    • ベストアンサー
    • Java
  • 文字化けします。

    お世話になります。 ソケットでサーバとクライアントを接続しています。 コーディングの概略は次の通りです。 【クライアント】 PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(),"EUC_JP")); out.println("かきくけこ"); System.out.println(in.readLine()); 【サーバ】 PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(),"Shift_JIS")); String inputLine; while ((inputLine = in.readLine()) != null) { System.out.println(inputLine); out.println(inputLine); //←これはクライアントでも文字化けしない。 String s1 = "あいうえお"; String u1 = new String(s1.getBytes("xxxxx"), "yyyyy"); out.println(u1); //←文字化けする。 } お伺いしたいのは文字コード変換についてです。 サーバ:RedhatLinux クライアント:Windowsでして、 サーバ側コーディングの String s1 = "あいうえお"; としている文字列を クライアント側の // 読み込んだデータを表示 System.out.println(in.readLine()); で表示したいのですが、文字が化けて(????←このようになります)困っています。 文字コード変換しなければいけないと思うのですが、 getBytesを使うのでしょうか? もしgetBytesを使うならどのように書けばいいのかがわかりません。 分かりにくい説明で申し訳ありませんが、 ご教授ください。宜しくお願いします。

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

    はじめまして。 プログラミング初心者です。。 ソケットを使用した 簡単なチャットシステムを作ろうとしたのですが どうしてもエラーが出てしまいます。。。 サーバ側のプログラムを実行して その後、 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)

    初歩的なソケット通信(java) javaのソケット通信プログラムについて質問させて頂きます。まだまだ基礎の段階なのですが、詰まってしまたので、良かったら教えてください。 以下プログラムコード ------------------------------------- //サーバー側 import java.net.*; import java.io.*; public class Server { static int port = 12345; public static void main(String[] args) { try{ //サーバソケットの作成 ServerSocket ssoc = new ServerSocket(port); //メインループ while(true){ try{ System.out.println("クライアントからの接続を"+ port +"で待ちます"); Socket soc = ssoc.accept(); System.out.println(soc.getInetAddress().getHostName()+"から接続を受けました"); //処理をスレッドに任せます new Connect(soc); }catch(IOException e1){ e1.printStackTrace(); } } }catch(IOException e2){ e2.printStackTrace(); } } } class Connect extends Thread{ private Socket socket = null; public Connect(Socket socket){ this.socket = socket; //スレッド開始 this.start(); } public void run(){ try{ //出力ストリームを取得 OutputStream os = socket.getOutputStream(); PrintWriter out = new PrintWriter(os,true); //入力ストリームを取得 InputStream is = socket.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader in = new BufferedReader(isr); String inputLine; while((inputLine = in.readLine()) != null){ //System.out.println(inputLine); out.println(inputLine); } System.out.println("処理が終わったので接続を切ります"); in.close(); out.close(); socket.close(); }catch(Exception e1){ try{ socket.close(); }catch(Exception e2){ e2.printStackTrace(); } } } }

  • 複数のOutputStreamでサーバ側から送信されるデータを、クライアント側で区別する方法

    こんにちわ。 データの送受信を行う場合のStreamに関して質問があります。 サーバー・クライアントプログラムを組む場合に、サーバー側から複数のOutputStreamを開き、それをクライアント側で受け取る場合は、どのようにInputStreamを開けばよいのでしょうか? また、一対のOutputStreamとInputStreamでデータの送受信を行う場合に関しても、データの内容によってプログラムを分岐したい場合などどのようにすればいいのでしょうか? 現在URLConnectionクラスを利用して、データの送受信を行うプログラムを作成しているのですが、疑問に感じたので教えて頂きたいです。

    • ベストアンサー
    • Java
  •  DataをtxtFileに書かせて、同じFileから読み込みです、エラーの意味が不明です

    JAVA初心者です、宜しくお願いします。  DataをtxtFileに書かせて、同じFileから読み込ませるコードですが、書き込みは正常に出来、(test1.txt)Fileも出来、内容もOKなのですが、同じFileからの読み込みがエラーになります。 一体どこが間違っているのでしょうか。 Fileは同じプロジェクトにおいています。(当然同一Fileからの読み込みです。) 諸兄の方々宜しくお願いします・・・正直泣いています。 public class Write_Read_070620{ public static void main(String args[]){ try{ PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("test1.txt"))); pw.println("Hello!!"); pw.println("Goodbye!!"); pw.close(); BufferedReader br0 = new BufferedReader(new FileReader("text1.txt")) ; String str0 = br0.readLine() ; System.out.println("入力データーを確認します\n" + " Team " + str0); br0.close(); } catch(IOException e){ System.out.println("入力エラ-です。\n "); } } }

    • ベストアンサー
    • Java
  • ネットワークプログラミングでの読み込みについて

    現在ネットワークプログラミングの勉強をしています。 クライアント側の標準入力で文字列入力→Enter押下→ サーバ側の標準出力でその文字列を出力 という処理を行いたいのですが、サーバ側の出力が表示されません。 まず具体的にソースを出した方が状況を説明しやすいので、提示致します。 ------------------------------- サーバ側 public static void main(String[] args)throws Exception ServerSocket ss=new ServerSocket(7777); while(true){ sock=ss.accept(); BufferedReader br=new BufferedReader(new InputStreamReader(sock.getInputStream())); String str=br.readLine(); if(str.equals("end"))break; System.out.println(str); } sock.close(); ss.close(); br.close(); } ---------------------------------- クライアント側 public static void main(String[] args)throws Exception { Socket sock=new Socket(コンピュータ名,7777); while(true){ BufferedWriter bw=new BufferedWriter(new InputStreamReader(sock.getOutputStream())); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String str=br.readLine(); bw.write(str); bw.flush(); if(str.equals("end"))break; } bw.close(); sock.close(); ---------------------------------- 自分で色々試したところバッファリングで入力された文字列を溜めたまま 吐き出していないのが原因のような気がするのですが、BufferedReader#readLineのドキュメントを見ると >1 行のテキストを読み込みます。1 行の終端は、改行 (「\n」) か、復帰 (「\r」)、または復行とそれに続く改行のどれかで認識されます。 とあるのでクライアント側のbw.write(str)の後にbw.newLine()を呼んだりstr+="\n" などを行ってみたところ、 サーバ側は最初の入力をすぐに出力し、その後のクライアントからの入力には無反応になりました。 このようになる原因と解決が分かる方居ましたら、教えてください。

    • ベストアンサー
    • Java
  • 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){ } } }

専門家に質問してみよう