当前位置: 首页 > news >正文

C# Socket的使用

C# 中的 System.Net.Sockets.Socket 类是 .NET Framework 提供的核心类,用于处理网络套接字编程。Socket 类是用于网络编程的基础类,它位于 System.Net.Sockets 命名空间中。

使用 Socket 类,可以创建客户端和服务器应用程序来进行基于TCP、UDP和其他网络协议的通信。

 

以下是如何在 C# 中使用 Socket 类进行基本的 TCP 服务器和客户端通信的步骤:

TCP 服务器端实现

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;namespace SocketServer
{class Program{private static byte[] buffer = new byte[1024];private static int port = 8885; // 定义服务器监听端口static void Main(string[] args){// 创建一个 IP 地址对象,绑定到本地主机IPAddress ipAddress = IPAddress.Parse("127.0.0.1");// 创建一个新的 Socket 对象,指定为 IPv4、面向流(TCP)协议Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);// 绑定服务器 socket 到特定的 IP 和端口IPEndPoint localEndPoint = new IPEndPoint(ipAddress, port);serverSocket.Bind(localEndPoint);// 开始监听连接请求,最大同时排队的连接数为 10serverSocket.Listen(10);Console.WriteLine($"启动监听 {serverSocket.LocalEndPoint} 成功");// 启动线程等待客户端连接Thread listenThread = new Thread(ListenForClients);listenThread.Start(serverSocket);// 等待控制台输入以保持程序运行Console.ReadLine();}private static void ListenForClients(object obj){Socket listener = (Socket)obj;while (true){// 接受一个客户端的连接请求Socket clientSocket = listener.Accept();// 发送欢迎消息给客户端string welcomeMessage = "ServerSayHello";byte[] data = Encoding.ASCII.GetBytes(welcomeMessage);clientSocket.Send(data);// 在单独的线程中处理来自客户端的消息Thread receiveThread = new Thread(ReceiveData);receiveThread.Start(clientSocket);}}private static void ReceiveData(object obj){Socket clientSocket = (Socket)obj;while (true){try{// 接收客户端发来的数据int received = clientSocket.Receive(buffer);// 将接收的数据转换为字符串并输出string message = Encoding.ASCII.GetString(buffer, 0, received);Console.WriteLine($"接收客户端 {clientSocket.RemoteEndPoint} 消息: {message}");// 实际应用中,这里可能需要对消息进行响应或进一步处理}catch (Exception ex){Console.WriteLine($"接收异常:{ex.Message}");// 关闭连接clientSocket.Shutdown(SocketShutdown.Both);clientSocket.Close();break;}}}}
}

TCP 客户端实现

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;namespace SocketClient
{class Program{private static byte[] buffer = new byte[1024];static void Main(string[] args){// 设置要连接的服务器地址和端口IPAddress ipAddress = IPAddress.Parse("127.0.0.1");int port = 8885;Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);try{// 连接到服务器clientSocket.Connect(new IPEndPoint(ipAddress, port));Console.WriteLine("连接服务器成功");// 接收服务器发送的消息int receiveLength = clientSocket.Receive(buffer);Console.WriteLine("接收服务器消息:{0}", Encoding.ASCII.GetString(buffer, 0, receiveLength));// 发送多条消息给服务器for (int i = 0; i < 10; i++){Thread.Sleep(1000); // 模拟延时string sendMessage = $"ClientSendMessageHelp{i} at {DateTime.Now}";byte[] data = Encoding.ASCII.GetBytes(sendMessage);clientSocket.Send(data);Console.WriteLine("向服务器发送消息:{0}", sendMessage);}}catch (Exception ex){Console.WriteLine("连接或通信过程中发生错误: {0}", ex.Message);}finally{// 关闭连接clientSocket.Shutdown(SocketShutdown.Both);clientSocket.Close();Console.WriteLine("发送完毕,按回车键退出...");Console.ReadLine();}}}
}

以上代码分别展示了如何创建一个简单的 TCP 服务器和客户端,服务器会监听客户端的连接请求,并在建立连接后与客户端交换数据。

客户端则尝试连接到服务器,并发送和接收数据。

 

请注意,使用Socket进行网络编程需要对网络协议和通信原理有一定的了解。

如果需要更复杂的网络通信功能,可能需要使用更高层次的网络库或框架,例如TcpClientTcpListener

 

Socket.Connected 不能作为TCP连接的判断依据

Socket.Connected 不能作为TCP连接的判断依据-CSDN博客

 

相关文章:

C# Socket的使用

C# 中的 System.Net.Sockets.Socket 类是 .NET Framework 提供的核心类&#xff0c;用于处理网络套接字编程。Socket 类是用于网络编程的基础类&#xff0c;它位于 System.Net.Sockets 命名空间中。 使用 Socket 类&#xff0c;可以创建客户端和服务器应用程序来进行基于TCP、…...

Spring Cloud + Vue前后端分离-第17章 生产打包与发布

源代码在GitHub - 629y/course: Spring Cloud Vue前后端分离-在线课程 Spring Cloud Vue前后端分离-第17章 生产打包与发布 17-1 注册中心配置中心Nacos 注册中心 Nacos 快速开始 | Nacos 本节内容&#xff1a;使用nacos作注册中心配置中心&#xff0c;不用eureka Nacos…...

力扣热题100_普通数组_56_合并区间

文章目录 题目链接解题思路解题代码 题目链接 56. 合并区间 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区…...

Springcloud OpenFeign 的实现(二)

Springcloud OpenFeign 的实现&#xff08;一&#xff09; 一、Feign request/response 压缩 您可以考虑为您的外部请求启用请求或响应GZIP压缩。您可以通过启用以下属性之一来完成此操作&#xff1a; feign.compression.request.enabledtrue feign.compression.response.en…...

[C++]智能指针用法

一、智能指针存在的意义 智能指针主要解决以下问题&#xff1a; &#xff08;1&#xff09;内存泄漏&#xff1a;内存手动释放&#xff0c;使用智能指针可以自动释放。 &#xff08;2&#xff09;共享所有权指针的传播和释放&#xff0c;比如多线程使用同一个对象时析构问题…...

六、行列式基本知识

目录 1、行列式的特性 2、行列式的计算方法: 2.1 通过行列式的定义去计算:对角法则。 2. 2 利用行列式的性质将行列式转化为上三角行列式: ①行列式的性质 : 性质一: 性质二: 性质三: 性质四:行列式之间的加法...

中断系统(详解与使用)

讲解 简介 中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。 假设一个人在家看电视,这时候突然门铃响了,这个人此时就要停止看电视去开门,然后关上门后继续回来…...

uniapp开发微信小程序跳转到另一个小程序中

注意&#xff1a;一开始我的云上务工模块是单独的tabbar界面&#xff0c;但是小程序跳转好像不能直接点击tabbar进行&#xff0c;所以我将这里改成了点击首页中的按钮进行跳转 点击这里进行小程序跳转 目录 基础讲解 uniapp小程序跳转的两个方法 调用说明&#xff08;半屏跳转…...

chatGPT 使用随想

一年前 chatGPT 刚出的时候&#xff0c;我就火速注册试用了。 因为自己就是 AI 行业的&#xff0c;所以想看看国际上最牛的 AI 到底发展到什么程度了. 自从一年前 chatGPT 火出圈之后&#xff0c;国际上的 AI 就一直被 OpenAI 这家公司引领潮流&#xff0c;一直到现在&#x…...

unity Aaimation Rigging使用多个约束导致部分约束失去作用

在应用多个约束时&#xff0c;在Hierarchy的顺序可能会影响最终的效果。例如先应用了Aim Constraint&#xff0c;然后再应用Two Bone Constraint&#xff0c;可能会导致Two Bone Constraint受到Aim Constraint的影响而失效。因此&#xff0c;在使用多个约束时&#xff0c;应该仔…...

什么是ChatGPT

国外有篇文章解释了ChatGPT的开发技术是什么&#xff0c;GPT-3和GPT-4的区别&#xff0c;以及未来的可能性。 截至 2023 年&#xff0c;ChatGPT 等生成式 AI 服务正在全球引起关注&#xff0c;并且正在探索在广泛领域的应用。 您可能想知道 ChatGPT 是使用哪种开发技术制作的&a…...

当我们浪费时我们在浪费什么

世界上的物质和能量不会增加也不会减少&#xff0c;为什么会存在浪费一说呢&#xff1f;是因为人类可以利用和支配的物质和能量是有限的&#xff0c;而且物质和能量的不同组织方式对于人类有着不同的价值。 人类对于世界的事物都有价值评估。例如一个玻璃杯摔碎了&#xff0c;…...

一文搞懂TCP三次握手与四次挥手

什么是TCP协议&#xff1f; TCP&#xff08;Transmission control protocol&#xff09;即传输控制协议&#xff0c;是一种面向连接、可靠的数据传输协议&#xff0c;它是为了在不可靠的互联网上提供可靠的端到端字节流而专门设计的一个传输协议。 面向连接&#xff1a;数据传…...

FairyGUI × Cocos Creator 3.7.3 引入报错解决

Cocos Creator 3.7.3引入fgui库 package.json添加这个依赖 "devDependencies": {"fairygui-cc": "latest"}执行npm i 报错解决 使用import引入fairygui-cc&#xff0c;就会有报错和警告&#xff0c;简单处理一下。 鼠标随便点一下也会出警告…...

网络原理 - HTTP/HTTPS(5)

HTTPS HTTPS也是一个应用层协议.在HTTP协议的基础上引入了一个加密层. HTTP协议内容都是按照文本的方式明文传输的. 这就导致了在传输过程中出现了一些被篡改的情况. 臭名昭著的"运营商劫持" 下载一个天天动听. 未被劫持的效果,点击下载按钮,就会弹出天天动听的…...

设计模式——抽象工厂模式

定义: 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;提供一个创建一系列或相互依赖对象的接口&#xff0c;而无须指定它们具体的类。 概述:一个工厂可以提供创建多种相关产品的接口&#xff0c;而无需像工厂方法一样&#xff0c;为每一个产品都提供一个具体…...

详解编译和链接!

目录 1. 翻译环境和运行环境 2. 翻译环境 2.1 预处理 2.2 编译 2.3 汇编 2.4 链接 3. 运行环境 4.完结散花 悟已往之不谏&#xff0c;知来者犹可追 创作不易&#xff0c;宝子们&#xff01;如果这篇文章对你们…...

力扣226 翻转二叉树 Java版本

文章目录 题目描述解题思路代码 题目描述 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 示例 2&#xff1a; 输入&#xff1a;root…...

免费的数据恢复软件哪个好?这10个数据恢复软件可以试试

遇到电脑、硬盘或U盘等设备中数据丢失&#xff0c;不用着急&#xff0c;数据恢复软件来帮你。 在遇到数据丢失的问题时&#xff0c;很多朋友都会很着急也不知道该怎么办。作为数据恢复小白&#xff0c;我们可以选择使用数据恢复软件进行扫描恢复。现在市面上的数据恢复软件很多…...

力扣2476二叉搜索树最近节点查询

题目来源 力扣2476二叉搜索树最近节点查询 题目概述 给你一个 二叉搜索树 的根节点 root &#xff0c;和一个由正整数组成、长度为 n 的数组 queries 。 请你找出一个长度为 n 的 二维 答案数组 answer &#xff0c;其中 answer[i] [mini, maxi] &#xff1a; mini 是树中…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...

aardio 自动识别验证码输入

技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”&#xff0c;于是尝试整合图像识别与网页自动化技术&#xff0c;完成了这套模拟登录流程。核心思路是&#xff1a;截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...

CSS3相关知识点

CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...