服务器如何找到路由器后面的IP地址?

时间:2013-12-03 00:28:07

标签: java sockets udp

我有一个问题,当我的笔记本电脑在路由器后面并且服务器正在使用我的外部IP地址时,服务器如何成功地将udp数据包发送到我的笔记本电脑。我正在尝试udp客户端和服务器代码。我使用的代码在以下链接中。

http://systembash.com/content/a-simple-java-udp-server-and-udp-client/

这就是我所做的。

首先,我将服务器上传到远程主机。

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

class UDPServer
{
   public static void main(String args[]) throws Exception
      {
         DatagramSocket serverSocket = new DatagramSocket(9876);
            byte[] receiveData = new byte[1024];
            byte[] sendData = new byte[1024];
            while(true)
               {
                  DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                  serverSocket.receive(receivePacket);
                  String sentence = new String( receivePacket.getData());
                  System.out.println("RECEIVED: " + sentence);
                  InetAddress IPAddress = receivePacket.getAddress();
                  int port = receivePacket.getPort();
                  String capitalizedSentence = sentence.toUpperCase();
                  sendData = capitalizedSentence.getBytes();
                  DatagramPacket sendPacket =
                  new DatagramPacket(sendData, sendData.length, IPAddress, port);
                  serverSocket.send(sendPacket);
               }
      }
}

然后,我从我的笔记本电脑上运行了这个客户端代码,它按照建议工作。

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

class UDPClient
{
   public static void main(String args[]) throws Exception
   {
      BufferedReader inFromUser =
         new BufferedReader(new InputStreamReader(System.in));
      DatagramSocket clientSocket = new DatagramSocket();
      InetAddress IPAddress = InetAddress.getByName("localhost");
      byte[] sendData = new byte[1024];
      byte[] receiveData = new byte[1024];
      String sentence = inFromUser.readLine();
      sendData = sentence.getBytes();
      DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
      clientSocket.send(sendPacket);
      DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
      clientSocket.receive(receivePacket);
      String modifiedSentence = new String(receivePacket.getData());
      System.out.println("FROM SERVER:" + modifiedSentence);
      clientSocket.close();
   }
}

但是,我的困惑是这个。

在服务器代码的以下部分

              DatagramPacket sendPacket =
              new DatagramPacket(sendData, sendData.length, IPAddress, port);
              serverSocket.send(sendPacket);

服务器使用我的外部ipaddress。由于客户端收到发送的数据包,因此该请求成功。怎么可能,因为我的笔记本电脑在路由器后面?

为了测试我是否可以让客户端向我的笔记本电脑中的服务器发送请求以检查是否真的可以在路由器后面的机器上发送udp数据包,我将服务器代码放入我的笔记本电脑然后运行客户端远程机器中的代码。在客户端代码中,我将ipaddress更新为我的外部ipaddress,这是我在服务器代码中打印接收到的数据包的ipaddress。

              InetAddress IPAddress = receivePacket.getAddress();
              System.out.println(IPAddress)
              int port = receivePacket.getPort();
              String capitalizedSentence = sentence.toUpperCase();
              sendData = capitalizedSentence.getBytes();
              DatagramPacket sendPacket =
              new DatagramPacket(sendData, sendData.length, IPAddress, port);
              serverSocket.send(sendPacket);

但是,这种方法不起作用,即远程机器上的客户端找不到预期的笔记本电脑的ipaddress。

但是,服务器如何将请求udp数据包成功发送到我的笔记本电脑是我的问题?谢谢!

1 个答案:

答案 0 :(得分:4)

通常,服务器知道您的内部IP地址,即使有,也无法向您发送数据包。会发生什么情况,路由器会记住您发送了包含某个源端口的数据包,并将所有回复转发给您。