Я пишу сеть распространения контента в Java. У меня есть класс Link для управления сокетами между двумя узлами в системе. Есть две программы, RouterNode и DiscoveryNode.
Когда запускается узел маршрутизатора, в первую очередь он пытается инициализировать соединение с узлом обнаружения:
public RouterNode(int num)
{
myNumber = num;
input = new Scanner(System.in);
try {
discoveryServer = new Socket("MONDAY-PC", 60111);
myServerLink = new Link(this, discoveryServer);
} catch (IOException e) {
System.out.println("Socket could not be opened. Node terminating.");
System.exit(-1);
}
В конструкторе есть что-то еще, но моя проблема не позволяет моей программе пройти этот блок try.
Конструктор класса ссылки (вызывается в строке 'myServerLink = new Link (this, discoveryServer);) выглядит так:
public Link(Node n, Socket s)
{
parentNode = n;
regSocket = s;
try {
out = new DataOutputStream(regSocket.getOutputStream());
in = new DataInputStream(regSocket.getInputStream());
} catch (IOException e) {
System.out.println("Data Streams could not be created on the link.");
e.printStackTrace();
}
new Thread(new LinkListenerThread(this, in)).run();
}
где последняя строка этого конструктора запускает новый поток, предназначенный для прослушивания в сокете входящих сообщений, которые передаются.
Метод run () в LinkListenerThread помечается следующим образом:
@Override
public void run()
{
byte[] message;
System.out.println("Link now active and running.");
while(!done)
{
System.out.println("attempting to read from socket...");
try {
// read now many bytes the following message will be
byte[] messageLengthBytes = new byte[4];
in.read(messageLengthBytes, 0, 4);
Моя проблема в том, что, когда я создаю экземпляр ссылки с узла маршрутизатора, его выполнение останавливается из-за того, что LinkListenerThread блокирует при вызове in.read (). Этот слушатель работает в отдельном потоке, поэтому я не уверен, является ли это чем-то странным с потоками, или это просто пример моего отсутствия опыта работы с ними.
У меня есть другой экземпляр в моей программе, где я читаю в отдельном потоке
Может ли это быть вызвано тем, что классы узлов явно не реализуют runnable и поэтому не находятся в своих собственных потоках?
Любая помощь очень ценится.
Редактировать 1: я заставил классы Node реализовать Runnable и запускать их в своих собственных потоках, но он по-прежнему блокируется при вызове in.read ();