记录一次Socket异常:java.net.SocketException: Connection reset
生活随笔
收集整理的這篇文章主要介紹了
记录一次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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android开发:Android St
- 下一篇: 2022年中国青少年STEAM教育研究报