C# 使用Socket进行简单的通讯

目录

写在前面

代码实现

 服务端部分

客户端部分

运行示例

 总结


写在前面

在.Net的 System.Net.Sockets 命名空间中包含托管的跨平台套接字网络实现。 System.Net 命名空间中的所有其他网络访问类均建立在套接字的此实现之上。

其中的Socket 类是基于与 Linux、macOS 或 Windows 的本机互操作性提供的托管代码版本的套接字服务,提供了一系列的接口来支持应用层的调用。

本文只是提供一个可运行的基本示例,如果想深入了解关于TCP/IP协议的部分,可自行做更深入的知识拓展。

示例的代码实现的服务端和客户端的流程如下,展现了使用Socket进行一个完整的构建和通讯流程

服务器端:
第一步:建立一个用于通信的Socket对象
第二步:使用bind绑定IP地址和端口号
第三步:使用listen监听客户端
第四步:使用accept中断程序直到连接上客户端
第五步:接收来自客户端的请求
第六步:返回客户端需要的数据
第七步:如果接收到客户端已关闭连接信息就关闭服务器端

客户端:
第一步:建立一个用于通信的Socket对象
第二步:根据指定的IP和端口connet服务器
第三步:连接成功后向服务器端发送数据请求
第四步:接收服务器返回的请求数据
第五步:如果还需要请求数据继续发送请求
第六步:如果不需要请求数据就关闭客户端并给服务器发送关闭连接信

