一、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 TaskSendAsync(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通信相关知识,实现对网络通信的处理,并在实际项目中进行应用。