C#的Socket编程细节
目录
Socket中的Accept
步骤1:创建并绑定服务端套接字
步骤2:接受连接请求
步骤3:与客户端通信
步骤4:关闭套接字
注意事项
Socket中的Connected
使用Connected属性
客户端检查连接状态
服务端检查连接状态
注意事项
Socket中的RemoteEndPoint
使用RemoteEndPoint属性
服务端获取客户端的端点信息
客户端获取服务器的端点信息
注意事项
Socket中的Accept
在C#的Socket编程中,Accept
方法是服务端套接字用来接受客户端的连接请求的。当服务端套接字监听到客户端的连接请求时,它会调用Accept
方法来创建一个新的套接字,这个新的套接字用于与客户端进行通信。
以下是使用Accept
方法的步骤:
步骤1:创建并绑定服务端套接字
// 创建套接字
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);// 绑定到本地IP和端口
IPAddress localIP = IPAddress.Any; // 监听所有网络接口
int port = 11000; // 端口号
IPEndPoint localEndPoint = new IPEndPoint(localIP, port);// 绑定到指定的端口和IP
listener.Bind(localEndPoint);// 开始监听
listener.Listen(100); // 可以同时挂起的连接请求的最大数量
步骤2:接受连接请求
// 接受连接请求,这将阻塞直到一个客户端连接
Socket clientSocket = listener.Accept();// 连接被接受后,clientSocket用于与客户端通信
// 可以进行发送和接收数据的操作
步骤3:与客户端通信
一旦接受连接,就可以使用返回的Socket
(clientSocket
)来发送和接收数据。
// 接收数据
byte[] buffer = new byte[1024];
int bytesRead = clientSocket.Receive(buffer);// 发送数据
string message = "Hello from server";
byte[] data = Encoding.ASCII.GetBytes(message);
clientSocket.Send(data);
步骤4:关闭套接字
完成通信后,应该关闭套接字。
// 关闭客户端套接字
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();// 在适当的时候也关闭监听套接字
listener.Shutdown(SocketShutdown.Both);
listener.Close();
注意事项
Accept
方法是阻塞的,也就是说,它会暂停执行,直到一个客户端连接到服务端。- 如果你希望在等待连接时不阻塞主线程,可以使用异步版本的方法,如
BeginAccept
和EndAccept
。 Accept
方法返回一个新的Socket
对象,用于与客户端进行通信,而原始的监听套接字(listener
)继续监听新的连接请求。- 在高并发场景下,通常需要在单独的线程或使用异步方式处理每个接受的连接,以避免服务器因等待I/O操作而变得无响应。
使用Accept
方法时,确保你的代码能够妥善处理异常和错误情况,例如客户端在通信过程中突然断开连接。
Socket中的Connected
在C#的Socket
类中,Connected
属性用于检查套接字是否已连接到远程资源。这个属性返回一个布尔值,指示套接字是否已建立连接。
使用Connected属性
以下是如何使用Connected
属性的示例:
客户端检查连接状态
// 创建套接字
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);try
{// 连接到服务端socket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 11000));// 检查是否已连接if (socket.Connected){Console.WriteLine("Connected to the server.");// 可以进行数据发送和接收操作}else{Console.WriteLine("Failed to connect to the server.");}
}
catch (Exception e)
{Console.WriteLine("Exception: " + e.Message);
}
finally
{// 关闭套接字socket.Shutdown(SocketShutdown.Both);socket.Close();
}
服务端检查连接状态
服务端通常不直接使用Connected
属性,因为它是通过监听和接受客户端连接来建立通信的。但是,如果你在服务端需要检查与特定客户端的连接状态,也可以使用Connected
属性。
// 接受连接
Socket clientSocket = listener.Accept();// 检查是否已连接
if (clientSocket.Connected)
{Console.WriteLine("Client connected.");// 可以进行数据发送和接收操作
}
else
{Console.WriteLine("Client not connected.");
}
注意事项
Connected
属性仅指示套接字是否已连接,它不会告诉你连接的质量或网络延迟。如果需要检测连接的活跃状态,你可能需要定期发送心跳包或使用其他协议特定的机制。- 如果连接已经断开,
Connected
属性可能不会立即返回false
。这是因为TCP的断开过程是四次挥手,这个过程可能需要一些时间来完成。 - 在异步操作中,你应该在捕获异常后检查
Connected
属性,以确定是否需要重新连接或处理错误。 - 在多线程环境中,如果多个线程共享同一个套接字,
Connected
属性的值可能会在多个线程之间竞争。确保在访问Connected
属性时进行适当的同步。
Socket中的RemoteEndPoint
在C#的Socket
类中,RemoteEndPoint
属性用于获取与套接字连接的远程端点的EndPoint
。这个属性在你想要获取连接到你的服务端套接字的客户端的IP地址和端口号时非常有用,或者当你需要知道一个客户端套接字连接到的服务器的端点信息时。
使用RemoteEndPoint属性
以下是如何使用RemoteEndPoint
属性的示例:
服务端获取客户端的端点信息
// 创建套接字并监听
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, 11000);
listener.Bind(localEndPoint);
listener.Listen(100);// 接受连接
Socket clientSocket = listener.Accept();
Console.WriteLine("Client connected.");// 获取远程端点信息
if (clientSocket.Connected)
{IPEndPoint remoteEndPoint = (IPEndPoint)clientSocket.RemoteEndPoint;Console.WriteLine("Connected to client: {0}", remoteEndPoint.Address.ToString());
}
客户端获取服务器的端点信息
客户端也可以使用RemoteEndPoint
来获取它连接到的服务器的端点信息。
// 创建套接字并连接到服务器
Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 11000);
clientSocket.Connect(serverEndPoint);// 获取远程端点信息
if (clientSocket.Connected)
{IPEndPoint remoteEndPoint = (IPEndPoint)clientSocket.RemoteEndPoint;Console.WriteLine("Connected to server: {0}", remoteEndPoint.Address.ToString());
}
注意事项
RemoteEndPoint
在套接字成功连接后才能正确返回远程端点信息。- 如果套接字尚未连接,尝试访问
RemoteEndPoint
可能会抛出异常。 RemoteEndPoint
通常用于调试目的,或者在需要动态处理来自不同客户端的连接时。- 在异步操作中,你应该在确保套接字连接成功后再访问
RemoteEndPoint
属性。 RemoteEndPoint
返回的类型是EndPoint
,如果你知道它一定是IPEndPoint
类型,可以进行适当的类型转换。
相关文章:
C#的Socket编程细节
目录 Socket中的Accept 步骤1:创建并绑定服务端套接字 步骤2:接受连接请求 步骤3:与客户端通信 步骤4:关闭套接字 注意事项 Socket中的Connected 使用Connected属性 客户端检查连接状态 服务端检查连接状态 注意事项 S…...
python三局两胜游戏
分为以下步骤实现这个功能 1、猜拳 2、机器产生数值 3、人去猜数字,定义剪刀石头布 4、控制机器产生,123程序运行的时候可能会出现一点玄学问题,就是,提示n1这一行不符合pep8然后报错,不用管,运行就可以&am…...

