繁体   English   中英

净值isWriteable()

Netty isWriteable()

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在运行用于在线游戏的Netty服务器,但是遇到一些奇怪的现象:

随机地,该通道只是停止能够从服务器进行写操作,即用户仍然处于连接状态,并且接收到传入数据,但是传出数据没有到达客户端。

我花了一些时间来调试它,然后发现channel.isWriteable()返回false来连接客户端与问题。

谁能阐明为什么会这样吗?

通道不再可写的原因是什么?

顺便说一句,这也发生在本地主机连接上。

    public ChannelFuture write(Packet message) {
    ioWrite++;

    if (!channel.isConnected()) {
        System.err.println("Trying to write to bad channel");

        return null;
    }

    if (!channel.isWritable()) {
        System.err.println("Channel buffer is full?");
    }

    if ((channel != null) && channel.isConnected()) {
        return channel.write(message);
    }

    return null;
}

编码器:

public class GameProtocolEncoder extends OneToOneEncoder {



private ChannelBuffer response;


protected Object encode(ChannelHandlerContext channelHandlerContext, Channel channel, Object o) throws Exception {
    Packet p = (Packet) o;

    try {
        byte[] data       = p.getData();
        int    dataLength = p.getLength();

        if (p.getLength() > 5000) {
            System.err.println("unable to write data chunk to large");

            return null;
        }

        if (!p.isBare()) {
            int siz = 0;

            siz      += (p.getSize() == Packet.Size.VariableShort)
                        ? 2
                        : 1;
            siz      += (p.getId() > 128)
                        ? 2
                        : 1;
            response = ChannelBuffers.buffer(siz + p.getLength());

            int id          = p.getId();

            if (id< 128) {
                response.writeByte(id);
            } else {
                response.writeByte((byte) ((id >> 8) + 128));
                response.writeByte((byte) (id & 0xFF));
            }

            if (p.getSize() != Packet.Size.Fixed) {    // variable length
                if (p.getSize() == Packet.Size.VariableByte) {
                    if (dataLength > 255) {            // trying to send more data then we can represent with 8 bits!
                        throw new IllegalArgumentException("Tried to send packet length " + dataLength
                                                           + " in 8 bits [pid=" + p.getId() + "]");
                    }

                    response.writeByte((byte) dataLength);
                } else if (p.getSize() == Packet.Size.VariableShort) {
                    if (dataLength > 5000) {
                        throw new IllegalArgumentException("Tried to send packet length to big: " + id);
                    }

                    response.writeShort((short) dataLength);
                }
            }
        } else {
            response = ChannelBuffers.buffer(dataLength);
        }

        response.writeBytes(p.getData());

        return response;
    } catch (Exception e) {
        Logger.err("Error handling message: " + p);
        Logger.err(e);
    }

    return null;
}
2 个回复

我认为问题出在这里,您没有刷新Channel。 尝试将channel.write(...)替换为channel.writeAndFlush(...)。

当通道的套接字发送缓冲区已满时,通道将停止可写,而当发送方超出接收方时,通道将发生可写状态。

如果经常发生这种情况,您可能要考虑加快接收代码的速度,但是通常它可以随时发生,并且您所能做的就是将写入推迟到该通道再次变为可写入状态。

1 净值4 IpFilter

我正在经历新的Netty代码组织,似乎处理程序包(请参阅https://github.com/netty/netty/tree/master/handler/src/main/java/io/netty/handler )节食。 ipfilter软件包放在哪里? 我在新闻( http:/ ...

2014-01-16 09:30:58 1 826   netty
2 净值通道从未读过

我玩过一点netty,然后观看了一个视频( https://www.youtube.com/watch?v=tsz-assb1X8 )以构建聊天服务器,并且该服务器的客户端正常运行(我在telnet上进行了测试,在这里有效),但客户端无法接收数据。 从未调用过ChatClinetHandler ...

3 NetResolvers在净值方面做什么?

它是ObjectDecoder类中的一个参数。 它具有诸如weakCachingConcurrentResolver方法。 那么什么是缓存呢? 就像前面创建的共享内存一样,可以缓冲从网络接收到的字节吗? 为什么称其为弱缓存? ...

2015-12-22 13:00:18 0 63   netty
4 如何计算R的净值

我需要计算“网络信任”,即(信任-不信任)/受访者。 到目前为止,我拥有的代码是这样的: 但是产生奇怪的答案-关于我要去哪里错的任何想法吗? 谢谢 :) ...

2020-08-19 18:18:59 0 44   r
5 带净值的DNS请求

我正在尝试通过udp向服务器发出请求。 我使用netty-codec-dns库。 我想了解是否存在生成正确的发送请求的对象? 生成请求dig -t naptr 0.7.3.4.8.4.6.1.7.7.7.e164enum.net @address -p 5343。 如何在代码中做到这一点? ...

6 SQL Partition By 计算净值

想象一个订单系统,其中多个订单的双方为买入和卖出。 数据集看起来像这样 我想计算净值,即(所有买方的总和 - 所有卖方的总和) 预期输出: 我目前使用 Partition By 来达到以下输出 输出: 但我不知道如何减去这些值并得出预期结果。 ...

7 如何理解这样的通用净值代码?

我是Java的新手,最近正在学习netty。 一些通用的类代码使我感到困惑。 像这样: 常量的泛型定义是self的子类,这使我感觉像是循环引用。 这样的代码的目的是什么? 弓 ...

8 未过滤:何时选择净值

我在未经过滤的情况下进行了快速测试,比较了码头和净值作为基础连接处理程序的吞吐量。 仅提供(内存缓存的)图像并对其进行负载测试。 我的发现是,性能没有显着差异。 除此之外,我的印象是两者都具有类似的缩放功能,例如暂停连接。 同样,未过滤的方法足以为我们提供与两个框架非常相似(如果 ...

9 传递净值ByteBuf(异步)

我已经使用Netty设置了一个TCP服务器。 现在,我需要将TCP服务器的输入(这是通道线程产生的ByteBuf 流 )传输到单独的应用程序线程,并且我想以异步方式执行此操作,其中通道线程写入缓冲区流,并且应用程序缓冲区从线程读取。 我不想使用ByteBuf本身,因为我需要在其上调用ms ...

10 如何从 YieldWatch 中抓取“净值”?

我想按照以下方式抓取网站: 前往收益观察 在地址文本框中输入0xF54274757Bf717B1ab52bA0d3a7CbF635f856a0d并单击双筒望远镜 刮下“净值”下的文字 我在 Python 中使用 Selenium 来尝试这样做,这是我迄今为止的尝试: 该代码不起作用 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM