UPnP发送/接收

时间:2014-07-21 14:52:05

标签: java nat upnp

大约一个星期以来,我一直在尝试创建一个简单的聊天程序,以学习如何使用数据报和套接字,继续成功我现在正在尝试制作更具功能性的最终版本,以测试我拥有的内容我学会了但是我遇到了一个很大的问题。

在两台本地计算机之间发送数据包很容易,但是当它们将它们发送到互联网上的其他计算机时,转发一直是个问题。看看这个我发现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();
    }
}

0 个答案:

没有答案