代码实现

 服务端部分

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;class Program
{static void Main(string[] args){Console.WriteLine("Socket Server");// 创建服务端Socket对象var serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);serverSocket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9090));serverSocket.ReceiveTimeout = 1000;serverSocket.SendTimeout = 1000;serverSocket.Listen(1000);Console.WriteLine("服务端启动监听");var clientSocket = serverSocket.Accept();Console.WriteLine("有客户端连上了");var task = Task.Run(() =>{while (true) {var receivedMsg = string.Empty;var receivedBytes = new byte[1024];var bytes = clientSocket.Receive(receivedBytes, receivedBytes.Length, 0);if (bytes > 0){receivedMsg += Encoding.UTF8.GetString(receivedBytes, 0, bytes);Console.WriteLine("收到消息:" + receivedMsg);}// 服务端心跳间隔Thread.Sleep(1000);}});Console.ReadLine();}
}

客户端部分

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;class Program
{static void Main(string[] args){Console.WriteLine("Socket Client");// 创建客户端Socket对象var clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);clientSocket.ReceiveTimeout = 1000;clientSocket.SendTimeout = 1000;clientSocket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9090));Console.WriteLine("客户端开始连接");var task = Task.Run(() =>{var idx = 0;while (true){var sendMsg = "来自客户端消息" + (++idx);clientSocket.Send(Encoding.UTF8.GetBytes(sendMsg));Console.WriteLine("客户端发送的数据:" + sendMsg);// 客户端心跳间隔Thread.Sleep(1000);}});Console.ReadLine();}
}

运行示例

 总结

之前的项目中一般是用现成的成熟框架来做通讯实现,本例纯粹是做个关于底层类库原理知识点的梳理,关于粘包分包和多线程多频道的处理,后续有时间再做深入的实践。

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

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

相关文章

Python 常用模块re

【一】正则表达式 【1】说明 正则表达式是一种强大的文本匹配和处理工具,主要用于字符串的模式匹配、搜索和替换。正则表达式测试网址:正则表达式在线测试 正则表达式手册:正则表达式手册 【2】字符组 字符转使用[]表示,并在…

音视频转码

音视频转码是指: 容器中音视频数据编码方式转换,如由H.264编码转成mpeg-4编码,mp3转成AAC;音视频码率的转换,如4Mb视频码率降为2Mb,视频分辨率的转换,如1080P转换为720P,音频重采样…

13_16-Go语言中的流程控制

**Go **语言中的流程控制 主讲教师:(大地) 合作网站:www.itying.com** **(IT 营) 我的专栏:https://www.itying.com/category-79-b0.html 1、Golang 中的流程控制 :::tips 流程控制是每种编…

银河麒麟桌面操作系统V10,gcc编译c程序报错:fatal error: stdio.h: 没有那个文件或目录

一、问题描述 Kylin-Desktop-V10-SP1-HWE-Release-2303-X86_64系统,,gcc编译c程序报错:fatal error: stdio.h: 没有那个文件或目录,如下: msms-pc:~/work/program/test$ gcc test.c test.c:1:10: fatal error: stdi…

ospf学习纪要

1、为避免区域(area0,area1等)间的路由形成环路,非骨干区域之间不允许直接相互发布区域间的路由。因此,所有的ABR(Area Border Router,区域边界路由器)都至少有一个借口属于Area0,所以Area0始终包含所有的A…

Exynos4412 移植Linux-6.1(九)移植tiny4412_backlight驱动的过程及问题解决

系列文章目录 Exynos4412 移植Linux-6.1(一)下载、配置、编译Linux-6.1 Exynos4412 移植Linux-6.1(二)SD卡驱动——解决无法挂载SD卡的根文件系统 Exynos4412 移植Linux-6.1(三)SD卡驱动——解决mmc0: Ti…

使用GBASE南大通用负载均衡连接池

若要使用负载均衡连接池功能,需要在连接串中配置相关的关键字。有关更详细的关键字信息在 GBASE南大通用 连接参数表‛中介绍。假设存在如下场景:  现有集群中存在 4 个节点: 192.168.9.173, 192.168.9.174, 192.168.9.175, 192.168.9.17…

部署后显示Bad Request The referrer header is missing.

HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器该网页是从哪个页面链接过来的,服务器因此可以获得一些信息用于处理。 因为当时需要去复制CSDN的MK格式,所以在HTML的头…

基于STM32单片机模拟智能电梯步进电机控制升降毕业设计3

STM32单片机模拟智能电梯步进电机控制数码管显示3 演示视频(复制到浏览器打开): 基于STM32单片机的智能电梯控制系统模拟智能电梯步进电机控制系统设计数码管显示楼层设计/DIY开发板套件3 产品功能描述: 本系统由STM32F103C8T6单…

【华为机试】2023年真题B卷(python)-代表团坐车

一、题目 题目描述: 某组织举行会议,来了多个代表团同时到达,接待处只有一辆汽车,可以同时接待多个代表团,为了提高车辆利用率,请帮接待员计算可以坐满车的接待方案,输出方案数量。 约束: 1.一个…

龙芯loongarch64服务器编译安装tensorflow-io-gcs-filesystem

前言 安装TensorFlow的时候,会出现有些包找不到的情况,直接使用pip命令也无法安装,比如tensorflow-io-gcs-filesystem,安装的时候就会报错: 这个包需要自行编译,官方介绍有限,这里我讲解下 编译 准备 拉取源码:https://github.com/tensorflow/io.git 文章中…

关于pygame无法打开对应文件解决办法 pyame.error unable to open file

问题描述: 问题原因: 由于pygame版本过低导致无法进行声音播放,升级对应版本即可完成! 解决办法: 升级pygame包版本到2.1.2,即可解决该问题! pip install --upgrade pygame2.1.2

C语言之指针

目录 函数的参数 对象和地址 取地址运算符 注意 指针 注意 指针运算符 注意 在C语言中,指针是一个十分重要的概念,它的作用是“指示对象”。 例如:你要去一座公寓楼找一位朋友,公寓楼由很多楼层组成,每个楼层…

十八、本地配置Hive

1、配置MYSQL mysql> alter user rootlocalhost identified by Yang3135989009; Query OK, 0 rows affected (0.00 sec)mysql> grant all on *.* to root%; Query OK, 0 rows affected (0.00 sec)mysql> flush privileges; Query OK, 0 rows affected (0.01 sec)2、…

GO设计模式——18、迭代器模式(行为型)

目录 迭代器模式(Iterator Pattern) 迭代器模式的核心角色: 优缺点 使用场景 代码实现 迭代器模式(Iterator Pattern) 迭代器模式(Iterator Pattern)提供了一种统一的方式来访问一个容器对…

P1614 爱与愁的心痛

P1614 爱与愁的心痛 [P1614 爱与愁的心痛](https://www.luogu.com.cn/problem/P1614?contestId150480 P1614 爱与愁的心痛 题意 最近有 n 个不爽的事,每句话都有一个正整数刺痛值(心理承受力极差)。想知道连续 m 个刺痛值的和的最小值是多…

打造高效接口测试:专栏介绍

在软件开发过程中,接口测试是非常重要的一环。它可以帮助我们确保系统的各个模块之间的交互是否正常,从而提高软件的质量和稳定性。本文将介绍如何使用Python编写一个自动化接口测试框架,包括框架对比、接口测试框架介绍、接口测试框架流程和…

原理图中VCC、VDD、VEE、VSS、VBAT各表示什么意思

一、名词解析 (1)VCC:Ccircuit 表示电路的意思, 即接入电路的电压 (2)VDD:Ddevice 表示器件的意思, 即器件内部的工作电压; (3)VSS:Sseries 表示公共连接的意思&#…

使用html+css+js+three.js写圣诞树

实现效果&#xff1a; <head><meta charset"UTF-8"><title>Musical Christmas Lights</title><link rel"stylesheet" href"https://cdnjs.cloudflare.com/ajax/libs/normalize/5.0.0/normalize.min.css"><sty…

网络编程:多进程和多线程编程

1. 多进程编程 1.1 fork #include <sys/types.h> #include <unistd.h> // 调用失败返回 -1 设置 errno pid_t fork( void );子进程返回 0&#xff0c;父进程返回子进程 PID&#xff1b; 信号位图被清除&#xff08;父进程的信号处理函数不再对新进程起作用&…