当前位置: 首页 > 知识库问答 >
问题:

TCP 网络确保收到消息

慕容文昌
2023-03-14

我正在创建客户端-服务器系统,应该能够在稳定的网络工作。它假设连接可能会在某一时间中断,然后系统必须重新连接并继续其工作。我正在使用Netty,遇到了一个问题:我们如何知道我们发送的消息被另一台主机收到了?

我在想,为此目的,可以使用ChannelFuture,如果它在附加的未来侦听器中失败,我可以简单地尝试再次发送消息:

ChannelFuture fut = channel.write(message);
fut.addListener(new ChannelFutureListener() {
        @Override
        public void operationComplete(ChannelFuture future) throws Exception {
            if (!future.isSuccess()) {
                LOGGER.error("Message send failed. Message: " + message, future.getCause());
                //Queue message to be send after reconnect
            } 
        }
});

但是当我这样做时,我注意到,侦听器从不打印错误。(我通过在系统几乎不工作时从网络上拔出来测试这一点)另外,我注意到我发送的所有消息期货都进入“完成”状态,并且无法确保消息已收到(不使用确认消息)

据我所知,TCP协议保证消息将被接收,当使用它时,我们可以知道哪些发送包到达了目的地,哪些没有。我不能相信内蒂不允许知道它。

有没有好的方法可以知道消息已经传递了?

共有2个答案

乐钱青
2023-03-14

你未来所做的就是将消息写入网络。

要保证接收,您必须实现确认或使用消息编号并重新发送请求。

单于扬
2023-03-14

您误解了TCP。TCP不保证收到您的消息。它提供了一个可靠、有序的字节流。它对您的消息一无所知,无法告诉您远程主机何时接收到消息。因此,耐蒂也不能。Netty只能告诉您消息在传输之前已写入操作系统缓冲区。这就是代码正在检测的内容。

为了确保您的消息已被接收,接收者必须发回一个明确的确认。实现这一点的最佳方法取决于您的协议的预期行为,但通常需要维护一个包含所有已发送但尚未确认的消息的表。

 类似资料:
  • 我们在用Netty编写的AWS Network ELB(类似于具有长期连接的Echo服务器)后面有一个简单的TCP服务器,我正在尝试实现一个类似于TCP keep alive机制的keep live机制,以保持空闲连接打开。不幸的是,我们不能依赖TCP保持活动机制,因为NELB不会将保持活动的TCP数据包转发到负载平衡器的另一端 我想做的是监视空闲连接,并向客户端发送一个空字符串(空字节数组)。到

  • TCP概述 TCP的特点 TCP是面向连接的传输层协议。 TCP连接是点对点的(套接字—IP:Port到套接字)。 TCP提供可靠交付的服务。 TCP提供全双工通信。 面向字节流。 TCP与UDP的区别。 TCP UDP 是否连接 面向连接 面向非连接 传输可靠性 可靠 不可靠 应用场合 传输大量数据 少量数据 速度 慢 快 基本概念: 发送缓存和接受缓存:用来临时保存双向通信的数据。在发送时,应

  • 本文向大家介绍c# 网络编程之tcp,包括了c# 网络编程之tcp的使用技巧和注意事项,需要的朋友参考一下 一、概述 UDP和TCP是网络通讯常用的两个传输协议,C#一般可以通过Socket来实现UDP和TCP通讯,由于.NET框架通过UdpClient、TcpListener 、TcpClient这几个类对Socket进行了封装,使其使用更加方便, 本文就通过这几个封装过的类讲解一下相关应用。

  • 虽然之前我们已经提到过不建议直接使用 LogStash::Inputs::TCP 和 LogStash::Outputs::TCP 做转发工作,不过在实际交流中,发现确实有不少朋友觉得这种简单配置足够使用,因而不愿意多加一层消息队列的。所以,还是把 Logstash 如何直接发送 TCP 数据也稍微提点一下。 配置示例 output { tcp { host => "19

  • 未来你可能会用 Redis 服务器或者其他的消息队列系统来作为 logstash broker 的角色。不过 Logstash 其实也有自己的 TCP/UDP 插件,在临时任务的时候,也算能用,尤其是测试环境。 小贴士:虽然 LogStash::Inputs::TCP 用 Ruby 的 Socket 和 OpenSSL 库实现了高级的 SSL 功能,但 Logstash 本身只能在 SizedQu

  • TCP/IP网络模型 TCP/IP模型是互联网的基础,它是一系列网络协议的总称。这些协议可以划分为四层,分别为链路层、网络层、传输层和应用层。 链路层:负责封装和解封装IP报文,发送和接受ARP/RARP报文等。 网络层:负责路由以及把分组报文发送给目标网络或主机。 传输层:负责对报文进行分组和重组,并以TCP或UDP协议格式封装报文。 应用层:负责向用户提供应用程序,比如HTTP、FTP、Tel