Java 套接字丢失数据:BufferedReader
Java sockets losing data: BufferedReader
我在 java 中遇到以下问题:我正在使用 java.net.Socket
开发应用程序。它看起来是这样的:有一个服务器有一个线程接受并添加新的客户端,另一个线程从套接字读取数据并用它做"something"。旁边是客户。客户端有数据 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();
}
问题是并非所有邮件都被传输到服务器。我一直在为此寻找一些解决方案,但未能达到 100% 的可靠性。有可能吗?我也尝试使用 read
而不是 readLine
但结果是一样的:有时甚至会丢失 90% 的数据。我认为当服务器正在处理接收到的数据时,它会忽略传入的数据包并且它们只是丢失了。
编辑
Socket
s 初始化:
serverSocket = new ServerSocket(Server.PORT);//PORT = 9876, whatever
对于服务器端的数据reader:
socket = serverSocket.accept();
在客户端上:
socket = new Socket("127.0.0.1", Server.PORT)
这是而不是 'efficiency issue'。这是您代码中的错误。
The problem is that not all of the messages are transferred to a server.
不,问题是您在 服务器上丢失了数据。这是因为您一直在重新创建 BufferedReaders
。您应该在套接字的生命周期内创建一次。
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
删除此行。
你拥有它的方式,每次先前的 BufferedReader
有,错误,缓冲时你都会丢失数据。
您还需要关闭套接字。
我在 java 中遇到以下问题:我正在使用 java.net.Socket
开发应用程序。它看起来是这样的:有一个服务器有一个线程接受并添加新的客户端,另一个线程从套接字读取数据并用它做"something"。旁边是客户。客户端有数据 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();
}
问题是并非所有邮件都被传输到服务器。我一直在为此寻找一些解决方案,但未能达到 100% 的可靠性。有可能吗?我也尝试使用 read
而不是 readLine
但结果是一样的:有时甚至会丢失 90% 的数据。我认为当服务器正在处理接收到的数据时,它会忽略传入的数据包并且它们只是丢失了。
编辑
Socket
s 初始化:
serverSocket = new ServerSocket(Server.PORT);//PORT = 9876, whatever
对于服务器端的数据reader:
socket = serverSocket.accept();
在客户端上:
socket = new Socket("127.0.0.1", Server.PORT)
这是而不是 'efficiency issue'。这是您代码中的错误。
The problem is that not all of the messages are transferred to a server.
不,问题是您在 服务器上丢失了数据。这是因为您一直在重新创建 BufferedReaders
。您应该在套接字的生命周期内创建一次。
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
删除此行。
你拥有它的方式,每次先前的 BufferedReader
有,错误,缓冲时你都会丢失数据。
您还需要关闭套接字。