我在java中遇到以下问题:我正在使用java.net.Socket
进行开发和应用。它看起来像:有一个服务器有一个接受和添加新客户端的线程,另一个线程从套接字读取数据并做了什么"用它。旁边有客户。客户端具有数据读取器线程以及单独的线程。我发送的数据简单如下:
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
初始化:
serverSocket = new ServerSocket(Server.PORT);//PORT = 9876, whatever
用于服务器端的数据阅读器:
socket = serverSocket.accept();
在客户端:
socket = new Socket("127.0.0.1", Server.PORT)
答案 0 :(得分:4)
<&#39;效率问题&#39;。这是您代码中的错误。
问题是并非所有消息都传输到服务器。
不,问题是您在服务器上丢失了数据。这是因为您不断重新创建BufferedReaders
。您应该在套接字的生命周期内创建一次。
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
删除此行。
你拥有它的方式,每次前一个BufferedReader
有错误,你就会丢失数据。
您还需要关闭套接字。