Socket(套接字、插口)
TCP和UCP的区别:
1、基于连接和无连接
2、对系统资源的要求(TCP较多,UCP少)
3、UDP程序结构简单
4、流模式和数据报模式
5、TCP保证数据正确性和数据先后顺序,UDP可能丢包,且不保证数据到达先后顺序
// 进行前先寻得本机IPv4地址
win + R ——>cmd——>输入ipconfig
// TCP类
class TCP{// 服务器端套接字(指定的寻址方案的一个实例.IPv4,套接字类型.字节流,支持的协议.TCP)Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);// 客户端套接字Socket tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);//Internet 协议 (IP) 地址(IP 地址的字节数组值)IPAddress ipAddress = new IPAddress(new byte[] { 192, 168, 77, 1 });public void TcpServer(){//IP + Port(端口) 地址和端口号,端口号由自己指定,用于链接IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 0001);tcpServer.Bind(ipEndPoint); /*将相关联 tcpServer 与本地终结点*/// 侦听tcpServer(挂起的连接队列的最大长度)tcpServer.Listen(20);Console.WriteLine("正在连接客户端……");// 新创建的连接Socket client = tcpServer.Accept();Console.WriteLine("一个客户端链接过来了");// 接收信息byte[] data = new byte[1024];// 将tcpServer数据的按字节存入接收缓冲区(接收到的数据的存储位置)int length = client.Receive(data);//字符编码.获取 UTF-8 格式的编码.将指定字节数组中的一个字节序列解码为一个字符串(包含要解码的字节序列的字节数组,第一个要解码的字节的索引,要解码的字节数)string message = Encoding.UTF8.GetString(data, 0, length);Console.WriteLine("接收到客户端的消息:" + message);// 发送消息,将指定字符串中的所有字符编码为一个字节序列client.Send(Encoding.UTF8.GetBytes("欢迎你的到来"));// 关闭Socket连接和释放所有关联资源client.Close();tcpServer.Close();}public void TcpClient(){//IP + Port(端口),与客户端一致,保证接收IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 0001);//建立与远程主机的连接(远程设备)tcpClient.Connect(ipEndPoint);Console.WriteLine("链接上了服务器端!");string message = "我上线了";tcpClient.Send(Encoding.UTF8.GetBytes(message));byte[] data = new byte[1024];int length = tcpClient.Receive(data);Console.WriteLine("接收到服务器的信号:" + Encoding.UTF8.GetString(data));tcpClient.Close();}}
// UDP类
class UDP{Socket udpServer = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);Socket udpClient = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);IPAddress ipAddress = new IPAddress(new byte[] { 192, 168, 77, 1 });public void UdpSer(){IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 1111);// udpServer连接节点ipEndPintudpServer.Bind(ipEndPoint);// 提供了一个指示服务器必须侦听的所有网络接口上的客户端活动的 IP 地址IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 0);// 标识网络地址,abstrct类EndPoint ep = ipep;byte[] data = new byte[1024];// 接收到数据缓冲区,将存储终结点(数据的存储位置,引用传递(远程服务器))int length = udpServer.ReceiveFrom(data, ref ep);Console.WriteLine("接收到来着UDP客户端的数据:" + Encoding.UTF8.GetString(data, 0, length));udpServer.Close();}public void UdpCnt(){byte[] data = Encoding.UTF8.GetBytes("你好,udp客户端上线了");IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 1111);udpClient.SendTo(data, ipEndPoint);udpClient.Close();}}
// 主程
static void Main(string[] args){// TCPTCP server = new TCP();Thread sr = new Thread(server.TcpServer);Thread ct = new Thread(server.TcpClient);sr.Start();ct.Start();Thread.Sleep(1000);sr.Abort();ct.Abort();// UDPUDP udp = new UDP();Thread sUdp = new Thread(udp.UdpSer);Thread cUdp = new Thread(udp.UdpCnt);sUdp.Start();cUdp.Start();Thread.Sleep(1000);cUdp.Abort();sUdp.Abort();}
// 结果
正在连接客户端……
链接上了服务器端!
一个客户端链接过来了
接收到客户端的消息:我上线了
接收到服务器的信号:欢迎你的到来 接收到来着UDP客户端的数据:你好,udp客户端上线了
请按任意键继续. . .