最近在开发中遇到一个问题,就是如何判断远端服务器是否已经断开连接,如果断开那么需要重新连接。
首先想到socket类的方法isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()等,但经过试验并查看相关文档,这些方法都是本地端的状态,无法判断远端是否已经断开连接。
然后想到是否可以通过OutputStream发送一段测试数据,如果发送失败就表示远端已经断开连接,类似ping,但是这样会影响到正常的输出数据,远端无法把正常数据和测试数据分开。
最后又回到socket类,发现有一个方法sendUrgentData,查看文档后得知它会往输出流发送一个字节的数据,只要对方Socket的SO_OOBINLINE属性没有打开,就会自动舍弃这个字节,而SO_OOBINLINE属性默认情况下就是关闭的,太好了,正是我需要的!
于是,下面一段代码就可以判断远端是否断开了连接:
try{
socket.sendUrgentData(0xFF);
}catch(Exception ex){
reconnect();
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xyz_lmn/archive/2011/01/17/6146749.aspx
分享到:
相关推荐
如何判断SOCKET通信中,客户端在10s内未发送数据或者未收到服务器发送的数据,自动
QT提供了丰富的网络编程接口,其中包括`QAbstractSocket`类,该类包含了判断客户端断开连接的方法。 首先,`QAbstractSocket`枚举类型中的`SocketError`定义了各种可能的套接字错误。当客户端主动断开连接时,...
在WINDOWS下比较简单,可以使用FD_CLOSE事件判断SOCKET是否已经断开 view plaincopy to clipboardprint? bool IsSocketClosed(SOCKET clientSocket) { bool ret = false; HANDLE closeEvent = WSACreateEvent();...
6. **关闭Socket**:完成通信后,使用`close()`函数关闭socket。 在多客户端连接的场景下,服务器需要同时处理多个连接请求。`select()`函数就是解决这个问题的关键。`select()`允许我们监控多个文件描述符(包括...
- 获取目标服务端设备的BluetoothDevice对象,可以是通过扫描找到的,也可以是之前已配对的设备。 - 使用BluetoothDevice的createRfcommSocketToServiceRecord()方法创建一个BluetoothSocket,该方法会创建一个...
在HP-Socket中,可以使用`GetLastError()`函数获取错误代码,然后根据错误代码判断问题原因。 最后,当我们完成TCP客户端的任务后,应关闭连接并释放资源。这可以通过调用`Close()`函数实现: ```cpp client.Close...
在Java中,Socket类和ServerSocket类提供了客户端和服务端的实现。 - **TCP/IP协议**:传输控制协议/因特网协议,确保数据可靠传输,通过三次握手建立连接,四次挥手断开连接。 2. **创建Socket Server** - **...
总结来说,Android使用Socket与服务器通信主要涉及以下几个步骤:创建Socket连接、获取输入输出流、发送和接收数据、处理结果以及关闭连接。对于初学者来说,理解这些基础概念并实际操作一次,是掌握网络通信的关键...
这通常涉及到解析请求路径,判断文件是否存在,读取文件内容以及设置合适的HTTP响应头信息,如`Content-Type`和`Content-Length`。 总的来说,通过Python的`socket`模块,我们可以学习到网络通信的基础,理解HTTP...
6. **关闭连接**:完成通信后,服务端需要调用`close()`函数关闭SOCKET连接。 客户端程序的实现则相对简单: 1. **初始化SOCKET**:客户端同样使用`socket()`函数创建SOCKET句柄。 2. **解析服务器地址**:客户端...
例如,`recv()`可能因为网络问题而返回小于期望值的结果,这时需要判断是否已经接收完整个数据包,或者是否出现了错误。同样,`send()`也可能因为网络拥堵等原因不能一次性发送所有数据,需要根据返回值进行重试。 ...
例如,可以捕获Socket异常,判断是否需要关闭连接并重新发起连接请求。客户端还可以定期发送心跳包,以检测服务器是否在线。 5. **性能优化** 为了提高大文件传输效率,可以考虑使用异步IO操作,如BeginSend和...
5. 处理异常:如果在规定时间内未收到心跳回应,客户端或服务端可以判断连接可能已断开,然后尝试重新连接。 6. 关闭连接:在不需要心跳连接时,确保正确关闭Socket和相关的输入/输出流,释放资源。 在压缩包文件...
在实际应用中,要判断Socket是否处于连接状态,可以使用如下语句: ```java boolean isConnection = socket.isConnected() && !socket.isClosed(); ``` 半关闭/半打开状态: 当Socket关闭时,其输入输出流也会被...
在isReadable()判断中,服务端将读取客户端发送的数据,并做出响应。 二、客户端实现 客户端主要任务是创建SocketChannel,连接到服务器,并向服务器发送数据。以下是一个基本的客户端代码框架: ```java import ...
- 关闭Socket时,确保释放SocketAsyncEventArgs资源,防止内存泄漏。可以使用Pool机制复用SocketAsyncEventArgs对象,提高性能。 6. **性能优化**: - 使用适当的缓冲区大小,过大可能导致内存浪费,过小则可能...
使用`BluetoothAdapter.getDefaultAdapter()`获取默认的蓝牙适配器,并通过`BluetoothAdapter.isEnabled()`判断蓝牙是否已开启。若未开启,可调用`BluetoothAdapter.enable()`开启蓝牙。 2. **搜索蓝牙设备** 使用...
通过本源码可了解下初始socket、对发送的消息数据进行编码、当发送数据完后关闭socket、禁用某 Socket 上的发送和接收、判断给定的IP地址的合法性、异常处理、判断给定的IP地址的合法性。这个程序由客户端和服务端...
为此,本文档介绍了一种解决这些问题的方法——Socket连接池技术,并通过具体实例来展示如何在客户端和服务端之间实现这一技术。 #### 二、Socket连接的基础概念 在深入探讨Socket连接池之前,我们需要了解两种...
6. **心跳机制**:心跳机制是维持长连接稳定性的关键,通过定时发送心跳包,服务端可以判断客户端是否仍然在线。在Java中,这通常通过在客户端和服务器之间交换特定的协议消息(如空消息或特定标识符)来实现。 7. ...