- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有一天,我决定使用 Tcp 协议(protocol)创建一个 Netty 聊天服务器。目前,它成功记录连接和断开连接,但我的处理程序中的channelRead0永远不会触发。我尝试了Python客户端。Netty版本:4.1.6.Final
处理程序代码:
public class ServerWrapperHandler extends SimpleChannelInboundHandler<String> {
private final TcpServer server;
public ServerWrapperHandler(TcpServer server){
this.server = server;
}
@Override
public void handlerAdded(ChannelHandlerContext ctx) {
System.out.println("Client connected.");
server.addClient(ctx);
}
@Override
public void handlerRemoved(ChannelHandlerContext ctx) {
System.out.println("Client disconnected.");
server.removeClient(ctx);
}
@Override
public void channelRead0(ChannelHandlerContext ctx, String msg) {
System.out.println("Message received.");
server.handleMessage(ctx, msg);
}
@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
System.out.println("Read complete.");
super.channelReadComplete(ctx);
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
cause.printStackTrace();
ctx.close();
}
}
输出:
[TCPServ] Starting on 0.0.0.0:1052
Client connected.
Read complete.
Read complete.
Client disconnected.
客户端代码:
import socket
conn = socket.socket()
conn.connect(("127.0.0.1", 1052))
conn.send("Hello")
tmp = conn.recv(1024)
while tmp:
data += tmp
tmp = conn.recv(1024)
print(data.decode("utf-8"))
conn.close()
最佳答案
顺便说一句,问题出在我的初始化程序中:我将 DelimiterBasedFrameDecoder 添加到我的管道中,并且该解码器正在停止线程。我不知道为什么,但我不需要这个解码器,所以我就把它删除了,一切都开始工作了。
@Override
protected void initChannel(SocketChannel ch) throws Exception {
// Create a default pipeline implementation.
ChannelPipeline pipeline = ch.pipeline();
// Protocol Decoder - translates binary data (e.g. ByteBuf) into a Java object.
// Protocol Encoder - translates a Java object into binary data.
// Add the text line codec combination first,
pipeline.addLast("framer", new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter())); //<--- DELETE THIS
pipeline.addLast("decoder", new StringDecoder());
pipeline.addLast("encoder", new StringEncoder());
pipeline.addLast("handler", new ServerWrapperHandler(tcpServer));
}
关于java - SimpleChannelInboundHandler 从不触发channelRead0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56821015/
为什么channelRead()不给我发送到服务器的完整消息?当消息超过 140 字节(粗略地说,有时更多,有时更少)时,有时会出现碎片。我正在使用 NioServerSocketChannel 类的
我正在运行 Netty,我需要从客户端读取一些消息。然后我需要在服务器中执行一些操作,然后向客户端发送响应。也许客户端需要再次回答服务器。我认为所有这些都必须发生在同一个线程中。我如何在 Netty
我一直在研究一项功能,该功能可以在 channel 中对耗时的工作进行排队,并在那里使用例如迭代 channel await foreach(var item in channel.Reader.Re
我正在使用 netty 4,我正在努力适应他们的编程模型。但是这里有一个问题,我一直没能在 netty 的文档中找到满意的答案: 可以在 ChannelInboundHandler.channelRe
我使用 System.Threading.Channels 编写了异步队列。但是当我运行程序进行测试时,随机抛出以下异常并且工作线程停止。 System.InvalidOperationExcepti
Channel.CreateUnbounded 的文档说: Creates an unbounded channel usable by any number of readers and write
我是一名优秀的程序员,十分优秀!