Java套接字丢失数据:BufferedReader
我在java中遇到了以下问题:我正在使用java.net.Socket开发和安装应用程序。看起来是这样的:有一个服务器,它有一个接受并添加新客户机的线程,另一个线程从套接字读取数据并对其进行处理。旁边是客户。客户机有数据读取器线程和单独的线程。我发送的数据非常简单,如下所示:Java套接字丢失数据:BufferedReader,java,sockets,tcp,bufferedreader,java-io,Java,Sockets,Tcp,Bufferedreader,Java Io,我在java中遇到了以下问题:我正在使用java.net.Socket开发和安装应用程序。看起来是这样的:有一个服务器,它有一个接受并添加新客户机的线程,另一个线程从套接字读取数据并对其进行处理。旁边是客户。客户机有数据读取器线程和单独的线程。我发送的数据非常简单,如下所示: socket.getOutputStream().write((content+"\n").getBytes()); 在客户端,并在服务器上读取,如: try { BufferedReader reader =
socket.getOutputStream().write((content+"\n").getBytes());
在客户端,并在服务器上读取,如:
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String received;
while(true) {
try {
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
received = reader.readLine();
if(received == null) {
break;
}
System.out.println("SERVER " + received);
increaseReceivedCounter(1);
} catch(SocketException e) {
break;
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
System.out.println("SERVER RECEIVED "+ getReceivedCounter() + " MESSAGES!");
}
现在,我只是将客户端设置为发送一定数量的消息,如下所示:
try {
int n = 1000;
System.out.println("sending "+ n +" messages to " + client);
for(int i=0 ; i<n ; ++i) {
socket.getOutputStream().write((content+"\n").getBytes());
}
System.out.println("done sending " + n + " messages");
} catch (IOException e) {
e.printStackTrace();
}
对于服务器端的数据读取器:
socket = serverSocket.accept();
在客户机上:
socket = new Socket("127.0.0.1", Server.PORT)
这不是一个“效率问题”。这是代码中的一个bug
问题是并非所有消息都传输到服务器
否,问题是服务器上的数据正在丢失。这是因为您一直在重新创建BufferedReaders。在套接字的生命周期中,应该创建一次
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
拆下这条线
按照您的方式,每次先前的BufferedReader进行缓冲时,都会丢失数据
您还需要关闭插座。这不是“效率问题”。这是代码中的一个bug
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
问题是并非所有消息都传输到服务器
否,问题是服务器上的数据正在丢失。这是因为您一直在重新创建BufferedReaders。在套接字的生命周期中,应该创建一次
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
拆下这条线
按照您的方式,每次先前的BufferedReader进行缓冲时,都会丢失数据
您还需要关闭套接字。如何初始化套接字?另外,为什么在while循环中每次迭代都要创建一个新的阅读器?您是否在日志中看到错误?您的服务器端代码片段意味着您将以静默方式忽略任何SocketException;也许还可以正确地记录这些?我不会默默地忽略它们,因为从Eclipse开始:异常SocketException已经被替代IOException捕获,并且没有SocketException。循环中的读卡器初始化是一个错误,我删除了它,但它仍然没有改变任何东西。编辑中的套接字初始化。在服务器读取所有消息之前,在发送for循环之后,客户端可能正在以未显示的代码关闭连接?您如何知道没有SocketException?如果有人扔了一个,你会抓住它然后忽略它,对吗?尝试完全删除该catch块。如何初始化套接字?另外,为什么在while循环中每次迭代都要创建一个新的阅读器?您是否在日志中看到错误?您的服务器端代码片段意味着您将以静默方式忽略任何SocketException;也许还可以正确地记录这些?我不会默默地忽略它们,因为从Eclipse开始:异常SocketException已经被替代IOException捕获,并且没有SocketException。循环中的读卡器初始化是一个错误,我删除了它,但它仍然没有改变任何东西。编辑中的套接字初始化。在服务器读取所有消息之前,在发送for循环之后,客户端可能正在以未显示的代码关闭连接?您如何知道没有SocketException?如果有人扔了一个,你会抓住它然后忽略它,对吗?试着把那个挡块全部卸下。
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));