使用SpringBoot2和SpringIntegration为面向流的侦听套接字/服务器开发非阻塞TCP,代码如下。
@Bean
public TcpNetServerConnectionFactory cf() {
TcpNetServerConnectionFactory cf = new TcpNetServerConnectionFactory(8595);
cf.setSerializer(new ByteArrayCrLfSerializer());
cf.setDeserializer(new ByteArrayCrLfSerializer());
return cf;
}
@Bean
public TcpReceivingChannelAdapter inbound(AbstractServerConnectionFactory cf) {
TcpReceivingChannelAdapter adapter = new TcpReceivingChannelAdapter();
adapter.setConnectionFactory(cf);
adapter.setOutputChannel(tcpIn());
return adapter;
}
@Bean
public MessageChannel tcpIn() {
return new DirectChannel();
}
@Transformer(inputChannel = "tcpIn", outputChannel = "serviceChannel")
@Bean
public ObjectToStringTransformer transformer() {
return new ObjectToStringTransformer();
}
@ServiceActivator(inputChannel = "serviceChannel")
public void service(String jsonInString) {
System.out.println(jsonInString);
}
应用程序开始指示tcp端口正在按预期进行侦听,但几分钟后引发以下异常:
2018-03-09 13:21:51.168 WARN 1202 --- [-worker-ELG-3-2] i.n.c.AbstractChannelHandlerContext : Failed to mark a promise as failure because it has succeeded already: DefaultChannelPromise@331a9712(success)
java.lang.NoSuchMethodError: io.netty.handler.codec.http2.Http2ConnectionEncoder.writePing(Lio/netty/channel/ChannelHandlerContext;ZLio/netty/buffer/ByteBuf;Lio/netty/channel/ChannelPromise;)Lio/netty/channel/ChannelFuture;
at io.grpc.netty.NettyClientHandler.sendPingFrame(NettyClientHandler.java:568) ~[grpc-netty-1.9.0.jar!/:1.9.0]
at io.grpc.netty.NettyClientHandler.write(NettyClientHandler.java:287) ~[grpc-netty-1.9.0.jar!/:1.9.0]
at io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(AbstractChannelHandlerContext.java:738) [netty-transport-4.1.22.Final.jar!/:4.1.22.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:730) [netty-transport-4.1.22.Final.jar!/:4.1.22.Final]
at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:816) [netty-transport-4.1.22.Final.jar!/:4.1.22.Final]
at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:723) [netty-transport-4.1.22.Final.jar!/:4.1.22.Final]
at io.netty.channel.DefaultChannelPipeline.write(DefaultChannelPipeline.java:1041) [netty-transport-4.1.22.Final.jar!/:4.1.22.Final]
at io.netty.channel.AbstractChannel.write(AbstractChannel.java:295) [netty-transport-4.1.22.Final.jar!/:4.1.22.Final]
at io.grpc.netty.WriteQueue$AbstractQueuedCommand.run(WriteQueue.java:186) [grpc-netty-1.9.0.jar!/:1.9.0]
at io.grpc.netty.WriteQueue.flush(WriteQueue.java:124) [grpc-netty-1.9.0.jar!/:1.9.0]
at io.grpc.netty.WriteQueue.access$000(WriteQueue.java:32) [grpc-netty-1.9.0.jar!/:1.9.0]
at io.grpc.netty.WriteQueue$1.run(WriteQueue.java:44) [grpc-netty-1.9.0.jar!/:1.9.0]
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) [netty-common-4.1.22.Final.jar!/:4.1.22.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404) [netty-common-4.1.22.Final.jar!/:4.1.22.Final]
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:463) [netty-transport-4.1.22.Final.jar!/:4.1.22.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:886) [netty-common-4.1.22.Final.jar!/:4.1.22.Final]
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) [netty-common-4.1.22.Final.jar!/:4.1.22.Final]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_161]
在查看写平方法[1]的应用编程接口时,看起来你缺少了第二个参数,因为它需要四个参数,如下所示:
(ChannelHandlerContext ctx,
boolean ack,
long data,
ChannelPromise promise)
从stacktrace中,我可以看到您只传递了3个参数:
java.lang.NoSuchMethodError: io.netty.handler.codec.http2.Http2ConnectionEncoder.writePing(Lio/netty/channel/ChannelHandlerContext;ZLio/netty/buffer/ByteBuf;Lio/netty/channel/ChannelPromise;)
能否尝试添加第二个参数,boolean ack
?
[1]https://netty.io/4.1/api/io/netty/handler/codec/http2/Http2FrameWriter.html#writePing-木卫一。内蒂。频道ChannelHandlerContext布尔长io。内蒂。频道渠道promise-
可能是一个简单的方法, 我想要的是:我有一个监听传入连接的tcp服务器。当客户连接时,我希望以某种方式得到通知。TcpNetServerConnectionFactory内部有这样的信息"接受的连接..."。 有一个TcpConnectionSupport类,但是我找不到如何使用它的方法。我正在寻找类似的用户模式。 有什么办法可以做到吗?
我正在尝试创建一个TCP服务器,该服务器在端口5002上接受来自外部程序的消息。但是,它不接收来自外部程序的消息。 为了验证我的TCP服务器是否正常工作,我像这样使用了telnet,程序确实收到了文本“hello”。 设置wireshark时,我可以看到计算机正在端口5002上接收来自外部程序(我期待)的消息。为什么我的程序无法接收这些消息? 关于最终解决方案的最新情况: 由于负载没有停止线,我必
我需要实现一个TCP服务器,它基本上应该在与客户端握手时打开一个套接字。 套接字打开后服务器需要保持套接字打开,并且能够通过打开的套接字将消息从服务器推送到客户端 我查看了一些spring集成示例,但不确定我所看到的示例是否确实参考了我的需求。 1. Spring集成tcp是否有这种能力来保持打开套接字并将消息从服务器发送到客户端? 服务器还应支持传入请求 客户端实现是作为简单Tcp java客户
我的dockerized服务(webrtc服务器)同时使用TCP和UDP传输协议。我在Azure Kubernetes服务公司工作。如您所知,我们无法在Kubernetes中同时使用TCP和UDP proto创建LoadBalancer服务(更多信息请参见此处) 此外,我还尝试创建了两个服务: 一个用于TCP端口 一个用于UDP 用一个公共IP绑定它们,但得到:“确保负载平衡器”消息。 唯一的解决
?> Swoole\Coroutine\Server 是一个完全协程化的类,用于创建协程TCP服务器,支持TCP和unixSocket类型。 与Server模块不同之处: 动态创建销毁,在运行时可以动态监听端口,也可以动态关闭服务器 处理连接的过程是完全同步的,程序可以顺序处理Connect、Receive、Close事件 !> 在4.4以上版本中可用 短命名 可使用Co\Server短名。 方法
程序代码 server.php //创建Server对象,监听 127.0.0.1:9501端口 $serv = new Swoole\Server("127.0.0.1", 9501); //监听连接进入事件 $serv->on('Connect', function ($serv, $fd) { echo "Client: Connect.\n"; }); //监听数据接收事