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…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
 
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
 
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
 
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
 
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
 
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
 
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
 
通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
