Java服务器-TCP套接字在不关闭套接字连接的情况下检测EOF

Java服务器-TCP套接字在不关闭套接字连接的情况下检测EOF,java,sockets,tcp,persistent-connection,Java,Sockets,Tcp,Persistent Connection,当从TCP套接字读取数据时,套接字连接保持打开状态,是否有方法检测EOF 我看到的大多数例子大致如下: int n=0; While((n = read.inStream(data)) != -1){ destType.write(data, 0, n); } 但是,这意味着您必须在每次希望接收新数据时创建新连接。 在我的例子中,这是一个以字节形式通过套接字发送的恒定图像流,我希望处理每个图像而不必关闭它们之间的连接,这样我就可以将所有图像与单个用户关联,而且不经常以高频率打开和关闭连

当从TCP套接字读取数据时,套接字连接保持打开状态,是否有方法检测EOF

我看到的大多数例子大致如下:

int n=0;
While((n = read.inStream(data)) != -1){
    destType.write(data, 0, n);
}
但是,这意味着您必须在每次希望接收新数据时创建新连接。 在我的例子中,这是一个以字节形式通过套接字发送的恒定图像流,我希望处理每个图像而不必关闭它们之间的连接,这样我就可以将所有图像与单个用户关联,而且不经常以高频率打开和关闭连接更有效


那么,有没有办法做到这一点,或者提供一些关于可能的替代方案的信息呢?

否-如果连接保持打开状态,则流还没有结束。流报告EOF然后在以后拥有更多数据的想法违背了流的原则

如果要跨TCP流发送多条消息,最简单的方法是在每条消息前面加上其长度:

HEADER BODY
HEADER BODY
HEADER BODY

然后,客户端将读取消息头,找出消息的长度,读取消息头,然后读取下一个消息头,等等。

否-如果连接保持打开状态,则流尚未到达终点。流报告EOF然后在以后拥有更多数据的想法违背了流的原则

如果要跨TCP流发送多条消息,最简单的方法是在每条消息前面加上其长度:

HEADER BODY
HEADER BODY
HEADER BODY

然后客户端将读取消息头,找出消息的长度,读取消息头,然后读取下一个消息头,等等。

或者使用开始消息/结束消息指示器。@ShaneWalti:虽然这是可能的,但它会变得更加客户端密集-您必须在读取数据时解析数据,并为数据是否自然包含“结束消息”指示符制定一个转义策略。我更喜欢两者-一个以SOH开头的endianness-proof标头,它包含ASCII格式的数据长度,可以进行结构和健全性检查,以及一个包含标头校验和的终止符。如果标头检查失败或终止符不正确,则所有数据将被丢弃,直到收到另一个可以启动另一个标头检查的SOH。或者使用开始消息/结束消息指示器。@ShaneWalti:虽然这是可能的,但它会变得更加客户端密集-您必须在读取数据时解析数据,并为数据是否自然包含“结束消息”指示符制定一个转义策略。我更喜欢两者-一个以SOH开头的endianness-proof标头,它包含ASCII格式的数据长度,可以进行结构和健全性检查,以及一个包含标头校验和的终止符。如果报头检查失败或终止符不正确,则丢弃所有数据,直到收到可以开始另一报头检查的另一个SOH。