日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

记录一次Socket异常:java.net.SocketException: Connection reset

發布時間:2025/3/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 记录一次Socket异常:java.net.SocketException: Connection reset 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

先貼異常信息

java.net.SocketException: Connection resetat java.net.SocketInputStream.read(SocketInputStream.java:210)at java.net.SocketInputStream.read(SocketInputStream.java:141)at java.net.SocketInputStream.read(SocketInputStream.java:127)at cn.com.fujielectric.tasks.ListeningSocketServer$ServerThread.run(ListeningSocketServer.java:58)

網上對于這個Connection reset異常的解決方案是:

該異常發生在客戶端進行 new Socket(ip, port)操作時,該異常發生的原因是或者具有ip地址的機器不能找到(也就是說從當前機器不存在到指定ip路由),或者是該ip存在,但找不到指定的端口進行監聽。出現該問題,首先檢查客戶端的ip和port是否寫錯了,如果正確則從客戶端ping一下服務器看是否能ping通,如果能ping通(服務服務器端把ping禁掉則需要另外的辦法),則看在服務器端的監聽指定端口的程序是否啟動

我這里出現的異常是在服務端啟動時,客戶端關閉連接則報以上異常。

原因如下:因為我客戶端業務邏輯是先獲取服務端發送過來的消息,然后才發送響應信息前往服務端。具體代碼如下

public class TCPClien {public static void main(String[] args) {Socket socket=null;try {//對服務端發起連接請求socket=new Socket("localhost", 8080);//接受服務端消息并打印InputStream is=socket.getInputStream();byte b[]=new byte[1024];is.read(b);System.out.println(new String(b));//給服務端發送響應信息OutputStream os=socket.getOutputStream();os.write("I am client".getBytes());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}} }

服務端的業務邏輯也是先獲取客戶端發過來的消息,然后再響應給客戶端,這里我用主線程監聽端口,子線程會話處理

public class ListeningSocketServer {public ListeningSocketServer(int port) {ServerSocket serverSocket = null;Socket socket = null;try {serverSocket = new ServerSocket(port);while (true) {// 監聽一端口,等待客戶接入socket = serverSocket.accept();// 將會話交給線程處理new ServerThread(socket).start();}} catch (IOException e) {e.printStackTrace();} finally {try {serverSocket.close();} catch (Exception e) {e.printStackTrace();}}}class ServerThread extends Thread {private Socket socket;private OutputStream os;private InputStream is;public ServerThread(Socket s) {this.socket = s;try {os = socket.getOutputStream();is = socket.getInputStream();} catch (Exception e) {e.printStackTrace();}}@Overridepublic void run() {try {// 通過輸入流接收客戶端信息byte[] b = new byte[1024];is.read(b);String line = new String(b);System.out.println("Received message: " + line);// 通過輸出流向客戶端發送信息os.write("I am server".getBytes());} catch (IOException e) {e.printStackTrace();} finally {try {socket.close();} catch (IOException e) {e.printStackTrace();}}}} }

問題就出現在著,因為兩者都是一直在等待對方發信息過來,再往下處理,所以兩者一直處于等待狀態,當客戶端停止連接時,服務端便發現接收不到消息,然后報錯

?

總結

以上是生活随笔為你收集整理的记录一次Socket异常:java.net.SocketException: Connection reset的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。