Я пытаюсь создать образец TCP Forwarder. Вот краткая функциональность:
- Сервер пересылки будет прослушивать данный порт.
- Содержит карту клиентов на серверы
- Клиенты будут подключаться к серверу пересылки, а сервер пересылки будет искать карту и создавать двухстороннее соединение переадресации.
- Для этого создается два потока для каждого клиента.
- Поток 1: чтение с клиента и запись на целевой сервер
- Поток 2: чтение с целевого сервера и запись клиенту.
Все это написано на C.
Серверы Client и Target могут быть написаны на любом языке, прямо сейчас на Java.
Когда я запускаю клиент в первый раз, он работает как положено. Однако, если я убью клиента и перезапущу его, сервер никогда не получит новое соединение.
Вот мой код сервера, который, я подозреваю, является ошибкой.
Socket clientSocket = serverSocket.accept();
InputStream inputStream = clientSocket.getInputStream();
OutputStream outputStream = clientSocket.getOutputStream();
while (true) {
byte[] bArray = new byte[2048];
try {
System.out.println(String.format("SERVER:%s: Attempting to read", this.name));
inputStream.read(bArray);
System.out.println(String.format("SERVER:%s: Received %s", this.name, new String(bArray)));
byte[] bytes = (name + ":" + counter).getBytes();
counter++;
outputStream.write(bytes);
System.out.println(String.format("SERVER:%s: Sent %s", this.name, new String(bytes)));
} catch (IOException e) {
System.out.println(String.format("SERVER:%s: Client Disconnected ", this.name));
clientSocket = serverSocket.accept();
inputStream = clientSocket.getInputStream();
}
}
В программе на C я обнаруживаю отключение и закрываю розетку, как показано ниже:
LOGINFO("Reading from Client Socket.");
iResult = read(readSocket, buff, recvbuflen);
if (iResult <= 0) {
LOGERROR("Receiving failed");
close(readSocket);
break;
}