2015-08-18 2 views
1

I, имеющий следующий код, чтобы создать клиентский сокет для отправки/приема данных:как сказать серверу, что клиент уже завершил выход без выключения OutputStream

val socket:Socket = new Socket(InetAddress.getByName("127.0.0.1"), 7777) 
val inputStream = socket.getInputStream() 
val bufferSource = new BufferedSource(inputStream) 
val out = new PrintStream(socket.getOutputStream()) 

var data = "Hello Everyone" 
out.println(data) 
out.flush() 
***socket.shutdownOutput()*** 
val in = bufferSource.getLines() 
if (in.hasNext) { 
    println(in.next()) 
} 

Если я не запускать сокет. shutdownOutput(), я не получу данные с сервера, , потому что серверная сторона все еще ждет ввода. Поэтому я должен отключить outputStream. Но если выключение выхода, его нельзя открыть повторно. Поэтому мне нужно создать новый сокет для отправки новых данных. Для создания одной записи необходимо создать новый сокет. Это действительно неудобно. Есть ли другой способ сообщить серверу, что выход уже завершен, не выключая выход, пожалуйста. Спасибо заранее!

ответ

1

Проблема в том, что сервер не знает, когда прекратить чтение, обработку и ответ.

Что вам нужно здесь протокол прикладного уровня, который будет диктовать, как сервер и клиенты для общения - то, что это команда, как ответ должен быть отформатирован и т.д.

Это может быть line-ориентированный протокол - каждая новая строка представляет сообщение (в общем случае разделителем сообщения может быть любая другая последовательность символов, не отображаемая в сообщениях). Или это может быть фиксированная длина сообщений; или сообщения , предварительно зарезервированные с длиной сообщения (или типа), чтобы другая сторона знала, сколько данных вы ожидаете.

+0

Спасибо, Николай, я тоже подумал об этом. Мне нужно самостоятельно настроить логику на стороне сервера. – Jack