我有一个基于UDP网络的服务器。它有一个SimpleChannelupStreamHandler
流水线,我在其中重写MessageReceived
方法。
我需要时不时地写些信息。我只能通过使用MessageEvent.getRemoteAddress()
中的套接字信息和MessageEvent.getChannel()
中的通道来实现。为了能够重用这些信息,我保留在一个静态映射中。
当使用UDP(数据报)通道作为服务器通道时,您只将其绑定在本地地址上,并且不建立连接。这就是为什么没有与通道关联的远程地址,并且在调用MessageEvent.GetChannel().GetRemoteAddress()
时总是得到NULL
的原因。这种行为是意料之中的,也是正确的。同一个UDP“服务器”通道处理所有传入的客户端请求。
当使用UDP通道作为客户端通道时,可以通过将通道连接到远程地址来创建“连接”。在这种情况下,通道将具有配置的远程地址(尽管没有建立实际连接),调用MessageEvent.getChannel().getRemoteAddress()
将返回配置的远程地址。连接UDP通道可防止用户使用该通道将数据发送到该通道上配置的远程地址以外的其他远程地址。尝试这样做将引发异常。在UDP中,连接客户端通道是可选的,只要保存远程地址,客户端就可以使用仅绑定在本地地址上的通道正常操作。
我想你有两个选择:
我相信第一种选择更好。
netty文档讨论TCP客户端。 但对UDP来说,这句话似乎无关紧要?!我找到了仅使用引导程序的UDP服务器的示例,如:1,2,3 我对此感到很困惑,所以我的两个问题是: null
我试图使用Netty来设置一个简单的UDP服务器,遵循这里的示例,但使用Spring来连接依赖项。 我的Spring配置类: 为了避免阻塞主线程(用于Spring配置),我创建了一个新线程,如下所示: 我可以看到新线程被阻塞,等待通道关闭(如示例所示)。主线程可以继续Spring配置。然而,这仍然不起作用。
当涉及到TCP时,Netty确实有很好的文档记录,但我想尝试一个简单的UDP服务器-客户机示例,但没有找到任何好的代码。(主要是邮件列表和据称有错误代码的用户) 有人愿意提供一些简单的例子吗?谢谢!
程序代码 udp_server.php //创建Server对象,监听 127.0.0.1:9502端口,类型为SWOOLE_SOCK_UDP $serv = new Swoole\Server("127.0.0.1", 9502, SWOOLE_PROCESS, SWOOLE_SOCK_UDP); //监听数据接收事件 $serv->on('Packet', function ($serv,
然后是数据报通道、pipelineFactory和Bootstrap: 在pipelineFactory中,getPipeline()添加自定义处理程序。 就像中所说的:UDP消息的多线程处理 然后我根据这些条目修改了一些代码。现在创建线程池的条件是: 和ExecutionHandler的pipelineFactory: getPipeline()添加处理程序,如所描述的: 但它们不同时处理。me
框架默认提供创建 TCP/UDP 服务的能力。只需要进行简易的配置,便可使用。 使用 TCP 服务 创建 TcpServer 类 <?php declare(strict_types=1); namespace App\Controller; use Hyperf\Contract\OnReceiveInterface; class TcpServer implements OnRecei