gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:39:58 24 4
gpt4 key购买 nike

我有一个问题,当我的笔记本电脑位于路由器后面并且服务器使用我的外部 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);

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

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

              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);

但是,这种方法不起作用,即远程计算机上的客户端无法找到预期的笔记本电脑的 IP 地址。

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

最佳答案

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

关于java - 服务器如何找到我在路由器后面的IP地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20340605/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com