未收到Java数据报套接字(本地主机)

时间:2019-03-19 13:27:19

标签: java udp

这是一个常见问题,但是我似乎无法使它正常工作,这不是由于防火墙引起的,我确保Intellij已获得授权。

UDP SENDER:

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:没关系,套接字没有关闭...

2 个答案:

答案 0 :(得分:3)

请仔细查看正在使用的对router.post('/publish', async (req, res) => { var AWS = require('aws-sdk') AWS.config.update({region: 'us-east-2'}) // myprofile exists locally, but how do I deal with this in the elastic beanstalk environment? var credentials = new AWS.SharedIniFileCredentials({profile: 'myprofile'}) AWS.config.credentials = credentials //...more stuff }) DatagramSocket的各种调用,因为它们被滥用。

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

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

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

答案 1 :(得分:0)

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

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