java:brew安装rabbitmq以及简单示例
什么是消息队列mq 可以看我之前写的这篇 消息队列MQ rabbitmq简介 RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在…...

基于单片机跑步机控制系统设计
** 文章目录 前言概要功能设计设计思路 软件设计效果图 程序文章目录 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对…...
【架构】efk日志监控
文章目录 一、EFK组件及其功能二、EFK日志监控的工作流程三、EFK日志监控的优势四、EFK日志监控的应用场景 推荐阅读 EFK日志监控是一种高效的日志管理解决方案,由Elasticsearch、Fluentd(或Logstash)和Kibana三个开源工具组成。以下是对EFK日…...

亚信安全发布第34期《勒索家族和勒索事件监控报告》
本周态势快速感知 本周全球共监测到勒索事件91起,近三周勒索事件数量较为稳定。从整体上看,Ransomhub是影响最严重的勒索家族;Play和ElDorado恶意家族也是两个活动频繁的恶意家族,需要注意防范。本周,土耳其公司巴克皮…...
如何在实际应用中使用回溯算法解决问题?
如何在实际应用中使用回溯算法解决问题? 回溯算法是一种强大的问题解决方法,它通过尝试不同的选择并在遇到不可行的情况时回退,以找到满足特定条件的解决方案。在实际应用中,回溯算法可以用于解决各种复杂的问题。本文将介绍如何在实际应用中使用回溯算法,并通过一些案例…...

