Java UDP消息交换可以在本地主机上工作,但不能在Internet上工作?
客户AJava UDP消息交换可以在本地主机上工作,但不能在Internet上工作?,java,udp,ip,localhost,ports,Java,Udp,Ip,Localhost,Ports,客户A 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 {
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地址放进去时,它只是发送消息,什么也没有收到
有人能给我指一下正确的方向吗
谢谢大家! 您应该使用
DatagramSocket
的bind
方法将其绑定到internet接口,否则它只能侦听127.0.0.1
或localhost
。像这样:
DatagramSocket socket = new DatagramSocket(null);
socket.bind(new InetSocketAddress(InetAddress.getByName("your.ip.add.ress"),5005);
如果您在路由器后面,那么您应该监听路由器提供给您的本地IP地址,并在路由器设置中使用端口转发到此地址。您应该使用
DatagramSocket
的bind
方法将其绑定到internet接口,否则它只监听127.0.0.1
或localhost
。像这样:
DatagramSocket socket = new DatagramSocket(null);
socket.bind(new InetSocketAddress(InetAddress.getByName("your.ip.add.ress"),5005);
如果您在路由器后面,那么您应该监听路由器提供给您的本地IP地址,并在路由器设置中使用端口转发到此地址。我建议使用带有TCP和UDP套接字的工具:
我用它来解决双向套接字程序的问题。您可以使用两个SocketTest程序和比较结果等对链接进行端到端测试。非常有用。您是否有可能在防火墙和/或NAT后面?我确保端口在路由器上转发?请描述您的网络设置,不清楚您在哪里运行这两个进程。您是否在防火墙和/或NAT后面?我已确保端口在我的路由器上转发?请描述您的网络设置,不清楚您在哪里运行这两个进程。抱歉,这应该是客户端A还是客户端B?两个客户端都应该有自己的ip,否则他们将无法通过internet看到彼此。Localhost和127.0.0.1应仅在同一台计算机上运行时适用。当我在线程“main”java.net.BindException中运行时,我在线程“main”java.net.BindException:无法分配请求的地址请描述您的网络设置。您提到了一些用于转发端口的路由器。我将编辑我的答案。Win7上的Ubuntu虚拟机无线连接到路由器,转发了我在路由器上使用的端口,并使用了我的公共IP地址。对不起,这应该是客户端a还是客户端B?两个客户端都应该有自己的IP,否则他们将无法通过internet看到对方。Localhost和127.0.0.1应仅在同一台计算机上运行时适用。当我在线程“main”java.net.BindException中运行时,我在线程“main”java.net.BindException:无法分配请求的地址请描述您的网络设置。您提到了一些用于转发端口的路由器。我将编辑我的答案。Win7上的Ubuntu虚拟机无线连接到路由器,转发了我在路由器上使用的端口,并使用了我的公共IP地址。