сокет Java датаграммы не получен (localhost) - PullRequest
2 голосов
/ 19 марта 2019

Это обычная проблема, но я не могу заставить ее работать, это не из-за брандмауэра, я убедился, что 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 RECEIVER

    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 ]

3 голосов
/ 19 марта 2019

Внимательно посмотрите на различные вызовы DatagramSocket и DatagramPacket, которые вы используете, так как вы их неправильно используете.

В программе Sender вы "строите [дата] дейтаграммупакет для отправки пакетов длиной length на указанный номер порта на указанном хосте. "Затем вы «создаете [дата] сокет дейтаграммы, связанный с указанным локальным адресом».Поскольку вы используете тот же порт и InetAddr, вы, по сути, отправляете пакет по тому же адресу, который указан в списке.

В программе Receiver вы "создаете [] сокет дейтаграммы и связываете [] к указанному порту на локальной машине. "На этот раз вы привязываете его к другому порту, чем тот, на который вы его отправляете.(8888 против 9850, куда вы отправляете пакет).

Для Отправителя, пытающегося создать сокет, связанный с произвольным портом, путем вызова DatagramSocket().Для получателя измените сокет так, чтобы он был связан с тем же пронумерованным портом, на который отправитель пытается отправить его (например, 9850)

0 голосов
/ 19 марта 2019

вам не нужно использовать while (true), потому что метод DatagramPacket.receive будет блокировать до получения дейтаграммы.

причиной проблемы может быть порт, который отличается от одной стороны к другой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...