Я пытаюсь создать одноранговые узлы, которые связаны друг с другом и могут отправлять / получать сообщения всем, к кому они подключены одновременно. Все они работают на одной машине. После подключения к одноранговому узлу и получения подключения к сокету, я запускаю два потока: один читает, а другой пишет. Однако readLine()
блокируется бесконечно, и я не уверен, где проблема существует. Узлы успешно соединяются друг с другом, но обмен сообщениями не удается. Прерывание одного узла приводит к тому, что сообщение "null"
читается от других подключенных к нему узлов.
РЕДАКТИРОВАТЬ : Использование autoflush = true
в PrintWriter
создает исключение "ConnectionReset"
для других узлов, подключенных к прерванному узлу.
Я пытался дождаться начала потока чтения перед отправкой сообщения, получить соединение с сокетом с любого конца одноранговых узлов, сохранить потоки ввода / вывода в списках, хранящихся как переменные-члены, а также просто передать только сокет / все потоки к каждому потоку. Также пробовал разные способы чтения, показанные в комментариях в теме чтения.
class ConnectionListener extends Thread{
public void run(){
try {
while (!allPeersJoined()) {
Socket socket = null;
socket = peerServer.accept();
new PeerReader(socket).start();
new PeerWriter(socket).start();
}
}catch (IOException e){
e.printStackTrace();
}
}
}
}
class PeerWriter extends Thread{
PrintWriter writer;
public PeerWriter(Socket socket){
try {
this.writer = new PrintWriter(socket.getOutputStream(), true);
}catch (IOException e){
e.printStackTrace();
}
}
@Override
public void run() {
writer.println("Hello");
}
}
class PeerReader extends Thread{
BufferedReader reader;
public PeerReader(Socket socket){
try {
this.reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}catch (IOException e){
e.printStackTrace();
}
}
@Override
public void run() {
String input = "";
System.out.println("Waiting to receive messages...");
try {
System.out.println(reader.readLine());
// while((input = reader.readLine()) != null){
// System.out.println(input);
// }
}catch (IOException e){
e.printStackTrace();
}
}
}
РЕДАКТИРОВАТЬ : добавление создания сокетов
Thread t = new ConnectionListener();
t.start();
// Connect to all peers
for (String peer : peers) {
new Socket("127.0.0.1", Integer.valueOf(peer));
}