【问题标题】:java datagram socket not received (localhost)未收到 java 数据报套接字(本地主机)
【发布时间】:2019-03-19 22:10:12
【问题描述】:

这是一个常见问题,但我似乎无法完成这项工作,这不是因为防火墙,我确保 Intellij 已获得授权。

UDP 发件人:

public static void main(String[] args){
    Timer timer = new Timer();
    try {
        InetAddress ip = InetAddress.getLocalHost();
        int port = 9850;
        byte[] buffer = new byte[100];
        DatagramPacket packet = new DatagramPacket(buffer, 100, ip, port);

        try {
            DatagramSocket socket = new DatagramSocket(port, ip);
            timer.schedule(new TimerTask() {
                               @Override
                               public void run() {
                                   System.out.println("will send !");
                                   try {
                                       socket.send(packet);
                                   }catch (IOException e){
                                       e.printStackTrace();
                                       return;
                                   }
                                   System.out.println("was sent !");
                               }
                           },500, 500);
        } catch (SocketException e) {
            e.printStackTrace();
            return;
        }
    }catch (UnknownHostException e){
        e.printStackTrace();
        return;
    }
}

UDP 接收器

    public static void main(String[] args) {
    int port = 8888;
    byte[] buffer = new byte[100];
    DatagramPacket packet = new DatagramPacket(buffer, 100);

    try {
        DatagramSocket socket = new DatagramSocket(port);

        while(true) {
            try {
                System.out.println("ready to receive");
                socket.receive(packet);
                System.out.println("received a packet");
            }catch (IOException e){
                e.printStackTrace();
                return;
            }
        }
    }catch(SocketException e){
        e.printStackTrace();
        return;
    }
}

数据包已发送,发送方显示“将发送/已发送”,但接收方未收到任何内容,已被阻止,仅显示“准备接收”

ps:没关系套接字没有关闭...

【问题讨论】:

    标签: java udp


    【解决方案1】:

    仔细查看您正在使用的对DatagramSocketDatagramPacket 的各种调用,因为您正在滥用它们。

    在 Sender 程序中,您正在“构造 [ing] 一个数据报包,用于将长度为 length 的数据包发送到指定主机上的指定端口号。”然后,您将“创建 [ing] 一个绑定到指定本地地址的数据报套接字”。当您使用相同的端口和InetAddr 时,您实际上是在向您列出的相同地址发送数据包。

    在 Receiver 程序中,您“构造[]一个数据报套接字并将其绑定[]到本地主机上的指定端口。”这一次,您将它绑定到与发送它的端口不同的端口。 (8888 vs 9850,您将数据包发送到)。

    对于发送方,尝试通过调用DatagramSocket() 创建一个绑定到随机端口的套接字。对于接收方,更改套接字,使其绑定到发送方尝试将其发送到的编号相同的端口(例如 9850)

    【讨论】:

    • 如果我理解的话,我添加到数据报套接字的端口是源端口,而我添加到数据报包的端口是目标端口。虽然我可以有 几个 指针,其目的地具有来自同一台机器的相同端口,但只有 一个 可以监听它。我现在明白为什么之前抛出异常了!
    【解决方案2】:

    您不需要使用 while(true),因为 DatagramPacket.receive 方法将阻塞,直到收到数据报。

    问题的原因可能是一侧到另一侧的端口不同

    【讨论】:

    • 使用同一个端口会抛出异常,此时使用while(true)是人为的,只是为了测试目的
    • 你向本地主机端口 9850 发送了一个数据包,但没有人在监听该端口
    • 用端口 9850 启动接收器,然后用端口 9850 启动发送器,它应该可以工作了!
    • 虽然您的回答并不详尽,但我赞成您的回答以抵消反对票;)您是对的,尽管 dan.m 是 user2321368 的回答更有帮助。
    • 是的 dan.m 是 user2321368 答案很清楚我同意
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 2010-12-07
    相关资源
    最近更新 更多