C# Socket通信详解

C# Socket通信是指使用C#编写的Socket程序,在网络上与其他程序或设备进行通信。 下面将从多个方面对C# Socket通信进行详细阐述。

一、Socket通信基础

1、Socket概念

Socket是一种网络通信协议,它是网络通信中用于表示IP地址和端口号的数据结构。C# Socket编程使用Socket来进行网络通信。

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

2、Socket通信模式

Socket通信有两种方式:流模式和数据报模式。流模式Socket基于TCP协议,是可靠的面向连接的通信模式;数据报模式Socket基于UDP协议,是不可靠的无连接的通信模式。

//流模式Socket
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//数据报模式Socket
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

3、Socket通信流程

在进行Socket通信时,一般遵循以下流程:

①创建Socket对象

②绑定IP地址和端口号

③监听连接请求

④接受连接请求并与客户端建立连接

⑤数据传输

//创建Socket对象
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//绑定IP地址和端口号
IPEndPoint ipPort = new IPEndPoint(IPAddress.Parse("192.168.1.100"), 9000);
server.Bind(ipPort);
//监听连接请求
server.Listen(10);
//接受连接请求并与客户端建立连接
Socket client = server.Accept();
//数据传输
byte[] buffer = new byte[1024];
int length = client.Receive(buffer);
client.Send(buffer, length, SocketFlags.None);

二、Socket通信实现

1、客户端实现

客户端通过创建Socket对象,连接到服务器来进行通信。下面是客户端的代码示例:

Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipPort = new IPEndPoint(IPAddress.Parse("192.168.1.100"), 9000);
client.Connect(ipPort);
byte[] data = Encoding.UTF8.GetBytes("Hello world!");
client.Send(data);

2、服务端实现

服务端通过创建Socket对象,绑定IP地址和端口号,监听连接请求,接受连接请求并与客户端建立连接,进行数据传输来进行通信。下面是服务端的代码示例:

Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipPort = new IPEndPoint(IPAddress.Parse("192.168.1.100"), 9000);
server.Bind(ipPort);
server.Listen(10);
Socket client = server.Accept();
byte[] buffer = new byte[1024];
int length = client.Receive(buffer);
client.Send(buffer, length, SocketFlags.None);

三、Socket通信高级应用

1、Socket通信加密

在Socket通信过程中,为了加强数据传输安全性,我们可以使用加密算法对数据进行加密和解密,避免数据被窃取和篡改。C#中提供了AES和RSA等对称加密和非对称加密算法,以进行数据加密处理。

//AES加密
byte[] keyBytes = Encoding.UTF8.GetBytes("1234567890123456");
byte[] ivBytes = Encoding.UTF8.GetBytes("1234567890123456");
byte[] dataBytes = Encoding.UTF8.GetBytes("Hello world!");
Aes aes = Aes.Create();
aes.Key = keyBytes;
aes.IV = ivBytes;
ICryptoTransform transform = aes.CreateEncryptor();
byte[] resultBytes = transform.TransformFinalBlock(dataBytes, 0, dataBytes.Length);

//RSA加密
byte[] dataBytes = Encoding.UTF8.GetBytes("Hello world!");
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
RSAParameters parameters = new RSAParameters();
parameters.Exponent = new byte[] { 1, 0, 1 };
parameters.Modulus = new byte[] { 135, 162, 187, 184, 83, 155, 114, 115, 112, 191 }; 
rsa.ImportParameters(parameters);
byte[] resultBytes = rsa.Encrypt(dataBytes, false);

2、Socket通信优化

在Socket通信中,为了提高传输效率,我们可以采用以下技巧:

①使用异步方式发送和接收数据;

②合并多个小数据包为一个大数据包;

③采用压缩算法对数据进行压缩。

//使用异步方式发送和接收
public static class SocketExtension
{
    public static Task SendAsync(this Socket socket, byte[] data, int offset, int size, SocketFlags flags)
    {
        return Task.Factory.FromAsync((cb, state) => socket.BeginSend(data, offset, size, flags, cb, state),
            ar => socket.EndSend(ar), null);
    }
    public static Task ReceiveAsync(this Socket socket, byte[] data, int offset, int size, SocketFlags flags)
    {
        return Task.Factory.FromAsync((cb, state) => socket.BeginReceive(data, offset, size, flags, cb, state),
            ar => socket.EndReceive(ar), null);
    }
}

