前提・実現したいこと
javaでユーザ入力をサーバに送るクライアントのプログラムを教えてください。クライアントのウィンドウから打ち込んだ文字がサーバに送られて、同じ文字列が送り返されるプログラムを作りたいです。
実行例:
クライアントウィンドウ
java RunTransTextClient localhost 8100 hello hello
サーバーウィンドウ
java RunEchoServer 8100 accept: localhost read: hello wrote: hello done
発生している問題・エラーメッセージ
クライアント側の斜線部に入れるプログラムがわかりません。接続まではできているのですが、文字入力するとサーバー側ウィンドウに何も表示されません。
<現在のクライアントウィンドウ>
java RunTransTextClient localhost 8100 hello
<現在のサーバーウィンドウ>
java RunEchoServer 8100 accept: localhost
実行プログラム
<クライアント側のプログラム>
import java.net.*; import java.io.*; import java.util.*; public class TransTextClient{ boolean isOK = false; String host; Socket sock; public TransTextClient(String host, int port){ try{ this.host = host; sock = new Socket(host,port); isOK = true; } catch (UnknownHostException e){ System.err.println("unknown host : " + host); } catch (NoRouteToHostException e) { System.err.println("unreachable : " + host); } catch (ConnectException e) { System.err.println("connect refused : " + host); } catch (java.io.IOException e) { e.printStackTrace(); } } public void run() { if (! isOK) System.exit(1); try{ BufferedReader is; is = new BufferedReader( new InputStreamReader(sock.getInputStream())); PrintWriter os; os = new PrintWriter(sock.getOutputStream()); Scanner sc = new Scanner(System.in); String s; while (sc.hasNextLine()){ //標準入力から1行読み込む //改行コードを加えてサーバーに送り出す //サーバーから1行読み込む //標準出力に書く } sock.close(); } catch (java.io.IOException e) { e.printStackTrace(); } } }
public class RunTransTextClient { public static void main(String[] args) { String host = "localhost"; int port = 8888; if (args.length > 0) host = args[0]; if (args.length > 1) port = Integer.parseInt(args[1]); TransTextClient cli = new TransTextClient(host,port); cli.run(); } }
<サーバー側>
import java.net.*; import java.io.*; public class EchoServer{ ServerSocket servSock; public EchoServer (int port) { try { servSock = new ServerSocket(port);// 接続を受け付けるソケット } catch (IOException e) { e.printStackTrace();//エラーが起きたら停止する。 System.exit(1); } } public void run() { Socket sock = null; BufferedReader is = null; PrintWriter os = null; while (true) { try { sock = servSock.accept();//新しい接続を受け付けたら System.out.println("accept: "+sock.getInetAddress().getHostName()); is = new BufferedReader (new InputStreamReader(sock.getInputStream ())); os = new PrintWriter(sock.getOutputStream()); String s = null; while ((s= is.readLine())!=null){ //クライアントから読んで System.out.println("read: "+s); os.print(s+"¥r¥n");//そのままクライアントに送り返す os.flush();//確実に送り出す System.out.println("wrote:"+s); } System.out.println("done"); }catch (IOException e) { e.printStackTrace(); // System.exit(1); }finally { try{ if (is != null) is.close(); if (os != null) os.close(); if (sock != null) sock.close(); } catch (IOException e){ System.err.println(" Io Error in close"); } } } } }
public class RunEchoServer { public static void main(String[] args) { int port=8888; if (args.length >0) port = Integer.parseInt(args[0]); EchoServer serv = new EchoServer (port); serv.run(); } }
試したこと
問題である斜線部に以下のようなコードを入れた。
s = is.readLine(); System.out.println("read:"+s); os.print(s+"\r\n"); os.flush(); System.out.println("wrote:"+s);