通过路由器使用套接字连接两个Android设备

时间:2017-09-19 13:20:37

标签: java android sockets serversocket

特别是Android。

我将尝试在两个设备(android - android)之间建立连接,其中一个将创建服务器套接字,将另一个设备连接到客户端,关闭套接字,并且两个设备之间的连接仍然存在。这么简单。

服务器

@Override
public void onResume() {
    super.onResume();
    //// !!! only for test !!!
    (new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                int port = 33000;
                SocketAddress allInterfaces = new InetSocketAddress("0.0.0.0", port);
                ServerSocketChannel channel = MuxServerSocketChannelFactory
                        .openAndBindServerSocketChannel(null, allInterfaces, 3);
                ServerSocket server = channel.socket();

                Socket socket = server.accept();
                Log.i("test", "host was connected!!!: " + socket.getInetAddress().getHostAddress());
                callback.onConnected(socket);
                server.close();
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
    })).start();

    if (true) return;
    //// !!! end test on real device !!!
}

客户端

int privateServerPort = 33000;
int publicServerPort = 25000;
InetAddress privateServerIpAddr = InetAddress.getByName("172.23.9.120");
InetAddress publicServerIpAddr = InetAddress.getByName("xx.xx.xx.xx"); // correct IP address

Socket socket = new Socket(publicServerIpAddr, publicServerPort,
    privateServerIpAddr, privateServerPort);
// never connected

当这些设备不在一个LAN或一个LAN中,而是通过VPN时,会出现问题。目前无法创建此连接。 我一直在这里寻找很长时间(Stackoverflow),但它对我不起作用。我试过的一些图书馆:

Portmapper

// Discover port forwarding devices and take the first one found
List<PortMapper> mappers = PortMapperFactory.discover(networkBus, processBus);
PortMapper mapper = mappers.get(0);
// mappers always return null

Cling

final PortMapping desMapp = new PortMapping(
        33000,
        Tool.getLocalHost(false).getHostAddress(),
        PortMapping.Protocol.TCP
);
UpnpService service = new UpnpServiceImpl(new AndroidUpnpServiceConfiguration());
RegistryListener registryListener = new PortMappingListener(desMapp) {
    @Override
    public synchronized void deviceAdded(Registry registry, Device device) {
        super.deviceAdded(registry, device);
        // this callback is never call
    }
};
service.getRegistry().addListener(registryListener);
Collection<Device> all = service.getControlPoint().getRegistry().getDevices();
// the value all has 0 size
service.getControlPoint().search();
Thread.sleep(5000); // anything value
all = service.getControlPoint().getRegistry().getDevices();
// again the size is 0

是否有一个非常简单的示例,说明服务器和客户端应该如何? 我知道的所有IP地址和端口。我在华为P9 Lite,Elephone P9000上测试它。 我不使用UPnP,NAT等。 非常感谢你的帮助。

0 个答案:

没有答案