java - UDP 的 OnMessage() 功能

标签 java websocket udp

我想知道是否有一种使用 DatagramPacket 的 UDP 消息的 OnMessage() 类型功能?我希望能够确保在遇到所有消息时都能收到它们,这样我就不会浪费资源随机抓取计时器。

OnMessage我指的是在WebSocketClient中完成的。或者一些类似于.net中的“可用”的功能。

While (rxUdpClient.Available > 0)

我正在监视多个端口,因此调用一个线程,该线程将为每个端口执行 run() 。问题是我的消息传入速度似乎高达 40+/秒。

这是我目前拥有的:

public void run()
{
    DatagramSocket sock = null;       
        sock = new DatagramSocket(port);
    byte[] buffer = new byte[DataAdapterFB1.HEADER_SIZE + DataAdapterFB1.MAX_DATA_BYTES];
    DatagramPacket incoming = new DatagramPacket(buffer, buffer.length);

    while (true){           
        sock.receive(incoming);           
        byte[] data = incoming.getData();
        String s = new String(data, 0, incoming.getLength());
        //This is the processing code, but it isn't its own thread...
        ScadaMsg newMessage = new ScadaMsg(data);
     }
}

最佳答案

DatagramPacket receive() 操作是阻塞的,因此您通常要做的就是启动一个单独的线程,它将循环监听传入的数据报并分派(dispatch)它们以进行进一步处理,就像这样:

void run() {
    socket = new DatagramSocket(4445);

    while(true) {
         byte[] buf = new byte[256];
         DatagramPacket packet = new DatagramPacket(buf, buf.length);
         socket.receive(packet); //JVM will wait here, until there is an incoming packet
         onMessage(packet.getData())
    }
 } 

 public abstract void onMessage(final byte[] pkt);    

关于java - UDP 的 OnMessage() 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40224944/

相关文章:

sockets - 如果上次 read() 没有读取到数据, poll() 会立即返回 UDP 套接字吗?

java - Thymeleaf 无法解析多模块 Spring Boot 项目中的模板

python - 如何使用键盘中断Python中的recvfrom()调用?

java - 这段代码没有绘制出它应该绘制的骰子......有什么提示吗? (Java,请参阅这两个类)

javascript - NodeJs 连接到服务器后对请求进行多次回复

spring-mvc - 仅发送到某些连接Spring Websockets

c# - websocket 无法访问本地网络客户端服务

c - 是否可以从 udp 服务器向客户端发送响应?

java - 抽象方法的返回值是否可以是泛型类型

java - 如何使用 FileChannels transferFrom() 方法监控进度(JProgressBar)?