2011-12-02 90 views
2

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

任何想法可以理解的! :)

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

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(); 
} 

回答

3

TCPIP连接将断开。所以客户端将不得不再次连接。

UDP将确定提供您的IP重新连接之后不会改变。当然,如果你传输UDP,它不会对那台机器产生影响。

您应该在可以处理的TCPIP情况下发生异常。

+1

它是一个whiel,因为我研究过这一点:不UDP首先建立某种联系?随机爆炸没有连接的UDP数据包只是看起来不会工作 – TheLQ

+1

@TheLQ:据我所知,它只是传输一个包含目标ip和端口的数据包。它不保证交付。它直到网络基础设施来传递数据包。因为它是无连接的,所以它不会受到网络故障的影响。 –

+1

@TheLQ UDP是无连接协议,因此不建立连接。 (也可以调用connect()在UDP套接字但这一切确实设置为发送一个默认的IP地址/端口()发送到,它实际上并没有改变任何事物的逻辑) –

1

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

连接的TCP套接字可能会被切断(RST)或者直到超时。

这是一个鲜为人知的事实,即IP规定,默认情况下,设备将接受指向它在任何接口上配置的任何地址的数据包,而不管数据包到达哪个接口。如果不是这样,路由将被打破。可以使用数据包过滤器根据接口过滤掉具有不匹配地址的数据包。

+0

请检查编辑。 所以,当我改变网络我的ServerSocket不会关闭,但会发生什么'socket = ss.start()'?这将使我的服务器绑定?我的应用程序会抛出错误并强制关闭?如何克服这个问题,我应该注意哪些例外? – Miky

+0

是否公平总结这个答案,“听是指定INADDR_ANY(0)的绑定通话不会被打破了处于连接状态将突破插座,但活跃的TCP套接字。”不熟悉Android,我假设上面的“新ServerSocket(4445)”绑定到IP = 0上的端口4445。 – selbie

+0

@selbie:他们不会中断:例如,我已经将我自己的机器之间的SSH超时设置为几个小时。如果我用我的笔记本电脑离开房子,SSH仍然打开,请连接到外部网络,然后在回家后仍然处于超时状态,SSH连接仍然继续。重点是:IP地址不是绑定到接口,而是绑定到主机。为接口设置IP地址实际上与路由有关,即在哪个设备上发送特定子网的数据包(第一个)。 – datenwolf

相关问题