- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 JRakNet 的创建者,一个实现最新协议(protocol)基础知识的网络库 RakNet对于Java。我制作了这个库,这样我就可以为 Minecraft:袖珍版制作一个使用 RakNet 的多人游戏服务器。
但是,我在服务器和客户端方面遇到的一个问题是处理程序的异常处理。每当发送无效数据包时,就会错误地读取数据并像平常一样抛出异常。但是,我需要找到一种方法来找出导致异常的外部地址。
通常,在使用 ServerBootstrap 的 TCP 服务器上,我可以将 boss 组和工作组分组,因此当捕获异常时,我知道它来自哪里,因为客户端有自己的专用处理程序。但 RakNet 是 UDP,这意味着它是无连接的,数据包可以来自任何地方,所以我只有一个处理程序。因此,每当抛出异常时,我都不知道是谁造成的。我尝试过使用忽略的异常列表,但我认为效率极低。我尝试在代码中添加一个名为 lastSender
的变量,这样每当抛出异常时,它就会查找导致错误的人。这是找出谁引起异常的好方法吗?或者是否有另一种更好的方法来找出谁在 UDP Netty 服务器上引起了错误?
The RakNetClient class at the time of posting
The RakNetClientHandler classa at the time of posting
Here is the whole project code at the time of posting if needed
我需要找到一种好方法来找出哪个地址在原始 Bootstrap Netty UDP 服务器/客户端上引起了异常。我尝试将 ServerBootstrap 与 UDP 结合使用,但似乎它仍然只使用一个 channel ,如 here 所示。
最佳答案
Netty 有一个很好的线程模型 since 4.0 .
尤其
Netty will never call a ChannelHandler's methods concurrently, unless the ChannelHandler is annotated with @Sharable
有轻微的change in 5.0但是
From a developer's point of view, the only thing that changes is that it's no longer guaranteed that a
ChannelHandler
will always be executed by the same thread. It is, however, guaranteed that it will never be executed by two or more threads at the same time. Furthermore, Netty will also take care of any memory visibility issues that might occur. So there's no need to worry about thread-safety and volatile variables within aChannelHandler
.
您可以利用这一点来解决问题
static class UdpHandler extends SimpleChannelInboundHandler<DatagramPacket> {
private InetSocketAddress lastSender;
@Override
protected void messageReceived(ChannelHandlerContext ctx, DatagramPacket packet) throws Exception {
lastSender = packet.sender();
throw new RuntimeException();
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
System.out.println("Evil sender was: " + lastSender);
}
}
在底层,exceptionCaught
方法是在messageReceived
之后直接调用的,就像
public static void invokeChannelReadNow(final ChannelHandlerContext ctx, final Object msg) {
try {
((AbstractChannelHandlerContext) ctx).invokedThisChannelRead = true;
ctx.handler().channelRead(ctx, msg); // -> calls messageReceived
} catch (Throwable t) {
notifyHandlerException(ctx, t); // -> calls exceptionCaught
}
}
局部变量的值仍将包含您在 messageReceived
中设置的值。
关于java - 如何找出 Netty 5 UDP 中哪个地址导致异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37844115/
我刚刚了解了 udp 校验和计算。 但我很困惑算法是否检测到所有错误。 最佳答案 当然不是。没有校验和可以检测到所有错误。 关于udp - UDP 校验和是否检测到所有错误?,我们在Stack Ove
下面这个函数有什么问题?? 它应该抛出错误,因为我没有在本地主机上运行 UDP 服务器。 int openUdpSocket(int port) { int sock,sin_size;
我正在尝试修改这两个程序。我想让 udpclient.c 能够接收消息并让 udpserver.c 将消息回显给客户端。我还想在 udpclient 发送消息之前先获取它们的时间标记消息。收到的消息应
我有相当简单的 UDP 服务器写在 c 上。 有时我需要知道在套接字中排队的所有 udp 数据包(字节)的当前长度。 据我了解,getsockopt 没有得到这样的信息。 欢迎使用 Linux 和 F
除了直播音乐/视频外,谁能告诉在哪里使用 UDP 协议(protocol)? UDP 的默认用例是什么? 最佳答案 其他任何您需要性能但如果数据包在途中丢失时可以生存的东西。例如,多人游戏浮现在脑海中
与 TCP 的监视方法相反,UDP 是否会在所有数据包可用时立即发送它们? 谢谢。 最佳答案 TCP 有拥塞控制,UDP 没有,因为它是无连接的。 但是您的问题涉及多个问题:发送消息是否会导致立即发送
我知道 UDP 本质上是不可靠的,但是当连接到 localhost 时,我希望内核以不同的方式处理连接,因为一切都可以在内部处理。那么在这种特殊情况下,UDP 是否被认为是一种可靠的协议(protoc
我正在尝试使用 flash 和 rtmfp 协议(protocol)开发一个实时视频聊天应用程序,但我有疑问rtmfp 如何保证连接对等点,尤其是当对等点位于不同网络时。 最佳答案 RTMFP 依靠中
我发现所有使用 Netty 4.0 的 TCP 服务器实现都使用了 ServerBootstrap 实例。 The biggest and only difference between a serv
对于个人 MMO 游戏项目,我正在 java 中实现一个自制的可靠的基于 UDP 的协议(protocol)。鉴于我当前的设置,我相信窥探者劫持 session 相对简单,因此为了防止这种情况,我借此
我正在尝试手动计算各种 UDP 数据包的校验和,但与 Wireshark 中显示的结果相比,我总是得到错误的结果。下面是我如何做到这一点的示例: Source Address: 192.168.0.1
我正在尝试手动计算各种 UDP 数据包的校验和,但与 Wireshark 中显示的结果相比,我总是得到错误的结果。下面是我如何做到这一点的示例: Source Address: 192.168.0.1
我有一个奇怪的问题。我有一个成功运行的 C++ (boost asio) P2P 应用程序,它可以在大多数 NAT 上运行。问题是,当我将初始启动端口号指定为 1000 时,它会检查 1000 是否空
带有数据源的短 radio 链路,需要通过 IPv6 的 1280 Kbps 吞吐量,使用 UDP 停止和等待协议(protocol),该区域内没有其他客户端或明显的噪声源。我到底如何才能计算出最佳数
似乎可以在没有有效负载的情况下发送 UDP 数据包。 我能想到的唯一不需要有效载荷的就是用于 NAT 打洞。 这还能用来做什么? 这与我之前的问题有关Under Linux, can recv eve
我有一个客户端,我无法更改其代码 - 但我想(重新)使用 编写代码ZeroMQ socket 。 客户端同时使用原始 TCP 和原始 UDP socket 。 我知道我可以使用 ZMQ_ROUTER_
网络 4.0.24 我通过 UDP 传递 XML。收到 UPD 数据包时,数据包的长度始终为 2048,截断消息。尽管如此,我尝试将接收缓冲区大小设置为更大的值(4096、8192、65536),但它
我正在尝试编写一个有关 UDP 连接的简单程序来了解它们。我已经实现了一些基本的事情,但是当我尝试发送并取回我发送的内容时,我遇到了一些问题,例如, 当我这样做时;发送一个字符串 “asd”到服务器我
当我检查时,我在 UDP 客户端每 100 毫秒从服务器发送 UDP 数据包 接收频率不等于 100 毫秒,有时它要少得多,例如 3 毫秒…10 毫秒。 我知道UDP client server是异步
海友我是一个学习winsock2的新手。以下是我的udp服务器和客户端程序。 我这个程序客户端不知道服务器的IP地址,只知道端口。但是服务器会在整个网络中广播一条消息。 当客户端收到消息时,它会回溯服
我是一名优秀的程序员,十分优秀!