1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > java学习网络编程遇到异常java.net.SocketException:Software caused connection abort: socket write error

java学习网络编程遇到异常java.net.SocketException:Software caused connection abort: socket write error

时间:2018-11-18 11:17:26

相关推荐

java学习网络编程遇到异常java.net.SocketException:Software caused connection abort: socket write error

在模拟客户端和服务器之间通信时出现.SocketException:Software caused connection abort: socket write error

.SocketException: Software caused connection abort: socket write errorat java.base/.SocketOutputStream.socketWrite0(Native Method)at java.base/.SocketOutputStream.socketWrite(SocketOutputStream.java:110)at java.base/.SocketOutputStream.write(SocketOutputStream.java:150)at java.base/java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1883)at java.base/java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOutputStream.java:1792)at java.base/java.io.ObjectOutputStream.writeNonProxyDesc(ObjectOutputStream.java:1287)at java.base/java.io.ObjectOutputStream.writeClassDesc(ObjectOutputStream.java:1232)at java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1428)at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1179)at java.base/java.io.ObjectOutputStream.writeFatalException(ObjectOutputStream.java:1583)at java.base/java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:352)at .Server.handlerRequest(Server.java:67)at .Server.lambda$start$0(Server.java:35)at java.base/java.lang.Thread.run(Thread.java:834)

我出现的情形是当服务器对资源进行释放时客户端还处于连接中,当客户端再次请求时就会出现Software caused connection abort: socket write errorSocket closed的异常,当客户端进行释放资源时服务器也会出现同样的错误

客户端(client):

public void start(){OutputStream os;ObjectOutputStream oos = null;InputStream is;ObjectInputStream ois = null;try {do {client=new Socket("127.0.0.1",PROT);os=client.getOutputStream();oos=new ObjectOutputStream(os);is=client.getInputStream();ois=new ObjectInputStream(is);System.out.println("客户端连接服务器成功");} while (view.startMenu(ois,oos)!=0);} catch (IOException e) {e.printStackTrace();} finally {try {if (ois != null)ois.close();if (oos != null)oos.close();if (client != null)client.close();} catch (IOException e) {e.printStackTrace();}}}

服务器(Server):

public void start(){try {serverSocket=new ServerSocket(PROT);System.out.println("服务器已就绪!目前端口为:"+PROT);while (true){//等待客户端连接Socket socket=serverSocket.accept();System.out.println(socket.hashCode()+"客户端为您服务!");//每个客户端进行开辟单独的线程服务new Thread(() -> {//处理客户端请求handlerRequest(socket);}).start();}} catch (IOException e) {e.printStackTrace();}}private void handlerRequest(Socket socket){InputStream is;ObjectInputStream ois = null;OutputStream os;ObjectOutputStream oos = null;try {is=socket.getInputStream();ois=new ObjectInputStream(is);os=socket.getOutputStream();oos=new ObjectOutputStream(os);//客户端发的请求类型String flag= ois.readUTF();System.out.println("客户端请求类型:"+flag+",当前使用线程为:"+Thread.currentThread().getName());do {if ("findAll".equals(flag)) {Express allExpress = ed.findAllExpress();if (allExpress!=null)oos.writeObject(allExpress);elseoos.writeObject("快递柜中暂无快递!");}} while (true);} catch (IOException e) {e.printStackTrace();//System.out.println(e.getMessage());} finally {try {if (ois != null)ois.close();if (oos != null)oos.close();} catch (IOException e) {e.printStackTrace();}}}

造成问题是因为在循环中一边先结束了关闭了资源

解决方法:

因为服务器需要一直运行,所以对客户端进行判断,如果连接为空或者连接被关闭进行重新连接或者在服务器中对请求方法进行死循环让本次请求在线程未结束前不关闭释放资源

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。