1. ホーム
  2. Java

ソケット java.net.SocketException: 接続リセットエラーの原因と対処法

2022-02-22 14:31:21

内容

I. エラーコード

       1.1 ソケットクライアントコード

       1.2 ソケットサーバーのコード

II.エラーの原因

III.解決策


I. エラーコード

       1.1 ソケットクライアントコード

public class Client2 {
	public static void main(String[] args) {
		try {
			Socket socket = new Socket("localhost", 80);   
			// Get the socket output stream -- send data to the server
    		OutputStream out = socket.getOutputStream();
			String str = "Hello server! I am the client. ";
			out.write(str.getBytes());
		} catch (UnknownHostException e) {
			System.err.println("Host does not exist");
		} catch (IOException e) {
			System.err.println("I/O operation error");
		}
	}
}

       1.2 ソケットサーバーのコード

public class Server2 {
	public static void main(String[] args) throws IOException {
		ServerSocket serverSocket = new ServerSocket(80);
		serverSocket.setSoTimeout(10*1000);
		Socket socket = serverSocket.accept();
		// Get the socket input stream -- receive data from the client
		InputStream in = socket.getInputStream();
		int len = 0 ;
		byte[] bys = new byte[1024];
		while ((len = in.read(bys)) ! = -1) {
		    System.out.println(new String(bys,0,len));
		}
	}
}

次に、エラーの原因について

       1). 一方の端のソケットが(能動的に、または例外の終了によって)閉じられ、もう一方の端がまだデータを送信している場合、最初に送られたパケットはこの例外を発生させます(相手によって接続がリセットされます)。

       2). 一方の端が終了するが、終了時に接続が閉じられておらず、他方の端が接続からデータを読み出している場合、例外(Connection reset)を投げる。簡単に言うと、接続が切れた後の読み書きの操作で発生します。

III. 解決方法

       入出力ストリームとソケットリンクを直接閉じる

       3.1 ソケットクライアントコード

public class Client2 {
	public static void main(String[] args) {
		try {
			Socket socket = new Socket("localhost", 80);   
			// Get the socket output stream -- send data to the server
			OutputStream out = socket.getOutputStream();
			String str = "Hello server! I am the client. ";
			out.write(str.getBytes());
			// Close the connection
			out.close();
			socket.close();
		} catch (UnknownHostException e) {
			System.err.println("Host does not exist");
		} catch (IOException e) {
			System.err.println("I/O operation error");
		}
	}
}

       3.2 ソケットサーバーのコード

public class Server2 {
	public static void main(String[] args) throws IOException {
		ServerSocket serverSocket = new ServerSocket(80);
		serverSocket.setSoTimeout(10*1000);
		Socket socket = serverSocket.accept();
		// Get the socket input stream -- receive data from the client
		InputStream in = socket.getInputStream();
		int len = 0 ;
		byte[] bys = new byte[1024];
		while ((len = in.read(bys)) ! = -1) {
		    System.out.println(new String(bys,0,len));
		}
		// Close the connection
		in.close();
		socket.close();
	}
}