【问题标题】:Java Server - TCP Socket detect EOF without closing the socket connectionJava 服务器 - TCP 套接字检测 EOF 而不关闭套接字连接
【发布时间】:2012-01-20 10:50:32
【问题描述】:

有没有办法在套接字连接保持打开状态时从 TCP 套接字读取时检测 EOF?

我见过的大多数例子都是这样的:

int n=0;
While((n = read.inStream(data)) != -1){
    destType.write(data, 0, n);
}

但是,这意味着您每次想要接收新数据时都必须创建一个新连接。 在我的情况下,这是一个恒定的图像流,以字节形式通过套接字发送,我想处理每个图像而不必关闭它们之间的连接,这样我就可以拥有与单个用户关联的所有图像,以及它不频繁地频繁打开和关闭连接会更有效。

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

【问题讨论】:

    标签: java sockets tcp persistent-connection


    【解决方案1】:

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

    如果你想通过 TCP 流发送多条消息,最简单的方法是在每条消息前面加上它的长度:

    HEADER BODY
    HEADER BODY
    HEADER BODY
    

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

    【讨论】:

    • 或使用开始消息/结束消息指示器。
    • @ShaneWealti:虽然这是可能的,但它变得更加客户端密集 - 您必须在读取数据时解析数据,并针对数据是否自然包含“结束消息”制定转义策略里面的指标。
    • 我更喜欢两者——一个以 SOH 开头的字节序证明头,它包含 ASCII 格式的数据长度,可以进行结构和完整性检查,以及一个包含头校验和的终止符。如果标头检查失败或终止符错误,则丢弃所有数据,直到接收到可以开始另一个标头检查的另一个 SOH。
    猜你喜欢
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 2012-06-13
    • 2020-09-17
    • 2014-01-13
    • 1970-01-01
    相关资源
    最近更新 更多