Неизвестные ошибки с пакетами дейтаграмм и сокетами - Сеть Java - PullRequest
1 голос
/ 15 ноября 2010

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

Я тестировал егос сервером и клиентом, работающими одновременно на моем собственном ПК, и это прекрасно работает, но если я пытаюсь перенести сервер на другой ПК, это ... не работает.

Теперь я знаю, что, должно быть, я что-то не так делаю с сокетами / адресами / портами bleh ... Я раньше не работал с сетями, поэтому я мало что знаю.

Вот код сервера:

    import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.net.UnknownHostException;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketException;
import java.sql.Connection;
import java.util.ArrayList;

public class ServerThread extends Thread {

    private boolean needsToRun;
    private DatagramSocket socket;

    public ServerThread() {
        super();
        needsToRun = true;
        try {
            socket = new DatagramSocket(4446);
        }
        catch (SocketException ex) {
            ex.printStackTrace();
        }
    }

    @Override
    public void run() {
        while(needsToRun) {
            byte[] buf = new byte[265];
            DatagramPacket packet = new DatagramPacket(buf,buf.length);
            try {
                socket.receive(packet);
            }
            catch(IOException e) {
                e.printStackTrace();
            }
            String data = new String(packet.getData(),0,packet.getLength());
            if(data != null)
                System.out.println(data);
        }
        socket.close();
    }
}

Вы увидите несколько неиспользованных импортов, но я просто сократил код, чтобы сделать его базовым (большая часть его пришла от того, что я на самом деле хочусервер, чтобы сделать с данными, как только они получены, но у меня эта часть работает).

Вот код клиента:

    import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class Main {

        public static void main(String[] args) throws SocketException, UnknownHostException, IOException {

            // get a datagram socket
        DatagramSocket socket = new DatagramSocket();

            // send request
        String testInfo = "Hi";
        byte[] buf = testInfo.getBytes();

        /*This could possible be a point at which the code won't work.
         *to get the bytes of the IP address of the computer I'm trying to run the server 
         *on I just did
         * byte[] address = InetAddress.getLocalHost().getAddress();
         * on the computer I was running the server on. I'm 95% sure that the IP addresses 
         * match.
         */
        byte[] inet = {-64,-88,1,5};
        InetAddress address = InetAddress.getByAddress(inet);
        DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 4446);
        try {
            socket.send(packet);
        }
        catch(Exception e) {
            e.printStackTrace();
        }

        socket.close();
    }
}

Очевидные части кода, я имеюпроверил, как порт и адрес (см. комментарий в коде).

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

Спасибо за любые предложения.

1 Ответ

1 голос
/ 15 ноября 2010

Я протестировал его с сервером и клиентом, работающими одновременно на моем собственном ПК, и он отлично работает, но если я пытаюсь перенести сервер на другой ПК, это ... нет.

Я ожидаю, что это какая-то проблема с сетью или брандмауэром, а не проблема с клиентскими и серверными приложениями Java.(Доказательство того, что они могут говорить при работе на одной машине, указывает на это ...)

Проверьте эти вещи:

  • Убедитесь, что клиент может разрешить серверАйпи адрес;например, попробуйте пропинговать его или подключиться к нему через другой порт, который, как известно, поддерживается сервером.

  • Убедитесь, что программные брандмауэры на клиентских и серверных компьютерах разрешают трафик UDP через порт 4446.

  • Если между двумя компьютерами есть мост и / или маршрутизатор, убедитесь, что он не блокирует трафик UDP на порту 4446.

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