Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TCP打孔,can';不要在android上重复使用地址_Android_Tcp_Hole Punching - Fatal编程技术网

TCP打孔,can';不要在android上重复使用地址

TCP打孔,can';不要在android上重复使用地址,android,tcp,hole-punching,Android,Tcp,Hole Punching,我有一个安卓设备,它承载着一个HTTP服务器,并且(在路由器后面)处于休眠状态。我想从一个公共服务器上访问它,而这个服务器不是虚拟的。 我在安卓设备上的8080端口运行HTTP服务器,一段时间后,我启动一个客户端线程,尝试从安卓设备上的8080端口连接到远程公共服务器。 由于某些原因,我在端口8080上启动服务器后,android客户端将无法连接。也没有任何例外。这是我的密码: Thread server = new Thread(new Runnable() { public void run

我有一个安卓设备,它承载着一个HTTP服务器,并且(在路由器后面)处于休眠状态。我想从一个公共服务器上访问它,而这个服务器不是虚拟的。 我在安卓设备上的8080端口运行HTTP服务器,一段时间后,我启动一个客户端线程,尝试从安卓设备上的8080端口连接到远程公共服务器。 由于某些原因,我在端口8080上启动服务器后,android客户端将无法连接。也没有任何例外。这是我的密码:

Thread server = new Thread(new Runnable() {
public void run() {
    super.run();

    try {
        ServerSocket serverSocket = new ServerSocket();
        serverSocket.setReuseAddress(true);
        serverSocket.bind(new InetSocketAddress("192.168.1.102", 8080));

        while(isRunning){
            try {
                System.out.println("Listening for new connection");
                Socket socket = serverSocket.accept();
                System.out.println("incoming connection accepted");
                new Thread(new ConnectionHandler(socket)).start();    
            } catch (IOException e) {
                e.printStackTrace();
            }                             
        }
        serverSocket.close();
    } 
    catch (IOException e) {
        e.printStackTrace();
    }
}
});
server.start();



// sleep several seconds before launch of client
Thread.currentThread().sleep(5 * 1000);


Thread client = new Thread(new Runnable() {
public void run() {
    super.run();
    try {
        /* .. */
        Inet4Address localaddr = (Inet4Address) InetAddress
                .getByName("192.168.1.102");
        // Inet4Address remoteaddr = (Inet4Address)
        // InetAddress.getByName("122.176.73.10");
        System.out.println("connecting to 122.176.73.10");

        Socket socket = new Socket();

        socket.setReuseAddress(true);
        System.out.println("[Client]socket.isBound():" + socket.isBound());
        socket.bind(new InetSocketAddress("192.168.1.102", 8080));

        for (int i = 1; i < 5; i++) {
            try {
                socket.connect(new InetSocketAddress("122.176.73.10", 4040));
                System.out.println("connected to 122.176.73.10");
                break;
            } catch (Exception e) {
                System.out.println("[Client]fail to connect ");
                Thread.currentThread().sleep(i * 2 * 1000);
            }
        }
    }
}
});
client.start();
threadserver=newthread(newrunnable()){
公开募捐{
super.run();
试一试{
ServerSocket ServerSocket=新的ServerSocket();
serverSocket.setReuseAddress(true);
bind(新的InetSocketAddress(“192.168.1.102”,8080));
同时(正在运行){
试一试{
System.out.println(“侦听新连接”);
Socket=serverSocket.accept();
System.out.println(“接受传入连接”);
新线程(新连接处理程序(套接字)).start();
}捕获(IOE异常){
e、 printStackTrace();
}                             
}
serverSocket.close();
} 
捕获(IOE异常){
e、 printStackTrace();
}
}
});
server.start();
//在启动客户端之前睡眠几秒钟
Thread.currentThread().sleep(5*1000);
线程客户端=新线程(新可运行(){
公开募捐{
super.run();
试一试{
/* .. */
Inet4Address localaddr=(Inet4Address)InetAddress
.getByName(“192.168.1.102”);
//Inet4Address remoteaddr=(Inet4Address)
//InetAddress.getByName(“122.176.73.10”);
System.out.println(“连接到122.176.73.10”);
套接字=新套接字();
socket.setReuseAddress(真);
System.out.println(“[Client]socket.isBound():”+socket.isBound());
绑定(新的InetSocketAddress(“192.168.1.102”,8080));
对于(int i=1;i<5;i++){
试一试{
socket.connect(新的InetSocketAddress(“122.176.73.10”,4040));
系统输出打印项次(“连接到122.176.73.10”);
打破
}捕获(例外e){
System.out.println(“[客户端]连接失败”);
Thread.currentThread().sleep(i*2*1000);
}
}
}
}
});
client.start();

端口号不能用于侦听传入连接和建立传出连接。
8080上的侦听套接字阻止使用该端口进行任何其他操作。

据称它在此处工作: