sockets - 如何告诉服务器客户端已经完成输出而不关闭输出流

标签 sockets streaming 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())
}

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

最佳答案

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

您需要的是 应用层协议(protocol)这将决定服务器和客户端如何通信 - 什么是命令,如何格式化响应等。

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

关于sockets - 如何告诉服务器客户端已经完成输出而不关闭输出流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32078515/

相关文章:

java - 安卓Java : Receive Image over Socket

MySQL守护进程锁问题

java - Android TCP套接字客户端/服务器实现

linux - 给我自己的原始 ICMP 数据包

java - 使用 java 将 JSON 文档流式传输到 Rest Web 服务

c++ - VLC 命令行音频/视频流

c# - 将 StringBuilder 流式传输到文件

spring - 如何将 log4j 输出重定向到 HttpServletResponse 输出流?

java - java中如何写入文件?

java GUI 多线程与套接字