ソケット java.net.SocketException: 接続リセットエラーの原因と対処法
2022-02-22 14:31:21
内容
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();
}
}
関連
-
スレッド "main "での例外 java.util.NoSuchElementException in Java 問題解決済み
-
Eclipse の問題 アクセス制限。タイプ 'jfxrt' はAPI解決されていません。
-
executeQuery()でデータ操作文が発行できない。解決方法
-
StringBuilderが投げるArrayIndexOutOfBoundsExceptionの探索
-
SocketException java.netの4つの例外解決策。
-
java.sql.SQLException: 結果セットの開始前
-
ジャバアレイ
-
FindBugの使用概要
-
java send https request prompt java.security.cert.について。
-
git pull appears現在のブランチに対するトラッキング情報がありません。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
SLF4J: クラス・パスに複数のSLF4Jバインディングが含まれています。
-
ApplicationContextの起動エラーです。条件レポートを表示するには、アプリケーションを'de'で再実行します。
-
強制型変換について
-
無効なメソッド宣言
-
Server Tomcat v9.0 Server at localhost の起動に失敗しました。
-
Javaがエラーで実行される、選択が起動できない、最近起動したものがない
-
ecplise プロンプトが表示されます。"選択したものは起動できません。" "最近の起動はありません。"
-
Java JDKのダイナミックプロキシ(AOP)の使用と実装の原理分析
-
コレクション - PriorityQueueソースコード解析
-
MySQLIntegrityConstraintViolationException、解決方法