2012-03-14 3 views
2

A 클라이언트Java UDP 메시지 교환은 localhost를 통해 작동하지만 인터넷은 작동하지 않습니까?

import java.io.*; 
    import java.net.*; 
    import java.util.*; 

    public class ClientA 
    { 
    final private static int PORT = 5005; // arbitrarily assigned port to use 

public static void main(String args[]) throws 
IOException 
{ 
    DatagramSocket socket = new DatagramSocket(PORT); // create new connection on that port 
    while (true) 
    { 
     byte buffer[] = new byte[256]; // data buffer 
     DatagramPacket packet = new DatagramPacket(buffer, buffer.length); // new packet containing buffer 

     socket.receive(packet); // look for packet 

     String clientBMsg = new String(packet.getData()); // get data from received packet 
     InetAddress address = packet.getAddress(); // get address of received packet 

     System.out.println("ClientB at " + address + " says " + clientBMsg); 

     buffer = null; 
     String msgString = "I'm ClientA, vegetables are fun"; 
     buffer = msgString.getBytes(); // put String in buffer 


     int port = packet.getPort(); // get port of received packet 
     packet = new DatagramPacket(buffer, buffer.length, address, port); // create new packet with this data 
     socket.send(packet); // send packet back containing new buffer! 
     System.out.println("Message Sent"); 
     socket.close(); 
     } 
} 
    } 

클라이언트 B

import java.io.*; 
    import java.net.*; 


    public class ClientB 
    { 
final private static int PORT = 5005; // arbitrarily assigned port - same as server 

public static void main(String args[]) throws 
    IOException { 
     // if (args.length == 0) { // requires host 
      // System.err.println 
       // ("Please specify host"); 
      // System.exit(-1); 
     // } 
     // String host = args[0]; // user defined host 
     DatagramSocket socket = new DatagramSocket(); // open new socket 

     String host = "localhost";//"86.0.164.207"; 
     byte message[] = new byte[256]; // empty message 
     String msgString = "Hello, I'm client B and I like trees"; 
     message = msgString.getBytes(); // put String in buffer 

     InetAddress address = InetAddress.getByName(host); // determines address 
     System.out.println("Sending to: " + address); // tells user it's doing something 
     DatagramPacket packet = new DatagramPacket(message, message.length, address, PORT); // create packet to send 

     socket.send(packet); // send packet 
     System.out.println("Message Sent"); 

     message = new byte[256]; 
     packet = new DatagramPacket(message, message.length); 
     socket.receive(packet); // wait for response 
     String clientAreply = new String(packet.getData()); 
     System.out.println("ClientA at " + host + " says " + clientAreply); 
     socket.close(); 

     } 
     } 

이 로컬 호스트를 통해 작동하지만 내가 내 IP 주소를 넣을 때, 그냥 메시지를 전송하고 아무것도 수신되지 왜 이해가 안 돼요.

누구나 올바른 방향으로 나를 가리킬 수 있습니까?

감사합니다.

+1

우연히 방화벽 및/또는 NAT를 사용하고 있습니까? –

+0

라우터에서 포트가 전달되었는지 확인 했습니까? – lex

+0

네트워크 설정을 설명해주십시오. 두 가지 프로세스를 어디서 실행해야할지 명확하지 않습니다. –

답변

4

당신은 그렇지 않은 경우는 127.0.0.1 또는 localhost에서 수신, 인터넷 인터페이스에 바인딩하는 DatagramSocketbind 방법을 사용해야합니다. 이처럼 : 당신이 라우터 뒤에있는 경우

DatagramSocket socket = new DatagramSocket(null); 
socket.bind(new InetSocketAddress(InetAddress.getByName("your.ip.add.ress"),5005); 

그런 다음 라우터에서 제공 한 로컬 IP 주소에서 수신 대기해야하며, 라우터 설정에서이 주소로 포트 포워딩을 사용합니다.

+0

죄송합니다. 고객 A 또는 B에 해당해야합니까? – lex

+0

둘 다. 감사합니다 Carl T. –

+0

두 클라이언트 모두 인터넷을 통해 서로를 볼 수 없으면 자신의 IP를 가져야합니다. Localhost 및 127.0.0.1은 동일한 시스템에서 실행중인 경우에만 적용해야합니다. – Stainedart

0

나는 TCP 및 UDP 소켓과 Socket Test 도구를 사용하여 제안 할 수 있습니다 :

나는 2 웨이 소켓 프로그램에 문제 촬영 문제로 사용했다. 두 개의 SocketTest 프로그램과 비교 결과 등을 사용하여 철저한 테스트를 수행 할 수 있습니다. 매우 유용합니다.