先贴异常信息
java.net.SocketException: Connection reset
at 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 block
e.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();
}
}
@Override
public 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();
}
}
}
}
}
问题就出现在着,因为两者都是一直在等待对方发信息过来,再往下处理,所以两者一直处于等待状态,当客户端停止连接时,服务端便发现接收不到消息,然后报错