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…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
【实施指南】Android客户端HTTPS双向认证实施指南
🔐 一、所需准备材料 证书文件(6类核心文件) 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...
海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》
近日,嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,海云安高敏捷信创白盒(SCAP)成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解…...
2025-05-08-deepseek本地化部署
title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek:小白也能轻松搞定! 如何给本地部署的 DeepSeek 投喂数据,让他更懂你 [实验目的]:理解系统架构与原…...
嵌入式面试常问问题
以下内容面向嵌入式/系统方向的初学者与面试备考者,全面梳理了以下几大板块,并在每个板块末尾列出常见的面试问答思路,帮助你既能夯实基础,又能应对面试挑战。 一、TCP/IP 协议 1.1 TCP/IP 五层模型概述 链路层(Link Layer) 包括网卡驱动、以太网、Wi‑Fi、PPP 等。负责…...
深入解析 ReentrantLock:原理、公平锁与非公平锁的较量
ReentrantLock 是 Java 中 java.util.concurrent.locks 包下的一个重要类,用于实现线程同步,支持可重入性,并且可以选择公平锁或非公平锁的实现方式。下面将详细介绍 ReentrantLock 的实现原理以及公平锁和非公平锁的区别。 ReentrantLock 实现原理 基本架构 ReentrantLo…...
手动给中文分词和 直接用神经网络RNN做有什么区别
手动分词和基于神经网络(如 RNN)的自动分词在原理、实现方式和效果上有显著差异,以下是核心对比: 1. 实现原理对比 对比维度手动分词(规则 / 词典驱动)神经网络 RNN 分词(数据驱动)…...
当下AI智能硬件方案浅谈
背景: 现在大模型出来以后,打破了常规的机械式的对话,人机对话变得更聪明一点。 对话用到的技术主要是实时音视频,简称为RTC。下游硬件厂商一般都不会去自己开发音视频技术,开发自己的大模型。商用方案多见为字节、百…...
