当我在本地主机上同时使用客户端和服务器进行测试时,其工作原理.但是随后,我将客户端和服务器拆分为具有不同IP地址的不同计算机,现在客户端未接收到数据包.任何人都可以发现我的代码存在的问题:
客户:
class Csimudp {
public static DatagramSocket ds;
public static byte buffer[] = new byte[1024];
public static void Myclient() throws Exception {
while (true) {
DatagramPacket p = new DatagramPacket(buffer, buffer.length);
ds.receive(p);
System.out.println(new String(p.getData(), 0, p.getLength()));
}
}
public static void main(String args[]) throws Exception {
System.out.println("for quitting client press ctrl+c");
ds = new DatagramSocket(777);
Myclient();
}
}
服务器:
class Ssimudp {
public static DatagramSocket ds;
public static byte buffer[] = new byte[1024];
public static void MyServer() throws Exception {
int pos = 0;
while (true) {
int c = System.in.read();
switch (c) {
case '~':
System.out.println("\n Quits");
return;
case '\r':
break;
case '\n':
ds.send(new DatagramPacket(buffer, pos, InetAddress
.getByName("117.201.5.150"), 777));
pos = 0;
break;
default:
buffer[pos++] = (byte) c;
}
}
}
public static void main(String args[]) throws Exception {
System.out.println("server ready....\n please type here");
ds = new DatagramSocket(888);
MyServer();
}
}
解决方法:
我可能会猜测您的数据包正被某个位置的防火墙阻止.首先,分别在客户端和服务器的防火墙中打开相应的传出和传入UDP端口.
或者您的服务器可能位于NAT网关后面,您需要设置port forwarding规则以使其接收任何数据包.例如,大多数ADSL路由器实际上都设置为NAT网关.
另一个潜在的问题是您的端口选择:
>您正在将客户端绑定到特定的本地端口.无需这样做-让操作系统自行选择一个空闲端口.这也将消除尝试使用已在使用的端口的可能性.
>您正在使用[0-1023]范围内的端口.通常,此端口范围是为知名服务保留的-实际上,在大多数类似Unix的系统(例如Linux)上,如果没有root特权,则无法在该范围内绑定侦听端口.结果,相当多的ISP将在防火墙中过滤该端口范围,以保护用户.
如果没有有关将客户端连接到服务器的网络的更多信息,很难提供更具体的答案.
PS:不需要在循环的每次迭代中重新创建InetAddress对象-事先执行一次…
PS.2:通常,在UDP会话中发送第一个数据包的计算机被视为客户端,因为它也是没有固定地址就可以存在的计算机.在这方面,您对客户端/服务器角色的分配是相反的.因此,在阅读我的上述要点时,您将不得不颠倒客户机/服务器规范,以使其适用于您的代码…
标签:networking,udp,java
来源: https://codeday.me/bug/20191201/2082416.html