java - 在客户端服务器套接字程序中,客户端套接字未读取输入流时获取套接字异常
问题描述
在下面的客户端-服务器套接字程序中,客户端正在向正在侦听端口 3500 的服务器发送数据,但这里服务器没有将任何数据发送回客户端,所以在客户端套接字程序中,我不读取然后输入流然后得到套接字异常,套接字写入错误。以下是服务器代码:
private static ServerSocket sc = null;
private static final int port = 3500;
public static void main(String args[]) throws IOException{
try {
sc = new ServerSocket(port);
while(true){
Socket socket = sc.accept();
System.out.println("Listening on port <=> "+port);
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
String message = (String) ois.readObject();
System.out.println("Received Request <=>"+message);
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject("Hi Client received your message<=>"+message);
ois.close();
oos.close();
socket.close();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
客户端套接字代码如下:
try {
ObjectOutputStream oos = null;
ObjectInputStream ois = null;
Socket clientsocket = null;
for(int i=0;i<2;i++){
clientsocket = new Socket(InetAddress.getLocalHost().getHostName(), 3500);
oos = new ObjectOutputStream(clientsocket.getOutputStream());
oos.writeObject("Client Request: "+i);
//ois = new ObjectInputStream(clientsocket.getInputStream());
//String message = (String) ois.readObject();
//System.out.println("Message sent by Server: " + message);
//ois.close();
oos.close();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
在上面的代码中,如果注释被删除,那么代码工作正常,但混淆了为什么在没有数据要读取的情况下应该读取输入流。
如上所述注释输入流部分后出现异常。
Listening on port <=> 3500
Received Request <=>Client Request: 0
java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at java.io.ObjectOutputStream$BlockDataOutputStream.drain(Unknown Source)
at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(Unknown Source)
at java.io.ObjectOutputStream.writeNonProxyDesc(Unknown Source)
at java.io.ObjectOutputStream.writeClassDesc(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeFatalException(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at com.springexercise.demo.ServerTest.main(ServerTest.java:28)
解决方案
该错误是因为您在服务器有机会将数据写入流之前关闭了客户端的连接。
如果您删除
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject("Hi Client received your message<=>"+message);
....
oos.close();
部分错误应该得到解决,因为服务器不再尝试在关闭的连接上写入。
如果您让客户端读取代码中的部分,则整个过程都会起作用,因为客户端在连接中等待新数据。这会导致当服务器尝试写入时连接仍处于打开状态并且一切都按 Java 站点的预期工作。
推荐阅读
- java - 为什么我的视图在重新加载时会改变颜色?
- testing - @QuarkusTest 单元测试需要很长时间
- javascript - 如何将文档集合添加到firebase中新创建的文档中?
- java - InjectMock 不适用于 Quarkus 中 ApplicationScoped Bean 的 RestClient
- angular - 如何在角度组件中获取文档对象
- java - Mailchimp.execute 引发协议版本错误
- rest - 邮递员 OAuth 令牌请求有时会失败,有时会成功
- c# - 如果自定义控件的 Dependency Property 为 true,则执行按钮命令
- r - R spinplot:如何选择连续变量的中断?
- computer-vision - 将 Yolo 数据集转换为 caffe LMDB 进行 ssd 训练