• C#网络编程TcpClient、TcpListener、UdpClient


            说到网络编程,就少不了要说说Socket。无论是在Linux系统中还是Windows系统中,都支持Socket编程。所谓的Socket就是一个套接字,由一个IP地址和一个端口确定。网络编程中一般支持面向连接和面向无连接两种,面向连接使用TCP协议,无连接使用UDP协议。下面两幅图描述面向连接和面向无连接的Socket通信过程。


    图一:面向连接


    图二:面向无连接

         从图一中可以看出,要使用Socket实现通信需要的基本步骤。首先要实例化一个Socket对象,然后进行绑定。由于面向连接,服务器端需要一直监听是否有客户端尝试连接进来。客户端同样需要实例化Socket对象,尝试连接服务器,当服务器接受某客户端的连接请求时,连接建立,此时客户端和服务器断可以进行Send和Recieve数据。.netframework允许以这样的方式来使用Socket,同时提供TcpClient、TcpListener、UdpClient三个类来简化编程过程。下面给出这三个类的使用方法。

      //TCPClient的第一种使用方法
                //声明一个TCPClient对象,并自动绑定到本地地址和一个端口上
                TcpClient test1 = new TcpClient();
                //TCPClient对象试图连接到远程主机上的8080端口上
                test1.Connect("www.baidu.com", 8080);
    
    
                //TCPClient的第二种使用方法
                //直接创建TCPClient对象,连接到远程主机上(本地自动分配随机端口)
                TcpClient test2 = new TcpClient("www.baidu.com",8080);
    
    
                //TCPClient的第三种使用方法
                //自己指定本地地址和端口值(可以尝试制定非本地地址,以伪装自己发送数据包)
                IPAddress ipa = Dns.GetHostByName(Dns.GetHostName()).AddressList[0];
                IPEndPoint ipe = new IPEndPoint(ipa,9090);
                //创建TCPClient对象,将其绑定到指定的本地地址和端口上
                TcpClient test3 = new TcpClient(ipe);
                //尝试连接到远程主机上
                test3.Connect("www.baidu.com", 8080);
    
                //TCPClient对象创建完,可以使用GetStream方法创建Stream类,进行收发数据
                NetworkStream ns = test3.GetStream();
                //写入数据
                byte[] outStream = Encoding.ASCII.GetBytes("Testing");
                ns.Write(outStream,0,outStream.Length);
                //读取数据
                byte[] inStream = new byte[1024];
                ns.Read(inStream,0,inStream.Length);


      TcpListener  listener= new TcpListener(9050);
                //启动侦听
                listener.Start();
                //AcceptClient方法返回值是TcpClient类型
                TcpClient client = listener.AcceptTcpClient();
                //得到TCPClient对象后,可以像上一个例子中一样,使用GetStream方法,读写数据
                NetworkStream ns = client.GetStream();
                //写入数据
                byte[] outStream = Encoding.ASCII.GetBytes("Testing");
                ns.Write(outStream,0,outStream.Length);
                //读取数据
                byte[] inStream = new byte[1024];
                ns.Read(inStream, 0, inStream.Length);
                //各种关闭
                ns.Close();
                client.Close();
                listener.Stop();



                //创建UDPClient对象
                UdpClient client = new UdpClient(8000);
                //接受发送主机的IP地址信息
                IPEndPoint remoteclient = new IPEndPoint(IPAddress.Any,0);
                //Receive方法包含一个IPEndPoint,携带远程发送主机的IP地址信息
                byte[] recv = client.Receive(ref remoteclient);
                string data = Encoding.ASCII.GetString(recv);
                Console.WriteLine("Data comes from : {0}",remoteclient.ToString());
                Console.WriteLine("Data : {0}", data);
                client.Close();
    
    
                //UDPClient对象创建,发送数据
                UdpClient client1 = new UdpClient(8001);
                IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("192.168.1.11"),8001);
                byte[] sendMsg = Encoding.ASCII.GetBytes("Sending Messages");
                client1.Send(sendMsg, sendMsg.Length, ipe);
                client1.Close();

    这样使用,可以方便编程,但对理解Socket实现过程没有好处。


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    简单后台登录逻辑实现Controller
    自学semantic UI个人博客首页模板
    Spring Boot日志处理
    Thymeleaf静态资源引入方式及公共页面代码抽取
    一个简单SpringBoot应用的pom.xml文件
    Spring Boot入门程序
    easyuUI实现客户分页显示逻辑分析
    easyui自学模板代码
    网络协议-webService协议
    【转】彻底搞透Netty框架
  • 原文地址:https://www.cnblogs.com/gxwang/p/4940882.html
Copyright © 2020-2023  润新知