大约一个星期以来,我一直在尝试创建一个简单的聊天程序,以学习如何使用数据报和套接字,继续成功我现在正在尝试制作更具功能性的最终版本,以测试我拥有的内容我学会了但是我遇到了一个很大的问题。
在两台本地计算机之间发送数据包很容易,但是当它们将它们发送到互联网上的其他计算机时,转发一直是个问题。看看这个我发现UPnP并在客户端上使用Cling创建了一个自动UPnP端口,使其更加用户友好,服务器端我总是“手动”前进,这意味着它可以在正常情况下始终接收。但客户端正面临一个我没想到的问题:他们无法通过UPnP端口接收数据报。如果你“手动”向前移动它们,它们可以接收(它们总是可以发送,服务器可以大声读取它们)。
所以我的问题是:有人可以通过UPnP端口向我展示如何发送/接收(不知道是服务器故障还是客户端故障,问题在于服务器如何接收,或者客户端如何发送) ?或者我使用UPnP端口都错了?我的路由器,它是测试主题,启用了UPnp端口,我已经在我能想到的每个配置中测试了UDP和TCP端口以及datagramsockets和multicastsockets。
TL:DR使用UPnP或找到有关如何通过路由器/调制解调器发送/接收数据报的其他解决方案。
我非常抱歉,如果代码有点凌乱/错误,而不是完整的代码,如果被问到就会发布pastebin。
客户端:
public class Client {
public MulticastSocket rsocket = new MulticastSocket(25566);
public Client() throws IOException {
//creating UPnP port using Cling...
InetAddress inet = InetAddress.getLocalHost();
PortMapping desiredMapping = new PortMapping(25566,
inet.getHostAddress(), PortMapping.Protocol.UDP,
"Chatt program");
UpnpServiceImpl upnpService = new UpnpServiceImpl(
new PortMappingListener(desiredMapping));
upnpService.getControlPoint().search();
// loop the loop to get values from text fields used
// to receive messages from the server.
//point of interest, this is where the client should receive data, works on a normal
//portforward, doesn't on a UPnP port, no idea why.
byte[] info = new byte[256];
while (true) {
DatagramPacket receive = new DatagramPacket(info, info.length);
rsocket.receive(receive);
String rmessage = new String(receive.getData(), 0,receive.getLength());
System.Out.println(rmessage);
}
}
public static void main(String[] args) throws IOException {
new Client();
}
}
服务器:
public class Server {
public MulticastSocket rsocket = new MulticastSocket(25565);
public Server() throws IOException {
String rmessage = new String("a message");
// send to clients, not working on UPnP port
send(rmessage, 25566);
}
public void send(String msg, int port) throws IOException {
byte[] message = msg.getBytes();
DatagramPacket gpacket = new DatagramPacket(message,message.length, address, 25566);
rsocket.send(gpacket);
}
public static void main(String[] args) throws IOException {
new Server();
}
}