Java网络编程udp接收端收不到数据的问题

WaitingGdot 2014-12-28 01:53:26
本人新手 最近在学习Java的网络编程 遇到一个问题 代码如下图。 主机名称和端口都已设置正确,但就是接受不到数据。 请大家帮忙指点一下 谢谢!~
...全文
1775 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jyf64016276 2015-10-23
  • 打赏
  • 举报
回复
你分别写进2个类文件吧、先运行receive,再运行send,学的毕老师的视频吧
WaitingGdot 2014-12-30
  • 打赏
  • 举报
回复
引用 9 楼 guest6379 的回复:
[quote=引用 8 楼 mutourenjiqiren 的回复:] 同时执行肯定不是的,只是时间间隔太短,数据还没发出去就close了
这里没涉及多线程,应该不会出现这样的问题吧,都在主线程中一条条的执行。send返回以后,才会执行下面的那条close。 楼主,你那边不加Thread.sleep是每次都收不到还是偶尔出现收不到?[/quote] 试了好多遍 只要不加sleep就一定收不到
乔巴好萌 2014-12-30
  • 打赏
  • 举报
回复
udp的这种问题 为什么不开wireshark抓包看下呢 问题无非就是client有没有把包发过来 再就是发过来后 server有没有收到 中间有没有被防火墙过滤掉 如果是linux下 再看看iptables selinux什么配置的 如果单纯只从代码来看这个问题 效率很低下啊
guest6379 2014-12-30
  • 打赏
  • 举报
回复
引用 10 楼 WaitingGdot 的回复:
[quote=引用 9 楼 guest6379 的回复:] [quote=引用 8 楼 mutourenjiqiren 的回复:] 同时执行肯定不是的,只是时间间隔太短,数据还没发出去就close了
这里没涉及多线程,应该不会出现这样的问题吧,都在主线程中一条条的执行。send返回以后,才会执行下面的那条close。 楼主,你那边不加Thread.sleep是每次都收不到还是偶尔出现收不到?[/quote] 试了好多遍 只要不加sleep就一定收不到[/quote] 代码贴出来(别截图),把你运行的步骤详细说说。你这个情况太奇葩了
guest6379 2014-12-29
  • 打赏
  • 举报
回复
引用 5 楼 WaitingGdot 的回复:
谢谢你的回复! 你的代码我试了一下 可以运行成功。 而且我的Udp接收器可以收到你的UdpSender发送的信息,但是我的UdpSend发送的信息在我们两个的接受端都收不到,所以应该是我的发送器代码的问题。可我就是找不出问题在哪
我都是在本机上做的测试,你最初的那个sender发送的信息要确保也发送到本机的receiver才行的。 你的那个截图的代码,把getByName("WG") 改成 getByName("localhost") 就可以了吧。 我用你最初的那个代码试了,都可以接收到的。
WaitingGdot 2014-12-29
  • 打赏
  • 举报
回复
引用 3 楼 guest6379 的回复:
[quote=引用 2 楼 WaitingGdot 的回复:] ip试过了 还是不行 谢谢回复!
你运行程序的时机应该不对,先运行Receive端,再运行Send端的程序。 看你的截图代码,你Receive端都没有等待,一运行就结束了,速度很快,根本来不及等待Send端的发送数据过来。 你试试在 ds.receive(dp); 前面插入一行 Thread.sleep(10000);等待10秒,就能收到信息了[/quote] 谢谢你的回复! 你的代码我试了一下 可以运行成功。 而且我的Udp接收器可以收到你的UdpSender发送的信息,但是我的UdpSend发送的信息在我们两个的接受端都收不到,所以应该是我的发送器代码的问题。可我就是找不出问题在哪
guest6379 2014-12-29
  • 打赏
  • 举报
回复
引用 8 楼 mutourenjiqiren 的回复:
同时执行肯定不是的,只是时间间隔太短,数据还没发出去就close了
这里没涉及多线程,应该不会出现这样的问题吧,都在主线程中一条条的执行。send返回以后,才会执行下面的那条close。 楼主,你那边不加Thread.sleep是每次都收不到还是偶尔出现收不到?
mutourenjiqiren 2014-12-29
  • 打赏
  • 举报
回复
同时执行肯定不是的,只是时间间隔太短,数据还没发出去就close了
WaitingGdot 2014-12-29
  • 打赏
  • 举报
回复
引用 5 楼 WaitingGdot 的回复:
[quote=引用 3 楼 guest6379 的回复:] [quote=引用 2 楼 WaitingGdot 的回复:] ip试过了 还是不行 谢谢回复!
你运行程序的时机应该不对,先运行Receive端,再运行Send端的程序。 看你的截图代码,你Receive端都没有等待,一运行就结束了,速度很快,根本来不及等待Send端的发送数据过来。 你试试在 ds.receive(dp); 前面插入一行 Thread.sleep(10000);等待10秒,就能收到信息了[/quote] 谢谢你的回复! 你的代码我试了一下 可以运行成功。 而且我的Udp接收器可以收到你的UdpSender发送的信息,但是我的UdpSend发送的信息在我们两个的接受端都收不到,所以应该是我的发送器代码的问题。可我就是找不出问题在哪[/quote] 我在我的代码 ds.send(dp) 和 ds.close() 之间加了一句 Thread.sleep(1000) 就可以收到了。不加这一句的话就收不到。接收端是一直开着的。 难道不加这一句send和close就是同时执行的吗? 好奇怪的现象。。
guest6379 2014-12-28
  • 打赏
  • 举报
回复
引用 2 楼 WaitingGdot 的回复:
ip试过了 还是不行 谢谢回复!
在你代码的基础上稍微多加了一点,可以一直接收和发送消息,直到输入quit停止。 先运行接收端,再运行发送端即可。 发送端:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

public class UdpSender {
    public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket(8888);
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入要发送的信息:");
        while(true){
            String msg = scanner.nextLine();
            byte[] buf = msg.getBytes();
            
            DatagramPacket dp = new DatagramPacket(buf, buf.length, 
                    InetAddress.getByName("localhost"), 10000);
            ds.send(dp);
            System.out.printf("%s sent!", msg);
            if("quit".equalsIgnoreCase(msg))
                break;            
        }
        ds.close();
    }
}
接收端:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UdpReceiver {

    public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket(10000);
        byte[] buf = new byte[1024];
        
        DatagramPacket dp = new DatagramPacket(buf, buf.length);
        
        String data = null;
        while(!"quit".equalsIgnoreCase(data)){
            ds.receive(dp);
            
            String ip = dp.getAddress().getHostAddress();
            data = new String(dp.getData(), 0, dp.getLength());
            
            System.out.println(ip+"::"+data);
        }
        System.out.println("byebye");
        ds.close();
    }
}
guest6379 2014-12-28
  • 打赏
  • 举报
回复
引用 2 楼 WaitingGdot 的回复:
ip试过了 还是不行 谢谢回复!
你运行程序的时机应该不对,先运行Receive端,再运行Send端的程序。 看你的截图代码,你Receive端都没有等待,一运行就结束了,速度很快,根本来不及等待Send端的发送数据过来。 你试试在 ds.receive(dp); 前面插入一行 Thread.sleep(10000);等待10秒,就能收到信息了
WaitingGdot 2014-12-28
  • 打赏
  • 举报
回复
ip试过了 还是不行 谢谢回复!
guest6379 2014-12-28
  • 打赏
  • 举报
回复
先试试不用主机名,改用ip看能通吗?

62,629

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