У меня довольно сложный проект, который сводится к простому клиенту / серверу, общающемуся через потоки объектов.
Все работает безупречно для двух последовательных соединений (я подключаюсь один раз, работаю, отключаюсь, затем снова подключаюсь, работаю и отключаюсь). Клиент подключается, делает свое дело, а затем закрывается. Сервер успешно закрывает как выходной поток объекта, так и сокет без ошибок ввода-вывода.
Когда я пытаюсь подключиться в третий раз, кажется, что соединение проходит (метод ServerSocket.accept () проходит, и ObjectOutputStream успешно создан). Однако данные не передаются. Метод inputStream.readUnshared () просто блокирует.
Я принял следующие меры предосторожности при использовании памяти:
- Когда приходит время закрыть сокеты, все запущенные потоки останавливаются, и все объекты обнуляются.
- После каждого метода writeUnshared ()
вызов ObjectOutputBuffer
промыть и сбросить.
Кто-нибудь сталкивался с подобной проблемой, или у кого-нибудь есть предложения? Боюсь, мой проект довольно большой, поэтому копирование кода проблематично.
Проект сводится к следующему:
СЕРВЕР ГЛАВНАЯ
ServerSocket serverSocket = new ServerSocket(port);
while (true) {
new WorkThread(serverSocket.accept()).start();
}
РЕЗЬБА РАБОТА (СЕРВЕР)
public void run() {
ObjectInputBuffer inputBuffer = new ObjectInputBuffer(new BufferedInputStream(socket.getInputStream()));
while (running) {
try {
Object myObject = inputBuffer.readUnshared();
// do work is not specified in this sample
doWork(myObject);
} catch (IOException e) {
running = false;
}
}
try {
inputBuffer.close();
socket.close();
} catch (Exception e) {
System.out.println("Could not close.");
}
}
КЛИЕНТ
public Client() {
Object myObject;
Socket mySocket = new Socket(address, port);
try {
ObjectOutputBuffer output = new ObjectOutputBuffer(new BufferedOutputStream(mySocket.getOutputStream()));
output.reset();
output.flush();
} catch (Exception e) {
System.out.println("Could not get an input.");
mySocket.close();
return;
}
// get object data is not specified in this sample. it simply returns a serializable object
myObject = getObjectData();
while (myObject != null) {
try {
output.writeUnshared(myObject);
output.reset();
output.flush();
} catch (Exception e) {
e.printStackTrace();
break;
} // catch
} // while
try {
output.close();
socket.close();
} catch (Exception e) {
System.out.println("Could not close.");
}
}
Спасибо всем, кто сможет помочь!