Java - отправка сообщения с одного компьютера на другой через соединение UDP - PullRequest
3 голосов
/ 03 марта 2012

Когда я тестировал клиент и сервер на localhost, он работает.Но затем я разделил клиент и сервер на разные машины с разными IP-адресами, и теперь пакеты не принимаются на стороне клиента.Может кто-нибудь заметить проблему с моим кодом:

Клиент:

class Csimudp {
    public static DatagramSocket ds;
    public static byte buffer[] = new byte[1024];

    public static void Myclient() throws Exception {
        while (true) {
            DatagramPacket p = new DatagramPacket(buffer, buffer.length);
            ds.receive(p);
            System.out.println(new String(p.getData(), 0, p.getLength()));
        }
    }

    public static void main(String args[]) throws Exception {
        System.out.println("for quitting client press ctrl+c");
        ds = new DatagramSocket(777);
        Myclient();
    }
}

Сервер:

class Ssimudp {
    public static DatagramSocket ds;
    public static byte buffer[] = new byte[1024];

    public static void MyServer() throws Exception {
        int pos = 0;
        while (true) {
            int c = System.in.read();
            switch (c) {
            case '~':
                System.out.println("\n Quits");
                return;
            case '\r':
                break;
            case '\n':
                ds.send(new DatagramPacket(buffer, pos, InetAddress
                        .getByName("117.201.5.150"), 777));
                pos = 0;
                break;
            default:
                buffer[pos++] = (byte) c;
            }
        }
    }

    public static void main(String args[]) throws Exception {
        System.out.println("server ready....\n please type here");
        ds = new DatagramSocket(888);
        MyServer();
    }
}

1 Ответ

3 голосов
/ 03 марта 2012

Я бы рискнул предположить, что ваши пакеты блокируются брандмауэром где-то на их пути. Я бы начал с открытия соответствующих исходящих и входящих портов UDP в брандмауэрах клиента и сервера соответственно.

Или ваш сервер может находиться за NAT шлюзом, и вам нужно настроить переадресацию портов правил, чтобы он мог принимать любые пакеты. Например, большинство маршрутизаторов ADSL фактически настроены в качестве шлюза NAT.

Другая потенциальная проблема - выбор вашего порта:

  1. Вы привязываете клиента к определенному локальному порту. В этом нет необходимости - пусть ОС сама выбирает свободный порт. Это также устранит возможность попытки использовать порт, который уже используется.

  2. Вы используете порты в диапазоне [0-1023]. Этот диапазон портов обычно зарезервирован для общеизвестных служб - фактически, в большинстве Unix-подобных систем (например, Linux) вы не можете привязать прослушивающий порт в этом диапазоне без привилегий root. В результате, довольно много интернет-провайдеров будут фильтровать этот диапазон портов в своем брандмауэре, предположительно для защиты своих пользователей.

Без дополнительной информации о сетях, соединяющих клиента с сервером, довольно сложно дать более конкретный ответ.

PS: Нет необходимости воссоздавать объект InetAddress на каждой итерации цикла - сделайте это один раз заранее ...

PS.2: Обычно компьютер, который отправляет первый пакет в сеансе UDP, считается клиентом , поскольку он также может существовать без фиксированного адреса. В этом отношении ваше назначение ролей клиент / сервер меняется на противоположное. Поэтому, читая мои пункты выше, вам придется изменить спецификации клиента / сервера, чтобы они применились к вашему коду ...

...