9. 正则表达式
编程工具和技术是以一种混乱、进化的方式生存和传播的。获胜的并不总是最好或最杰出的工具,而是那些在合适的利基市场中发挥足够好的功能,或者恰好与另一项成功的技术相结合的工具。 在本章中,我将讨论这样一种工具--正则表达式。正则表达式是…...

初始C++模板
1.泛型编程 1.1什么事泛型编程 在学习C语言时,我们时常会有这样的烦恼: 在针对每一种不同的类型变量进行函数传参或者是运算处理时,我们总是编写不同的函数或者是进行不同的处理,才能达到目的,这时,我们…...

建投数据自主研发相关系统获得欧拉操作系统及华为鲲鹏技术认证书
近日,经欧拉生态创新中心和华为技术有限公司测评,建投数据自主研发的投资项目管理系统、全面风险管理信息系统、商业不动产业务系统,完成了基于欧拉操作系统openEuler 22.03、华为鲲鹏Kunpeng 920(Taisha 200)的兼容性…...
node启动websocket保持后台一直运行
在 Node.js 中启动一个 WebSocket 服务器并使其在后台持续运行,你可以使用几种方法。下面是一种常见的方法,通过创建一个简单的 WebSocket 服务器并使用 node 命令直接运行它,同时确保它在后台运行。 1. 创建 WebSocket 服务器 首先&#x…...

CSS画出三角形的做法
引言: 在网页中,会有三角形的出现,我们脑海里会有很多想法,如何去实现他们,我来提供一种比较好玩的做法。 方法: 我们实现一个三角形,当然可以使用精灵图、或者iconfont的做法,这…...

web开发(1)-基础
这是对b站课程的总结,后续可能会继续更 01 前后端分离介绍_哔哩哔哩_bilibili01 前后端分离介绍是Web应用开发-后端基础-基于Springboot框架的第1集视频,该合集共计29集,视频收藏或关注UP主,及时了解更多相关视频内容。https://w…...
python程序操作Windows系统中的软件如word等(是否可以成功操作待验证)
一、python打开word软件 在 Python 中可以使用python-docx库来操作 Word 文档,但如果你的需求是直接打开 Word 软件,你可以使用os模块和subprocess模块来实现。以下是示例代码: import os import subprocessdef open_word():word_path rC:…...
人工智能发展历程
发展历程 人工智能的发展可以追溯到20世纪30年代,当时数理逻辑的形式化和智能可计算思想开始构建计算与智能的关联概念。1943年,美国神经科学家麦卡洛克和逻辑学家皮茨共同研制成功了世界上首个人工神经网络模型——MP模型,这为现代人工智能…...

Flutter路由
路由作为一种页面切换的能力,非常重要。Flutter 中路由管理有几个重要的点。 Navigator 1.0:Flutter 早期路由系统,侧重于移动端 ,命令式编程风格,使用 Navigator.push() 和 Navigator.pop() 等方法来管理路由栈。 N…...
css预处理器less
CSS预处理器Less教程 CSS预处理器是一种扩展CSS功能的工具,它允许开发者使用变量、嵌套规则、混合(Mixins)、函数等高级特性,使CSS代码更加灵活、易于维护和扩展。Less是其中一种流行的CSS预处理器,它使用JavaScript编…...

WEB服务器——Tomcat
服务器是可以使用java完成编写,是可以接受页面发送的请求和响应数据给前端浏览器的,而在开发中真正用到的Web服务器,我们不会自己写的,都是使用目前比较流行的web服务器。 如:Tomcat 1. 简介 Tomcat 是一个开源的轻量…...
C++ STL(3)list
文章目录 一、list 详解1、内存管理2、常用操作3、迭代器erase()删除list中的元素 前言: C 标准模板库(STL)中的 list 容器是一种双向链表数据结构,它允许在常数时间内进行插入和删除操作,而无需重新分配整个容器或移动…...

Ubuntu下安装Zookeeper集群
Zookeeper集群是一个开源的分布式协调服务系统,它由Apache软件基金会维护,旨在为分布式应用提供一致性和可靠性的服务。 在Zookeeper集群中,服务器可以扮演三种角色——领导者(Leader)、跟随者(Follower&a…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...

Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...

C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...
[USACO23FEB] Bakery S
题目描述 Bessie 开了一家面包店! 在她的面包店里,Bessie 有一个烤箱,可以在 t C t_C tC 的时间内生产一块饼干或在 t M t_M tM 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC,tM≤109)。由于空间…...