C#__简单使用TCP/UDP发送消息

 

        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连接节点ipEndPint
            udpServer.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)
        {
            // TCP
            TCP 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();

            // UDP
            UDP 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客户端上线了
请按任意键继续. . .
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值