0

我想通过 udp 套接字发送和接收数据(unicode utf-8 字符串,DatagramSocket。我一直在寻找答案,但只能找到使用InputStream和类似的 TCP 传输的解决方案。

UDP有类似的方法吗?

UDP客户端

package testsocket;

import java.io.IOException;
import java.net.*;

public class TestSocketSender {

    private DatagramSocket sock;

    public static void main(String[] args) {
        new TestSocketSender();
    }

    public TestSocketSender(){
        try {
            sock = new DatagramSocket();//, Inet4Address.getLocalHost());
            sendData("Hello World\u00A9");
        } catch (SocketException ex) {
            ex.printStackTrace();
        } catch(IOException e){
            e.printStackTrace();
        }
    }

    private void sendData(String data) throws IOException{
        DatagramPacket datagram = new DatagramPacket(data.getBytes("utf-8"), data.length(), InetAddress.getLocalHost(), 5060);
        sock.send(datagram);
    }
}

UDP 服务器

package testsocket;

import java.io.IOException;
import java.net.*;

public class TestSocketListerner {

    private DatagramSocket sock;

    public static void main(String[] args) {
        new TestSocketListerner();
    }

    public TestSocketListerner(){
        try {
            sock = new DatagramSocket(5060);//, Inet4Address.getLocalHost());
            while(true){
                System.out.println(recvData());
            }
            } catch (SocketException ex) {
            ex.printStackTrace();
        } catch(IOException e){
            e.printStackTrace();
        }
    }

    private String recvData() throws IOException{
        byte[] data = new byte[100];
        DatagramPacket datagram = new DatagramPacket(data , data.length);
        sock.receive(datagram);
        return new String(datagram.getData(),datagram.getOffset(),datagram.getLength(),"utf-8");
    }


}
4

2 回答 2

1

UDP 是一种基于数据报的协议。这意味着您只能发送固定数量的数据,而对所交付的数据没有任何保证。数据包可能会丢失,内部数据可能会损坏,因为即使 CRC 在 UDP 中也不是强制性的,甚至更糟 - 由于数据包沿途有多个路由器,您发送的数据包可能会在接收端重新排序。

使用 UDP 通道实现看起来像 Stream 的东西并非易事,但肯定是可能的。您必须将数据分成小部分(系统的 MTU),将它们与一些恢复信息一起打包,为每个数据包分配序列号,并提供一些机制来重新请求在途中丢失的数据包。

于 2012-05-22T09:14:11.347 回答
-1

先发长度。

让您的发件人先打包字节,然后发送长度,然后发送字符串。我建议你把它打包成四个字节。

让您的阅读器读取 4 个字节,然后重建长度,然后读取字符串。

然后您可以处理数据未到达和超时等问题......

于 2012-05-22T09:17:13.187 回答