Почему я получаю BindException вместе с EOFException? - PullRequest
0 голосов
/ 29 июня 2018

Итак, я создаю чат, и идея заключается в том, что серверы и клиенты являются многопоточными. Таким образом, когда клиент отправляет сообщение, оно отправляется на сервер, сервер помещает его в файл с остальной частью журнала чата, а затем каждые несколько секунд, пока клиент (во втором потоке) подключается к серверу (на второй поток) для журнала. Оттуда сервер отправляет файл, а клиент помещает его в окно сообщений. Вот схема:

Diagram

Если вы будете следовать за стрелками, надеюсь, вы это поймете. :) Во всяком случае, поэтому одна часть темы идеально, и она работает нормально. Однако, как только поток заканчивается (когда сообщение клиента находится в файле сервера), запускается второй поток, и в этот момент запускаются и плохие вещи.

Сразу же, я получаю EOFException от клиента (он не говорит, где), и я получаю BindException от сервера (что я предполагаю, так или иначе из-за ошибки на стороне клиента).

Вот код из потока 2 сервера:

System.out.println("Waiting for a client...");
// Start a server
ServerSocket server = new ServerSocket(3210);
// Listen for anyone at that port
Socket socket = server.accept();
System.out.println("A client has connected!");
// Open the output stream
DataOutputStream outputStream = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
// Get the file and convert it to a byte array
Path path = Paths.get("history.txt");
byte[] bytes = Files.readAllBytes(path);
// Send the size of the file in bytes
outputStream.writeInt(bytes.length);
// Send the file
outputStream.write(bytes);
// Close everything
socket.close();
outputStream.close();
server.close();

И код из Нити 2 клиента:

// Start socket
Socket socket = new Socket("DESKTOP-FUR3UF6", 3210);
// Get input stream
DataInputStream inputStream = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
// Get amount of bytes in file
int length = inputStream.readInt();
if (length > 0 && allMessagesTextBox.getText() != null) {
    // Get the bytes from the file and put that out to the message box
    byte[] bytes = new byte[length];
    inputStream.readFully(bytes, 0, bytes.length);
    String data = new String(bytes, "UTF-8");
    allMessagesTextBox.setMessage(data);
}
else {
    // Put this message on the message box
    allMessagesTextBox.setMessage("Connecting...");
}
// Close socket and input stream
inputStream.close();
socket.close();

И код клиента, и сервер находятся в блоках try / catch, чтобы вы знали.

Часть моей проблемы, однако, заключается в том, что я не полностью понимаю EOFException. По словам Oracle, это происходит, когда конец файла или конец потока был неожиданно достигнут во время ввода, но я не понимаю, почему это произойдет в моем коде.

Может кто-нибудь, пожалуйста, просветите меня, почему это идет не так, и как это исправить? Спасибо !!

...