Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.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
Java 当我切换wifi网络时,TCP/UDP服务器套接字会发生什么情况?_Java_Android_Multithreading_Sockets_Wifi - Fatal编程技术网

Java 当我切换wifi网络时,TCP/UDP服务器套接字会发生什么情况?

Java 当我切换wifi网络时,TCP/UDP服务器套接字会发生什么情况?,java,android,multithreading,sockets,wifi,Java,Android,Multithreading,Sockets,Wifi,当我突然更改wifi网络时,我的应用程序中的serversocket会发生什么变化?我猜它会关闭,因为我的设备将获得一个新的IP,至少在TCP中是这样,UDP多播套接字也容易出现这种情况吗?当网络发生变化时,如何结束以前的服务器套接字线程并启动新的服务器套接字线程?一种解决方案是使用超时,另一种解决方案是使用一个标志来指示无限循环是否应该结束,但由于侦听套接字是一个阻塞函数,因此无论如何都会产生异常/错误 任何想法都将不胜感激!:) 编辑:我的服务器线程示例 ServerSocket ss =

当我突然更改wifi网络时,我的应用程序中的serversocket会发生什么变化?我猜它会关闭,因为我的设备将获得一个新的IP,至少在TCP中是这样,UDP多播套接字也容易出现这种情况吗?当网络发生变化时,如何结束以前的服务器套接字线程并启动新的服务器套接字线程?一种解决方案是使用超时,另一种解决方案是使用一个标志来指示无限循环是否应该结束,但由于侦听套接字是一个阻塞函数,因此无论如何都会产生异常/错误

任何想法都将不胜感激!:)

编辑:我的服务器线程示例

ServerSocket ss = new ServerSocket(4445);
while(true){
    Socket socket = ss.accept();
    ObjectInputStream in  = new ObjectInputStream(socket.getInputStream());
    Object obj = in.readObject();
    Log.i("TAG", "Received: " + obj.toString());
    in.close();
    socket.close();
}

TCPIP连接将中断。所以客户端必须再次连接

如果重新连接后IP没有改变,UDP将正常。当然,如果你传输UDP,它不会对那台机器产生影响


如果您可以处理TCPIP,您应该会得到一个异常。

未绑定到该地址的UDP套接字将保持打开状态,因为它们是无状态的。未绑定到该地址的TCP侦听套接字也将保持打开状态

连接的TCP套接字可能会被切断(RST)或只是停留到超时


一个鲜为人知的事实是,IP要求设备在默认情况下接受指向其在任何接口上配置的任何地址的数据包,无论数据包到达哪个接口。如果不是这样,路由将被破坏。根据接口的不同,可以使用数据包过滤器过滤出地址不匹配的数据包。

这是我研究过的一段时间:UDP不是先建立某种连接吗?在没有连接的情况下随机爆破UDP数据包似乎不会work@TheLQ:据我所知,它只发送一个带有目标ip和端口的数据包。它不保证交货。它通过网络基础设施来传递数据包。由于连接较少,因此不会受到网络故障的影响。@THLQ UDP是一种无连接协议,因此不会建立连接。(可以在UDP套接字上调用connect(),但所做的只是为send()设置一个默认IP地址/端口以发送到,实际上并不会更改任何逻辑)我应该查找的异常名称是什么?@MikeMokkas:它将是IOException。请检查编辑。所以,当我更改网络时,我的ServerSocket不会关闭,但使用
socket=ss.start()
会发生什么?这会使我的服务器套接字绑定吗?我的应用程序会抛出错误并强制关闭吗?如何克服这个问题,我应该注意的例外是什么?将这个答案概括为“为绑定调用指定了INADR_ANY(0)的侦听套接字不会被破坏。但是处于连接状态的活动TCP套接字将被破坏。”我不熟悉安卓,我假设“新服务器套接字(4445)”上面绑定到IP=0上的端口4445。@selbie:它们不一定会断开:例如,我已将自己机器之间的SSH超时设置为几个小时。如果我带着笔记本电脑离开家,SSH仍然打开,连接到外部网络,然后在回家后,仍然处于超时状态,SSH连接将继续。关键是:IP地址不绑定到接口,而是绑定到主机。为接口设置IP地址实际上与路由有关,即在哪个设备上为特定子网发送数据包(首先)。