Я не знаю, понимаю ли я вашу проблему, но я бы сказал, что это нормально, что сервер должен закрыть сокет.
На стороне сервера (в независимом потоке) у вас естьсокет прослушивания:
ServerSocket socketServeur = new ServerSocket(port);
Тогда, вероятно (в том же потоке, если это небольшой сервер) цикл приема входящих соединений (без управления исключениями, возможно, socket.close находится в блоке finally):
while (! askedToClose) {
Socket socket = socketServeur.accept();
doSomethingWithRequest(socket);
socket.close();
}
На стороне клиента у вас есть:
Socket clientSocket = new Socket();
clientSocket.connect(new InetSocketAddress(port));
OutputStream output = clientSocket.getOutputStream();
// send something to server
InputStream input = clientSocket.getInputStream(); // will block until data is available
// reading response
Сервер должен знать, когда он достиг конца запроса.Например, в http это может быть (взято из mockHttpServer в scala, поэтому могут быть некоторые ошибки, но процесс такой же):
void doSomethingWithRequest(Socket socket) {
BufferedReader inputReader = new BufferedReader(new InputStreamReader(socket.getInputStream));
StreamWriter outputWriter = new OutputStreamWriter(socket.getOutputStream);
StringBuilder requestBuilder = new StringBuilder();
do {
requestBuilder.append(inputReader.read().toChar());
} while (!requestBuilder.toString().endsWith("\r\n\r\n"));
saveUri(getUriFromRequest(requestBuilder.toString()));
outputWriter.write("HTTP/1.1 200 OK\r\n\r\n");
outputWriter.flush();
inputReader.close();
outputWriter.close();
}
РЕДАКТИРОВАТЬ: я прочитал добавленный код, и я до сих пор не могуполучите:
- вы вызываете Socket.close (), но этот метод не является статичным
- вы зацикливаетесь вечно на "сервере"
- У меня сложилось впечатлениечто вы используете один и тот же сокет для клиента и сервера
У вас есть 3 "сокета":
- прослушивающий сокет (объект ServerSocket)
- принимаемsocket (Object Socket, отправляемый socketServer.accept ())
- клиентский сокет (как показано выше в примере)
Сервер открывает и закрывает слушающий и «принимающий» сокет, ине должно иметь никакого влияния на плохое управление клиентскими сокетами.
Тогда, если вы хотите, чтобы ваш сервер принимал несколько одновременных подключений, вы можете добавить ThreadPool для приема подключений и обработки запросов и ответов.