У меня есть довольно сложный проект, который сводится к простому взаимодействию клиента/сервера через потоки объектов.
Все работает без нареканий при двух последовательных подключениях (один раз подключаюсь, работаю, отключаюсь, потом снова подключаюсь, работаю и отключаюсь). Клиент подключается, занимается своими делами, а затем закрывается. Сервер успешно закрывает поток вывода объекта и сокет без ошибок ввода-вывода.
Когда я пытаюсь подключиться в третий раз, кажется, что соединение проходит (метод 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.");
}
}
Спасибо всем, кто может помочь!