java发送消息给另外计算机_Java-通过UDP连接将消息从一台PC发送到另一台PC

郗丰
2023-12-01

当我在本地主机上同时使用客户端和服务器进行测试时,其工作原理.但是随后,我将客户端和服务器拆分为具有不同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

 类似资料: