前提・実現したいこと
javaを使ってソケット通信を用いたプログラムを書いています。クライアントとサーバ間の通信において、単なる文字列の受け渡しだけでなく文字列の配列の受け渡しを実現したいです。
発生している問題・エラーメッセージ
以下に示す、クライアントが送信した文字列をそのままサーバが返すプログラムを実行したところ、ObjectInputStreamクラスのインスタンスを作成するところでプログラムがそれ以上実行されなくなりました。(中断されたわけではありません)
上記の現象の後、サーバ側でプログラムを中断したところJabberClient側には以下のメッセージが表示されました。
Exception in thread "main" java.net.SocketException: Connection reset at java.base/java.net.SocketInputStream.read(Unknown Source) at java.base/java.net.SocketInputStream.read(Unknown Source) at java.base/java.io.ObjectInputStream$PeekInputStream.read(Unknown Source) at java.base/java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source) at java.base/java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source) at java.base/java.io.ObjectInputStream.readStreamHeader(Unknown Source) at java.base/java.io.ObjectInputStream.<init>(Unknown Source) at JabberClient.main(JabberClient.java:13)
該当のソースコード
JabberClient.java
1import java.io.*; 2import java.net.*; 3 4public class JabberClient{ 5 6 public static void main(String[] args) throws IOException{ 7 InetAddress addr = InetAddress.getByName("hostname"); 8 System.out.println("addr = " + addr); 9 Socket socket = new Socket(addr, 8080); 10 try{ 11 System.out.println("socket = " + socket); 12 BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 13 ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); //13行目。この一行が実行されないままプログラムの実行状態が続く 14 PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 15 16 for(int i = 0; i < 10; i++){ 17 out.println("howdy " + i); 18 String str = in.readLine(); 19 System.out.println(str); 20 } 21 out.println("END"); 22 23 } 24 finally{ 25 System.out.println("closing..."); 26 socket.close(); 27 } 28 } 29}
JabberServer.java
1import java.io.*; 2import java.net.*; 3 4public class JabberServer{ 5 public static int PORT; 6 7 public static void main(String[] args) throws IOException{ 8 PORT = Integer.parseInt(args[0]); 9 ServerSocket s = new ServerSocket(PORT); 10 System.out.println("Started: " + s); 11 try{ 12 Socket socket = s.accept(); 13 try{ 14 System.out.println("Connection accepted:" + socket); 15 BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 16 17 PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 18 19 while(true){ 20 String str = in.readLine(); 21 if(str.equals("END")) break; 22 System.out.println("Echoing : "); 23 out.println(str); 24 } 25 26 } 27 finally{ 28 System.out.println("closing..."); 29 socket.close(); 30 } 31 } 32 finally{ 33 s.close(); 34 } 35 } 36} 37
試したこと
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());を
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());に書き換えたところ、
意図せぬ文字列がサーバから返ってきました。これをもとにgetInputStreamやgetOutputStreamを複数回呼び出すことで何か不都合が生じているのかとあたりを付けて調べてみましたが、参考になりそうな文献を発見できませんでした。
補足情報(FW/ツールのバージョンなど)
上記の置換を行った際の実行結果
addr = DESKTOP-V3E0T82/192.168.56.1 socket = Socket[addr=DESKTOP-V3E0T82/192.168.56.1,port=8080,localport=56731] ャ? howdy 0 howdy 1 howdy 2 howdy 3 howdy 4 howdy 5 howdy 6 howdy 7 howdy 8 howdy 9 closing...
13行目全体をコメントアウトした際の実行結果(ObjectInputStream,ObjectOutputStreamクラスのインスタンスを生成しなかった場合)
addr = DESKTOP-V3E0T82/192.168.56.1 socket = Socket[addr=DESKTOP-V3E0T82/192.168.56.1,port=8080,localport=56727] howdy 0 howdy 1 howdy 2 howdy 3 howdy 4 howdy 5 howdy 6 howdy 7 howdy 8 howdy 9 closing...

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。