Я думаю, что Крис сказал, что PrintWriter является потокобезопасным, но два потока в одном потоке не являются значимо поточно-ориентированными. Поэтому используйте один.
у меня есть две темы.
Поток один управляет клиентскими подключениями. (Есть только один клиент и один сервер)
Я называю это моей серверной веткой.
Поток два управляет отправкой сообщений клиенту. Я называю это моей веткой обработчика сообщений.
Нить один ответственен, помимо прочего, периодически отправляя сердцебиение клиенту.
При программировании я исходил из того, что сокеты не безопасны для потоков, но буферы были безопасны, и пока я использовал отдельные буферы для потоков сервера и процессора, я был бы в порядке.
Я также сделал предположение, что «PrintWriter» был аналогом буфера сокетов в Java.
Под этими предположениями я написал эту функцию, чтобы послать сердцебиение:
public void sendHeartBeat(){
logger.info("Sending a hearbeat!");
PrintWriter printWriter=null;
try {
printWriter = new PrintWriter(clientSocket.getOutputStream());
} catch (IOException e) {
logger.info(e.toString());
}
if(printWriter!=null){
printWriter.print("HEARTBEAT#");
printWriter.flush();
}
}
Другой поток, «процессор», делает нечто похожее на то, что он делает:
printWriter=new PrintWriter(theServer.getClientSocket().getOutputStream());
Таким образом, я бы создавал новый «буфер» каждый раз, когда хотел отправить сердцебиение, и мои сообщения никогда не перезаписывались.
К сожалению, это не так. И я получаю сообщение, поступающее через канал, как это: dsgdsbHEARTBEAT # sdg
Это вызывает дамп ядра позже.
Вот мои вопросы:
1) Разъемы, очевидно, не являются поточно-ориентированными, но являются ли PrintWriters, которые я получаю из них, поточно-безопасными? Или это просто возвращает тот же PrintWriter?
2) Что аналогично буферу сокетов в Java? Как я должен думать об этой проблеме?
3) Как мне сделать так, чтобы эти потоки не записывали в один и тот же буфер на сокете?