四、Socket通信实例

1、Socket文件传输

通过Socket通信可以实现文件传输。以下是一个简单的文件传输示例:

//服务端代码
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipPort = new IPEndPoint(IPAddress.Parse("192.168.1.100"), 9000);
server.Bind(ipPort);
server.Listen(10);
Socket client = server.Accept();
FileStream stream = File.Open("test.txt", FileMode.Open);
byte[] buffer = new byte[1024];
int length;
while ((length = stream.Read(buffer, 0, buffer.Length)) > 0)
{
    client.Send(buffer, length, SocketFlags.None);
}
stream.Close();
client.Shutdown(SocketShutdown.Send);
//客户端代码
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipPort = new IPEndPoint(IPAddress.Parse("192.168.1.100"), 9000);
client.Connect(ipPort);
FileStream stream = File.Create("test.txt");
byte[] buffer = new byte[1024];
int length;
while ((length = client.Receive(buffer, buffer.Length, SocketFlags.None)) > 0)
{
    stream.Write(buffer, 0, length);
}
stream.Close();
client.Shutdown(SocketShutdown.Both);

2、Socket聊天室

通过Socket通信可以实现聊天室功能。以下是一个简单的聊天室示例:

//服务端代码
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipPort = new IPEndPoint(IPAddress.Parse("192.168.1.100"), 9000);
server.Bind(ipPort);
server.Listen(10);
while (true)
{
    Socket client = server.Accept();
    Task.Run(() =>
    {
        while (true)
        {
            byte[] buffer = new byte[1024];
            int length = client.Receive(buffer);
            string message = Encoding.UTF8.GetString(buffer, 0, length);
            //处理消息
            //......
        }
    });
}
//客户端代码
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipPort = new IPEndPoint(IPAddress.Parse("192.168.1.100"), 9000);
client.Connect(ipPort);
Task.Run(() =>
{
    while (true)
    {
        byte[] buffer = new byte[1024];
        int length = client.Receive(buffer);
        string message = Encoding.UTF8.GetString(buffer, 0, length);
        //处理消息
        //......
    }
});
while (true)
{
    string message = Console.ReadLine();
    byte[] data = Encoding.UTF8.GetBytes(message);
    client.Send(data);
}

通过以上介绍,我们可以深入了解C# Socket通信相关知识,实现对网络通信的处理,并在实际项目中进行应用。

原创文章,作者:ZAWPO,如若转载,请注明出处:https://www.506064.com/n/361662.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
ZAWPOZAWPO
上一篇 2025-02-25 18:17
下一篇 2025-02-25 18:17

相关推荐

  • Python中使用socket传输图片

    本文将从多个方面介绍如何使用Python中的socket模块传输图片,涉及到准备工作、发送方部分和接收方部分的详细代码实现。 一、准备工作 在使用Python中的socket模块进…

    编程 2025-04-28
  • Python Socket阻塞问题的解析

    本文将从多个方面对Python socket阻塞问题进行详细阐述,包括阻塞的原因、影响、解决方法等等。 一、阻塞的原因 阻塞是指在等待某个事件的过程中,该进程无法处理其他任务,直到…

    编程 2025-04-27
  • 跨域通信浮标——实现客户端之间的跨域通信

    本文将介绍跨域通信浮标的使用方法,该浮标可以实现客户端之间的跨域通信,解决了浏览器同源策略的限制,让开发者能够更加方便地进行跨域通信。 一、浮标的原理 跨域通信浮标的原理是基于浮动…

    编程 2025-04-27
  • 通信专业Python和Java的开发技巧

    本文旨在介绍通信专业Python和Java的开发技巧,为读者提供实用且可操作的思路和方法。 一、Python在通信领域中的应用 Python是一种优秀的程序设计语言,因其易学易用、…

    编程 2025-04-27
  • C# Socket关闭后客户端仍可连接的解决方法

    对于C# Socket通信中的一些问题,多数人可能已经熟知,但是有些问题仍然困扰着一部分人,例如Socket关闭后,客户端仍然可以连接。本篇文章将在此问题为中心,围绕该问题的原因和…

    编程 2025-04-27
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25

发表回复

登录后才能评论