Я написал простое приложение на Java, где есть два узла, каждый из которых имеет ServerSocket, открытый для порта, который прослушивает входящие соединения. Узлы выполняют по два потока каждый, отправляя 1000 сообщений на другой узел через постоянный TCP-сокет, созданный при отправке первого сообщения. Однако узлы не получают все 1000 сообщений. Один может получить 850, а другой - только 650. Это число имеет тенденцию оставаться постоянным в течение нескольких прогонов.Java: несколько потоков против сокетов
Передающий код выглядит следующим образом: кажется
public void SendMsg(String dest, Message myMsg) {
Socket sendsock = null;
PrintWriter printwr = null;
try {
if(printwr == null) {
sendsock = new Socket(dest, Main.rcvport);
printwr = new PrintWriter(sendsock.getOutputStream(), true);
}
String msgtosend = myMsg.msgtype.toString() + "=" + Main.myaddy + "=" + myMsg.content + "\n";
printwr.print(msgtosend);
} catch (UnknownHostException ex) {
System.out.println(ex);
//DO: Terminate or restart
} catch (IOException ex) {
System.out.println(ex);
//DO: Terminate or restart
}
}
Performance улучшить, если я использую buffwr = новый BufferedWriter (printwr) , а также и использовать buffwr.write (...) вместо printwr.print (...), хотя это, похоже, не является полным решением для потери данных. Нет никаких исключений, чтобы показать, что пакеты не были доставлены, поэтому, согласно отправителю, все они были отправлены успешно.
На приемном конце, принятое соединение обрабатывают следующим образом:
BufferedReader inbuff = new BufferedReader(new InputStreamReader(incoming.getInputStream()));
while(running) {
String rcvedln = inbuff.readLine();
if(rcvedln != null) {
count++;
System.out.println(count);
}
}
Есть ли проблема с тем, как читатели и писатели были использованы, которые могут быть причиной проблемы? Благодарю.
+1, Возможно, сообщения не очищаются на стороне отправителя. printwr.flush(); – akarnokd
Ну, так как я держу сокет открытым на время отправки, я сохраняю PrintWriter в printwr, поэтому каждый раз, когда вызывается SendMsg (...), он просто использует один и тот же PrintWriter снова и снова, не закрывая его. Он должен автоматически очищаться, так как для флага установлено значение true. – 2009-07-09 14:11:36
Код выглядит как экземпляр нового Socket и PrintWriter каждый раз, когда вызывается SendMsg(), и ни одна из них не закрывается по завершении метода. – Andrew