杨勤_cd
2018-09-25 15:04
看评论很多都说了这个问题,但是我的情况完全不一样(写得和他们的代码一样还是会报错)
经过调试发现,需要修改两个地方:
1.当服务器响应客户端时,需要在响应信息输完后加入 socket.shutdownOutput(),代表这个响应内容已经输完了,这时才会发送给客户端读取这个响应
2.这样调试下来运行不再报错,但是直接运行依然报错,这是因为客户端还没有来得及读取,服务器相关关闭代码就已经开始运行了,从而报错,所以需要在关闭前加个等待时间。
我的代码如下:
服务端:
package com.socket.socketsender.socketTest; import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) { try { ServerSocket serverSocket = new ServerSocket(8888); System.out.println("=======服务器已启动,开始监听========="); Socket accept = serverSocket.accept(); InputStream inputStream = accept.getInputStream(); InputStreamReader isr = new InputStreamReader(inputStream); BufferedReader br = new BufferedReader(isr); String str = null; while ((str = br.readLine()) != null) { System.out.println("我是服务器,从客户端收到消息:" + str); } accept.shutdownInput(); //响应给客户端 OutputStream outputStream = accept.getOutputStream(); PrintWriter pw = new PrintWriter(outputStream); pw.write("你很帅气啊"); pw.flush(); accept.shutdownOutput();//如果不加这个,客户端一直收不到响应,直到服务端关闭了,客户端就报错了。 try { //如果不设置等待时间,服务端已经关闭了,客户端还没有来得及读取这个响应,从而报错 System.out.println("先不要关闭"); Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } pw.close();//开始关闭相关资源,如果前面不加shutdownOutput/等待时间,则从此处开始报错 outputStream.close(); br.close(); isr.close(); inputStream.close(); accept.close(); serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } }
客户端:
package com.socket.socketsender.socketTest; import java.io.*; import java.net.Socket; import java.net.UnknownHostException; public class Client { public static void main(String[] args) { try { Socket socket = new Socket("localhost", 8888); OutputStream outputStream = socket.getOutputStream(); PrintWriter ps = new PrintWriter(outputStream); ps.write("用户名:小羊,职位:测试工程师"); ps.flush(); socket.shutdownOutput(); InputStream inputStream = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(inputStream)); String str = null; while ((str = br.readLine()) != null) { System.out.println("服务器给出的响应是:" + str); } br.close(); inputStream.close(); ps.close(); outputStream.close(); socket.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
虽然这样能解决问题,但是感觉还是很low,有没有什么更加好的办法,
可以保证客户端读到响应后服务端才关闭?
或者就让服务端一直开启?---我试过把服务端所有资源关闭语句注释掉,但客户端每发送一次数据,服务端还是会关闭
try { //如果不设置等待时间,服务端已经关闭了,客户端还没有来得及读取这个响应,从而报错 System.out.println("先不要关闭"); Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); }
我将你的代码中这个去掉,客户端是可以接收到服务端信息的.
Java Socket应用---通信是这样练成的
125006 学习 · 596 问题
相似问题