【问题标题】:how to tell server that client already finished the output without shutting down the outputstream如何告诉服务器客户端已经完成输出而不关闭输出流
【发布时间】:2015-08-18 17:04:30
【问题描述】:

我有以下代码来创建客户端套接字来发送/接收数据:

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())
}

如果我不运行 socket.shutdownOutput(),我将无法从服务器获取数据, 因为服务器端仍在等待输入。因此我必须关闭 outputStream。 但如果关闭输出,则无法重新打开。所以我必须创建一个新的套接字来发送新数据。 这导致发送一条记录需要创建一个新的套接字。这真的很尴尬。 有没有其他方法可以告诉服务器输出已经完成而不关闭输出。 提前致谢!

【问题讨论】:

    标签: sockets streaming outputstream


    【解决方案1】:

    问题是服务器不知道什么时候停止阅读和处理和回复。

    您需要的是一个应用程序级协议,它将规定服务器和客户端如何通信 - 什么是命令、如何格式化响应等。

    这可能是一个面向行的协议——每个新行代表一条消息(通常消息分隔符可以是消息中没有出现的任何其他字符序列)。 或者它可能是固定长度消息;或消息预先加上消息长度(或类型),让对方知道您期望多少数据。

    【讨论】:

    • 谢谢 Nikolai,我也想到了这个。我确实需要自己自定义服务器端逻辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多