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

目录

写在前面

代码实现

服务端部分

客户端部分

运行示例

总结


写在前面

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

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

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

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

服务器端:

第一步:建立一个用于通信的Socket对象

第二步:使用bind绑定IP地址和端口号

第三步:使用listen监听客户端

第四步:使用accept中断程序直到连接上客户端

第五步:接收来自客户端的请求

第六步:返回客户端需要的数据

第七步:如果接收到客户端已关闭连接信息就关闭服务器端

客户端:

第一步:建立一个用于通信的Socket对象

第二步:根据指定的IP和端口connet服务器

第三步:连接成功后向服务器端发送数据请求

第四步:接收服务器返回的请求数据

第五步:如果还需要请求数据继续发送请求

第六步:如果不需要请求数据就关闭客户端并给服务器发送关闭连接信

代码实现

服务端部分

cs 复制代码
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();
    }
}

客户端部分

cs 复制代码
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();
    }
}

运行示例

总结

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

相关推荐
wling03019 分钟前
vasp虚频计算-python脚本
开发语言·windows·python·vasp计算
郝学胜-神的一滴26 分钟前
Qt 高级编程 040:按钮悬浮弹出滑块弹窗的完整攻略
开发语言·c++·qt·软件工程·用户界面
xrandzj1 小时前
Python面向对象编程入门:类、实例、初始化与封装实践
开发语言·python
2301_780789661 小时前
DDoS 攻击溯源:DNS 水印标记 + 区块链存证的双保险
运维·服务器·网络·云原生·ddos
DLYSB_2 小时前
API 网关流量洪峰与突发 CC 攻击:我用 Go 写了个“现场物理防御哨兵”,把故障响应压缩到秒级
开发语言·后端·golang·报警灯
雨田言炎4 小时前
四、关于Qt项目需要知道的
开发语言·笔记·qt
猿长大人4 小时前
C# | JSON 序列化中的多态接口处理:基于 Attribute 实现精准 $type 控制
c#·json
程序喵大人5 小时前
【C++进阶】STL算法与函数对象 - 02 sort为什么需要随机访问迭代器
开发语言·c++·算法
SomeB1oody5 小时前
【RustyML入门】2.6. 线性判别分析
开发语言·后端·机器学习·rust·教程
用户昵称1006 小时前
C/C++编程-工程实践-本地存储log的工程意义
c语言·开发语言