Ах, прости. Я случайно удалил комментирование из кода. Это на самом деле так:
public void SendMsg(String dest, Message myMsg) {
Socket sendsock = 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
}
}
printrw объявляется и сохраняется вне функции, поэтому после его настройки нет необходимости в sendsock или в повторной инициализации printrw. В настоящем приложении я сохраняю PrintWriter для каждого соединения в HashMap и извлекаю его в начале функции SendMsg (...).
Поскольку соединения постоянны, каждый раз, когда один из них принимается, новый поток - это ланч, который запускает цикл while, чтобы непрерывно проверять его на наличие данных. Эти потоки и соединения закрываются только после завершения работы приложения. В дополнение к моему предыдущему вопросу, есть ли более эффективный способ сделать это?
Ранее я реализовал этот код без "\ n" и использовал вместо него println (...), и у меня все еще оставалась проблема с получением некоторых сообщений, поэтому я не уверен, что является причиной проблемы , Сообщения отправляются так:
public class SendPortal2 implements Runnable {
String dest = null;
SendPortal2 (String dest) {
this.dest = dest;
}
public void run() {
for(int i=1; i<1000; i+=2) {
Message myMsg = new Message("Message", Main.myaddy + " " + String.valueOf(i));
Main.myCommMgr.SendMsg(dest, myMsg);
}
}
}
Работают два таких потока. Когда я только что снова запустил код, одна сторона получила 999 пакетов, а другая - только 500, что заставило меня поверить, что иногда данные из целого потока могут быть заблокированы. Это вероятно?
Спасибо за ответы!