Вы можете использовать
socket.shutdownOutput();
, чтобы закрыть выходной поток клиента. Это будет отображаться как закрытый поток ввода без закрытия сокета.
BTW: Вы не можете использовать socket.getOuputStream().close();
, как я мог бы.
IMHO, отправляющий длину, является лучшим вариантом, так как это позволит вам отправлять несколько запросов с использованием одного и того же сокета.
Ниже приведен пример
public class SimpleServerMain {
public static void main(String... args) throws IOException, InterruptedException {
ServerSocket ss = new ServerSocket(54321);
Socket s = ss.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
for (String line; (line = br.readLine()) != null;)
System.out.println("Got " + line);
PrintStream ps = new PrintStream(s.getOutputStream());
for (String word : "Hello World Bye Bye!".split(" ")) {
ps.println(word);
Thread.sleep(1000);
}
s.close();
ss.close();
}
}
и
public class SimpleClientMain {
public static void main(String... args) throws IOException {
Socket s = new Socket("localhost", 54321);
InputStream inputStream = s.getInputStream();
s.getOutputStream().write("Hello\n".getBytes());
s.shutdownOutput();
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
for (String line; (line = br.readLine()) != null;)
System.out.println("Got " + line);
System.out.println("Disconnected.");
s.close();
}
}
Благодарим за быстрый ответ, я попытался закрыть входной поток на стороне клиента, но это также вызывает закрытие соединения. Таким образом, после закрытия входного клиента клиент не может прочитать ответ, так как сокет закрыт. – cacert
Закрытие выходного потока не обязательно должно закрывать соединение, но некоторые библиотеки могут это сделать. Если они это сделают, это ошибка ИМХО. Сокет не закрывается, пока один конец не закроет его. Если вы используете библиотеку, которая закрывает сокет без вашего ведома, я предлагаю вам использовать другую библиотеку. –
Я использую стандартную java api IBM jdk. Я думаю, что это поведение по умолчанию. Но я попробую socket.shutdownInput(). здесь ссылка link.http: //stackoverflow.com/questions/3956163/does-closing-the-inputstream-of-a-socket-also-close-the-socket-connection – cacert