网络编程的核心概念
1. 套接字(Sockets)
- 定义:套接字是网络通信的基本单元,提供了在网络中进行数据交换的端点。
- 用途:用于TCP/UDP网络通信,支持低级别的网络数据传输。
2.协议
TCP(Transmission Control Protocol)
- 面向连接:在传输数据之前必须建立连接。
- 可靠性:提供顺序的数据传输,具备错误校验和重传机制,确保数据的完整性。
- 流控制:提供拥塞控制,防止网络过载。
- 适用于需要高可靠性和顺序性的数据传输场景。
UDP(User Datagram Protocol)
- 无连接:不需要建立或关闭连接,数据包独立传输。
- 不可靠:没有内置的错误校验和重传机制,数据可能会丢失、重复或无序。
- 低延迟:因为无连接且简单的头部结构,传输速度快。
- 适用于需要快速传输且对丢包不敏感的场景。
基本使用
使用TCP套接字
TCP服务器:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;public class TcpServer
{public static void Main(){TcpListener server = null;try{Int32 port = 13000;IPAddress localAddr = IPAddress.Parse("127.0.0.1");server = new TcpListener(localAddr, port);server.Start();Console.WriteLine("Server started...");while (true){Console.WriteLine("Waiting for a connection... ");TcpClient client = server.AcceptTcpClient();Console.WriteLine("Connected!");NetworkStream stream = client.GetStream();int i;byte[] bytes = new byte[256];while ((i = stream.Read(bytes, 0, bytes.Length)) != 0){string data = Encoding.ASCII.GetString(bytes, 0, i);Console.WriteLine($"Received: {data}");byte[] msg = Encoding.ASCII.GetBytes(data.ToUpper());stream.Write(msg, 0, msg.Length);Console.WriteLine("Sent: {0}", data.ToUpper());}client.Close();}}catch (SocketException e){Console.WriteLine("SocketException: {0}", e);}finally{server.Stop();}}
}
TCP客户端:
using System;
using System.Net.Sockets;
using System.Text;public class TcpClientExample
{public static void Main(){try{Int32 port = 13000;TcpClient client = new TcpClient("127.0.0.1", port);NetworkStream stream = client.GetStream();Console.Write("Enter message: ");string message = Console.ReadLine();byte[] data = Encoding.ASCII.GetBytes(message);stream.Write(data, 0, data.Length);Console.WriteLine("Sent: {0}", message);byte[] responseData = new byte[256];int bytes = stream.Read(responseData, 0, responseData.Length);string response = Encoding.ASCII.GetString(responseData, 0, bytes);Console.WriteLine("Received: {0}", response);stream.Close();client.Close();}catch (ArgumentNullException e){Console.WriteLine("ArgumentNullException: {0}", e);}catch (SocketException e){Console.WriteLine("SocketException: {0}", e);}}
}
使用 UDP 套接字
UDP服务器:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;public class UdpServer
{public static void Main(){UdpClient server = new UdpClient(11000);IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);Console.WriteLine("UDP Server is up and waiting for packets...");while (true){byte[] data = server.Receive(ref remoteEP);string message = Encoding.ASCII.GetString(data);Console.WriteLine($"Received: {message} from {remoteEP}");byte[] response = Encoding.ASCII.GetBytes("Echo: " + message);server.Send(response, response.Length, remoteEP);}}
}
UDP客户端:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;public class UdpClientExample
{public static void Main(){UdpClient client = new UdpClient();client.Connect("127.0.0.1", 11000);Console.Write("Enter message: ");string message = Console.ReadLine();byte[] data = Encoding.ASCII.GetBytes(message);client.Send(data, data.Length);IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);byte[] responseData = client.Receive(ref remoteEP);string response = Encoding.ASCII.GetString(responseData);Console.WriteLine("Received: {0}", response);client.Close();}
}
使用场景
1.实时通讯应用:
- 如聊天应用、视频流等,通常使用TCP来确保数据可靠传输。
2.游戏开发:
- 游戏开发中,UDP通常用于快速传输实时数据。
3.物联网和嵌入式设备通信:
- 在设备之间进行数据交换,可能使用UDP来降低延迟。
希望这些信息能够帮助你更好地理解 C# 网络编程的基本知识点!如果有进一步的疑问或具体需求,请随时提出。