2015-03-14 5 views
1

Мне нужно создать программу, которая будет отправлять и получать сообщения на удаленный IP-адрес. Поэтому в основном это должно имитировать службу обмена сообщениями. В программе вы должны ввести IP-адрес, и данные будут отправлены на этот конкретный адрес. В настоящее время я могу отправить, но на удаленном компьютере с IP-адресом, контент не получен и наоборот. Пожалуйста, не могли бы вы помочь мне понять, почему он не работает.Служба обмена сообщениями UDP

public class UDPchat extends Thread 
{ 
    private final static BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
    int port=1234;        // port to send/receive datagrams on 
    String remoteIPaddress= null;  // IP to send datagrams 

    // constructor, parameter is command line parameters 
    public UDPchat(String IPAdrr) throws Exception 
    { 

    System.out.println("chat program: IP address " + InetAddress.getLocalHost().toString() + " port " + port); 

    start();  // start thread to receive and display datagrams 
    // loop waiting for keyboard input, send datagram to remote IP     
    while(true) 
     try 
     { 
     String s = in.readLine();      // read a String 
     System.out.println("Sending to " + IPAdrr + " socket " + port + " data: " + s); 
     byte[] data = s.getBytes();          // convert to byte array 
     DatagramSocket theSocket = new DatagramSocket();    // create datagram socket and the datagram 
     DatagramPacket theOutput = new DatagramPacket(data, data.length, InetAddress.getByName(IPAdrr), port); 
     theSocket.send(theOutput);          // and send the datagram 
     System.out.println("send everything"); 
     start(); 

     } 
     catch (Exception e) {System.out.println("Eroor sending datagram " + e); 
    // thread run method, receives datagram and display contents as a string 
    public void run()     
     { 
      try 
       { 
       // open DatagramSocket to receive 
       DatagramSocket ds = new DatagramSocket(port); 
       // loop forever reading datagrams from the DatagramSocket 
       while (true) 
       { 
       byte[] buffer = new byte[65507]; 
       // array to put datagrams in 
       DatagramPacket dp = new DatagramPacket(buffer, buffer.length); // DatagramPacket to hold the datagram 
       ds.receive(dp); 
       // wait for next datagram 
       String s = new String(dp.getData(),0,dp.getLength());  // get contenets as a String 
       System.out.println("UDP datagram length " + s.length()+ " from IP " + dp.getAddress() + " received: " + s); 
       } 
       } 
      catch (SocketException se) {System.err.println("chat error " + se); } 
      catch (IOException se) {System.err.println("chat error " + se);} 
      System.exit(1);              // exit on error 
     } 

public static void main(String args[]) throws Exception 
{ 
    Scanner in = new Scanner(System.in); 
    String remoteIPaddress = in.nextLine(); 
    UDPchat c=new UDPchat(remoteIPaddress); 
} 

} 
+0

это работает, если ваш клиент и сервер находятся на локальном компьютере? –

+0

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

ответ

1

Во-первых, для службы обмена сообщениями вы должны использовать TCP для надежности .

UDP предназначен для связи в режиме реального времени, в котором последние данные более важны.

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

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

Когда пакет переходит от компьютера A к компьютеру B через маршрутизатор, маршрутизатор сопоставляет локальный порт компьютера с некоторым случайным внешним портом.

Итак, если компьютеру B необходимо отправить пакет на компьютер A, компьютер B должен ответить на внешний IP-порт, назначенный компьютеру A маршрутизатором. Затем маршрутизатор перенаправит его на локальный IP-порт компьютера A.

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

Пожалуйста, ознакомьтесь с некоторыми сетевыми понятиями, такими как Network Address Translation, UDP, прежде чем работать с материалами TCP/UDP.

Этот источник может помочь:

Network Address Translation

How NAT works?

UDP Hole Punching

RFC 4787 NAT Behavioral Requirements UDP

RFC 5128 P2P across NAT

Вы можете также обратиться к некоторым из моих ответов на те же/подобными проблемами здесь:

How to Send A UDP packet via public IP through NAT?

How to send an UDP message for an array of clients (java)

UDP Image transfer works depending on network

+0

Не используйте форматирование цитаты для текста, который не цитируется. – EJP

Смежные вопросы