### 判断Socket是否断开的小代码 在计算机网络编程中,Socket编程是非常基础且重要的一个环节,它使得不同机器上的程序能够通过网络进行通信。在实际应用中,我们需要经常检查Socket连接状态,确保数据能够正常收发。下面将对给定的代码进行详细解析,并介绍如何判断Socket连接是否断开的相关知识点。 #### Socket简介 Socket是应用层与传输层之间的一个抽象层,用于实现网络应用程序之间的通信。它可以理解为两个应用程序之间的一个端到端的连接。在TCP/IP协议族中,Socket通常被用来实现客户端与服务器之间的通信。 #### 代码分析 给出的代码片段主要实现了以下功能: - 持续检测`ClientSocket`的状态。 - 当检测到Socket连接断开时,调用`CloseSocket`方法关闭Socket。 - 读取并处理接收到的数据。 #### 代码详解 ```csharp private void OnReceive(object ob) { var key = ClientSocket.LocalEndPoint as IPEndPoint; var remote = ClientSocket.RemoteEndPoint as IPEndPoint; while (true) { try { if (ClientSocket == null || ClientSocket.Connected == false) { CloseSocket(); return; } if (ClientSocket.Poll(1000, SelectMode.SelectRead)) { CloseSocket(); return; } var receiveBuffer = new byte[1024]; // 接收消息 var receiveLength = ClientSocket.Receive(receiveBuffer); if (receiveLength != 0) { string msg = Encoding.UTF8.GetString(receiveBuffer, 0, receiveLength); WriteLog(string.Format("接收消息 {0}:{1,-5} 发送消息 {2}", remote.Address, remote.Port, msg)); EvtReceiveData(msg); } } catch (Exception exception) { WriteLog("接收消息" + exception.Message); Thread.Sleep(100); } } } ``` 1. **LocalEndPoint与RemoteEndPoint**:`LocalEndPoint`表示本地端点,`RemoteEndPoint`表示远程端点,这里获取它们的信息是为了后续的日志记录和调试方便。 2. **Socket状态检查**: - `if (ClientSocket == null || ClientSocket.Connected == false)`:该条件语句用于判断`ClientSocket`是否为空或已断开连接。如果满足任一条件,则调用`CloseSocket`关闭连接并退出循环。 - `if (ClientSocket.Poll(1000, SelectMode.SelectRead))`:此方法用于检查Socket是否可读。如果返回`true`,则表示Socket可能已断开连接或处于错误状态,这时也会调用`CloseSocket`。 3. **接收数据**: - 创建一个1024字节大小的缓冲区`receiveBuffer`,用于接收数据。 - 调用`ClientSocket.Receive`方法从Socket中读取数据到缓冲区中。 - 如果读取到了非零长度的数据,则将其转换为字符串,并记录日志,然后触发接收数据事件`EvtReceiveData`。 4. **异常处理**:使用`try-catch`结构来捕获并处理可能出现的异常,如网络中断、Socket错误等,并记录异常信息。 #### 关键知识点总结 1. **Socket连接状态判断**: - 利用`ClientSocket.Connected`属性判断当前Socket是否仍处于连接状态。 - 使用`ClientSocket.Poll`方法检测Socket是否可读,进而判断连接是否正常。 2. **Socket数据接收**: - 创建适当大小的缓冲区来存储接收到的数据。 - 通过`ClientSocket.Receive`方法读取数据到缓冲区。 - 处理接收到的数据,如转换为字符串、日志记录等。 3. **异常处理机制**: - 在处理网络操作时,异常处理非常重要,可以防止程序崩溃并提供错误信息。 4. **Socket关闭**: - 当检测到连接异常或不再需要连接时,及时关闭Socket连接是非常重要的一步。 通过上述分析,我们可以了解到如何通过简单的代码实现Socket连接状态的监控以及数据的正确接收处理,这对于开发稳定的网络应用程序至关重要。
/// 接收数据
/// </summary>
private void OnReceive(object ob)
{
var key = ClientSocket.LocalEndPoint as IPEndPoint;
var remote = ClientSocket.RemoteEndPoint as IPEndPoint;
while (true)
{
try
{
if (ClientSocket == null || ClientSocket.Connected == false) //断开
{
CloseSocket();
return;
}
if (ClientSocket.Poll(1000, SelectMode.SelectRead)) //断开
{
CloseSocket();
return;
}
var receiveBuffer = new byte[1024];
// 接收服务端消息
var receiveLength = ClientSocket.Receive(receiveBuffer);
if (receiveLength != 0)
{
string msg = Encoding.UTF8.GetString(receiveBuffer, 0, receiveLength);
WriteLog(string.Format("客户端信息――{0}:{1,-5}接受服务器消息{2}", remote.Address, remote.Port, msg));
EvtReceiveData(msg);
}
- yzssw2016-09-06可以参考,谢谢分享
- trh1383202016-05-16东西不错,可以参考
- heivy2017-11-20可以参考,谢谢分享
- fengchengnan2016-05-21很好很强大,感谢分享!
- 懒得飞飞2022-04-15CloseSocket 这个没完整,不能用
- 粉丝: 5
- 资源: 161
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 数据库设计管理课程设计系统设计报告(powerdesign+sql+DreamweaverCS)医院管理系统设计与开发
- VMware 学习教程(入门到实践)
- 数据库设计管理课程设计系统设计报告(powerdesign+sql+DreamweaverCS)学生选课管理系统2
- LLMS&隐写术12345
- 关于内置谷歌中文输入法apk
- 数据库设计管理课程设计系统设计报告(powerdesign+sql+DreamweaverCS)学生选课管理系统
- 基于realsense d435i相机和yolov5的目标检测机器人项目含运行说明(自动返回位置信息).zip
- 2025年Gartner重要战略技术趋势及对企业数字化转型的影响
- 数据库设计管理课程设计系统设计报告(powerdesign+sql+DreamweaverCS)学生管理系统设计与开发2
- Java 学习教程(基础到实践)