【C#】Socket通信的使用

在C#中,Socket通信是一种用于实现网络通信的底层技术。通过Socket,程序可以在网络上与其他设备进行数据交换。以下是如何使用C#中的System.Net.Sockets命名空间来实现Socket通信的详细步骤。

1. Socket通信的基本概念

  • Socket: 一个Socket是网络通信的端点,它封装了IP地址和端口号。
  • Server(服务器端): 监听客户端的连接请求,并处理数据。
  • Client(客户端): 主动发起与服务器的连接,并发送或接收数据。
  • 协议: 常用的协议有TCP(面向连接、可靠传输)和UDP(无连接、不可靠但高效)。

2. 使用TCP协议的Socket通信

(1) 服务器端代码

服务器端需要监听指定的IP地址和端口,等待客户端的连接请求。

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;class TcpServer
{static void Main(string[] args){// 定义IP地址和端口号IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); // 本地回环地址int port = 8888;// 创建Socket对象Socket listener = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);try{// 绑定IP地址和端口listener.Bind(new IPEndPoint(ipAddress, port));listener.Listen(10); // 设置最大连接数为10Console.WriteLine("服务器已启动,等待客户端连接...");// 接受客户端连接Socket handler = listener.Accept();Console.WriteLine("客户端已连接!");// 接收数据byte[] buffer = new byte[1024];int bytesReceived = handler.Receive(buffer);string receivedData = Encoding.UTF8.GetString(buffer, 0, bytesReceived);Console.WriteLine($"接收到的数据: {receivedData}");// 发送响应数据string response = "Hello from server!";byte[] responseData = Encoding.UTF8.GetBytes(response);handler.Send(responseData);// 关闭连接handler.Shutdown(SocketShutdown.Both);handler.Close();}catch (Exception ex){Console.WriteLine($"发生错误: {ex.Message}");}finally{listener.Close();}}
}

(2) 客户端代码

客户端需要主动连接到服务器,并发送或接收数据。

using System;
using System.Net.Sockets;
using System.Text;class TcpClientExample
{static void Main(string[] args){// 定义服务器的IP地址和端口号string serverIp = "127.0.0.1";int port = 8888;// 创建Socket对象Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);try{// 连接到服务器client.Connect(serverIp, port);Console.WriteLine("已连接到服务器!");// 发送数据string message = "Hello from client!";byte[] data = Encoding.UTF8.GetBytes(message);client.Send(data);// 接收服务器响应byte[] buffer = new byte[1024];int bytesReceived = client.Receive(buffer);string response = Encoding.UTF8.GetString(buffer, 0, bytesReceived);Console.WriteLine($"服务器响应: {response}");}catch (Exception ex){Console.WriteLine($"发生错误: {ex.Message}");}finally{client.Close();}}
}

3. 使用UDP协议的Socket通信

(1) 服务器端代码

UDP是无连接的协议,服务器不需要显式接受连接。

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;class UdpServer
{static void Main(string[] args){// 定义IP地址和端口号IPAddress ipAddress = IPAddress.Parse("127.0.0.1");int port = 9999;// 创建Socket对象UdpClient udpServer = new UdpClient(port);Console.WriteLine("UDP服务器已启动,等待数据...");// 接收数据IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);byte[] receivedData = udpServer.Receive(ref remoteEndPoint);string message = Encoding.UTF8.GetString(receivedData);Console.WriteLine($"接收到的数据: {message} 来自 {remoteEndPoint}");// 发送响应数据string response = "Hello from UDP server!";byte[] responseData = Encoding.UTF8.GetBytes(response);udpServer.Send(responseData, responseData.Length, remoteEndPoint);// 关闭SocketudpServer.Close();}
}

(2) 客户端代码

客户端直接向服务器发送数据,无需建立连接。 

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;class UdpClientExample
{static void Main(string[] args){// 定义服务器的IP地址和端口号string serverIp = "127.0.0.1";int port = 9999;// 创建Socket对象UdpClient udpClient = new UdpClient();try{// 发送数据IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse(serverIp), port);string message = "Hello from UDP client!";byte[] data = Encoding.UTF8.GetBytes(message);udpClient.Send(data, data.Length, serverEndPoint);// 接收服务器响应byte[] receivedData = udpClient.Receive(ref serverEndPoint);string response = Encoding.UTF8.GetString(receivedData);Console.WriteLine($"服务器响应: {response}");}catch (Exception ex){Console.WriteLine($"发生错误: {ex.Message}");}finally{udpClient.Close();}}
}

4. 注意事项

  1. 异常处理: 在实际开发中,必须对网络异常(如超时、连接中断等)进行处理。
  2. 多线程支持: 如果需要同时处理多个客户端连接,可以使用多线程或异步编程。
  3. 防火墙和端口: 确保服务器的端口未被防火墙阻止。
  4. 编码格式: 数据传输时需注意编码格式的一致性(如UTF-8)。

以上是C#中Socket通信的基本实现方法。根据实际需求,可以选择TCP或UDP协议,并结合异步编程(如async/await)提高性能和可扩展性。

C# async/await的使用_c# async await用法-CSDN博客文章浏览阅读1.3k次,点赞5次,收藏8次。本文详细介绍了C#中async和await关键字在实现异步编程中的作用,包括如何定义异步方法、await用于等待异步操作完成的特点,以及注意事项,如避免阻塞操作和正确嵌套。这些技术有助于提升程序性能和响应性。 https://blog.csdn.net/wangnaisheng/article/details/136037585?spm=1011.2415.3001.5331

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/901863.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年第九届团队程序设计天梯赛c++题解L1-L3-1(附PTA网址)

L1-1 编程解决一切 5分 L1-097 编程解决一切 - 团体程序设计天梯赛-练习集 (pintia.cn)https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7?problemSetProblemId1781658570803388416 #include<bits/stdc.h> #define int long long using namesp…

ICMAN防水触摸芯片 - 复杂环境下精准交互,提升触控体验

▍核心优势 ◆ 超强抗干扰能力 ◆ 工业级设计&#xff0c;一致性和稳定性好 ▍提供场景化解决方案 【智能厨电矩阵】抽油烟机档位调节 | 电磁炉火力触控 | 洗碗机模式切换 【卫浴设备方案】淋浴房雾化玻璃控制 | 智能马桶触控面板 | 浴缸水位感应 【工业控制应用】仪器仪…

Golang|抽奖相关

文章目录 抽奖核心算法生成抽奖大转盘抽奖接口实现 抽奖核心算法 我们可以根据 单商品库存量/总商品库存量 得到每个商品被抽中的概率&#xff0c;可以想象这样一条 0-1 的数轴&#xff0c;数轴上的每一段相当于一种商品&#xff0c;概率之和为1。 抽奖时&#xff0c;我们会生…

OpenCV 图形API(43)颜色空间转换-----将 BGR 图像转换为 LUV 色彩空间函数BGR2LUV()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将图像从BGR色彩空间转换为LUV色彩空间。 该函数将输入图像从BGR色彩空间转换为LUV。B、G和R通道值的传统范围是0到255。 输出图像必须是8位无符…

【Python】用Python写一个俄罗斯方块玩玩

【Python】用Python写一个俄罗斯方块玩玩 一、引言1.成品效果展示 二、思考准备1.思考设计2.代码设计2.1 游戏页面2.2 控件设计2.2.1 方块生成2.2.2 方块碰撞2.2.3 方块消融2.2.4 游戏主循环2.2.5 游戏窗口 三、游戏完整版 一、引言 今日看到侄子在玩游戏&#xff0c;凑近一看…

维港首秀!沃飞长空AE200亮相香港特别行政区

4月13日-16日&#xff0c;第三届香港国际创科展在香港会议展览中心盛大举办。 作为国内领先、国际一流的eVTOL主机厂&#xff0c;沃飞长空携旗下AE200批产构型登陆国际舞台&#xff0c;以前瞻性的创新技术与商业化应用潜力&#xff0c;吸引了来自全球17个国家及地区的行业领袖…

Openfein实现远程调用的方法(实操)

文章目录 环境准备一、URL中接收参数二、接收一个参数三、接收多个参数四、传递对象五、传递JSON格式数据 环境准备 下面的配置&#xff0c;服务调用方加入即可。 依赖导入&#xff1a; <!-- openfeign依赖--><dependency><groupId>org.springframe…

Bright+Data网页解锁器:旅游行业数据革命的“隐形引擎”

在数字经济浪潮中&#xff0c;旅游行业正经历前所未有的变革。当消费者指尖滑动间完成跨国酒店预订&#xff0c;当航空公司每秒调整万次舱位价格&#xff0c;背后是一场无声的数据战争。而在这场战争中&#xff0c;BrightData网页解锁器正成为旅游企业破局的关键武器——它像一…

OpenCV 图形API(38)图像滤波-----Sobel 算子操作函数Sobel()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::gapi::Sobel 函数是 OpenCV 的 G-API 模块中用于执行 Sobel 算子操作的一个函数&#xff0c;主要用于图像的边缘检测。Sobel 算子通过计算图…

CS5346 - Interactivity in Visualization 可视化中的交互

文章目录 Visualization representation interactionInteraction &#xff08;交互&#xff09;Benefits (好处)Typical Interaction Techniques&#xff08;交互技术&#xff09;SelectFilteringAbstract / Elaborate几何放缩&#xff08;Geometric zoom)语义放缩&#xff0…

第十六届蓝桥杯大赛软件赛省赛 C++ 大学 B 组 部分题解

赛时参加的是Python组&#xff0c;这是赛后写的题解&#xff0c;还有两题暂时还不会&#xff0c;待更新 题目链接题目列表 - 洛谷 | 计算机科学教育新生态 A 移动距离 答案&#xff1a;1576 C 可分解的正整数 Python3 import itertools from functools import cmp_to_ke…

Vue 解决 Error: please transfer a valid prop path to form item!

在 Vue.js 中使用表单验证库&#xff08;如 VeeValidate 或 Element UI 的表单组件时&#xff09;&#xff0c;遇到错误信息 "please transfer a valid prop path to form item!" 通常指的是在表单项的属性绑定中&#xff0c;路径&#xff08;prop path&#xff09;不…

在 Visual Studio Code 中安装通义灵码 - 智能编码助手

高效的编码工具对于提升开发效率和代码质量至关重要。 通义灵码作为一款智能编码助手&#xff0c;为开发者提供了全方位的支持。 本文将详细介绍如何在 Visual Studio Code&#xff08;简称 VSCode&#xff09;中安装通义灵码&#xff0c;以及如何进行相关配置以开启智能编码…

SQL 解析 with as dual sysdate level

目录 sql的运行顺序 with as EXTRACT ​编辑 dual sysdate level ​编辑 ​编辑 Oracle中的日期存储 核心部分 拆解字符串并计算最小值 关联子查询 NVL 函数 REGEXP_SUBSTR() sql的运行顺序 <select id="getTrendList" parameterType="java.uti…

快手OneRec 重构推荐系统:从检索排序到生成统一的跃迁

文章目录 1. 背景2. 方法2.1 OneRec框架2.2 Preliminary2.3 生成会话列表2.4 利用奖励模型进行迭代偏好对齐2.4.1 训练奖励模型2.4.2 迭代偏好对齐 3. 总结 昨天面试的时候聊到了OneRec&#xff0c;但是由于上次看这篇文章已经是一个月之前&#xff0c;忘得差不多了&#xff0c…

软考高级系统架构设计师-第11章 系统架构设计

【本章学习建议】 根据考试大纲&#xff0c;本章不仅考查系统架构设计师单选题&#xff0c;预计考12分左右&#xff0c;而且案例分析和论文写作也是必考&#xff0c;对应第二版教材第7章&#xff0c;属于重点学习的章节。 软考高级系统架构设计师VIP课程https://edu.csdn.net/…

selenium之文件下载

Selenium 自动化测试&#xff1a;轻松搞定文件下载 在 Web 自动化测试中&#xff0c;经常会遇到需要验证文件下载功能的场景。例如&#xff0c;测试报告的导出、用户上传文件的下载、PDF 文档的生成与下载等等。Selenium 本身并没有直接处理文件下载的内置方法&#xff0c;但我…

基于迁移学习实现肺炎X光片诊断分类

大家好&#xff0c;我是带我去滑雪&#xff01; 肺炎是全球范围内致死率较高的疾病之一&#xff0c;尤其是在老年人、免疫系统较弱的患者群体中&#xff0c;更容易引发严重并发症。传统上&#xff0c;肺炎的诊断依赖于医生的临床经验以及影像学检查&#xff0c;尤其是X光片&…

工业数据治理范式革新:时序数据库 TDengine虚拟表技术解析

小T导读&#xff1a;在工业数字化过程中&#xff0c;数据如何从设备采集顺利“爬坡”到上层应用&#xff0c;一直是个难题。传统“单列模型”虽贴合设备协议&#xff0c;却让上层分析举步维艰。TDengine 用一种更聪明的方法打通了这条数据通路&#xff1a;不强求建模、不手动转…

Redis面试——日志

一、RDB&#xff08;Redis DataBase&#xff09; RDB 全程是 Redis DataBase&#xff0c;它是一种将 Redis 在某一时刻内存中的数据以快照形式保存到磁盘的机制 &#xff0c;相当于给执行save/bgsave命令时刻的内存数据库数据拍了一张快照我们如果通过save命令来执行快照&…