(C#)TCP与UDP通信流程、Tcplistener和Tcpclient进行通信、UdpClient进行通信

1.基于Tcp协议的Socket通讯类似于B/S架构,面向连接,不同的是服务器端可以向客户端主动的推送消息

流程顺序。可靠性高

(1)建立一个套接字(Socket)

(2)绑定服务器端IP地址及端口号-服务器端

(3)利用Listen()方法开启监听-服务器端

(4)利用Accept()方法等待客户端连接-服务器端

(5)Connect()方法与服务器端建立连接-客户端

(6)Send()方法向建立连接的主机发送消息

(7)Recive()方法接收来自建立连接的主机的消息

(8)closesocket关闭套接字

2.基于Udp的协议是无连接的。占用资源少,响应速度快,延迟低。(不可靠连接)。数据报模式

流程顺序

(1)建立一个套接字(Socket)

(2)绑定服务器端IP地址及端口号-服务器端

(3)通过SendTo()方法向制定的主机发送消息

(4)通过ReciveFrom()方法接收指定主机发送的消息

3.Tcplistener和Tcpclient进行通信

通过listener来创建socket,与客户端进行通信。

Tcplistener和Tcpclient利用NetWorkStream类表示网络。使用GetStream方法返回网络流,

然后调用该流的Read和Write方法,对数据进行读取和写入。

Tcplistener和Tcpclient中维护了一个Socket对象。

服务器

TcpListener创建传入IP和Port,start开始监听,AccptTcpClient方法得到客户端的连接返回一个TcpClientduixiang

调用这个TcpClient对象中的GetStream方法得到一个NetworkStream,一个网络流。使用这个网络流的Read方法

得到byte类型的数据。

class Program
    {
        static void Main(string[] args)
        {
            //1.TcpListener对socket进行了一层封装,在这个类中自己会去创建socket对象
            TcpListener listener = new TcpListener(IPAddress.Parse("192.168.1.103"), 7788);
            
            //2.开始监听
            listener.Start();
            
            //3.等待客户端连接过来
            TcpClient client = listener.AcceptTcpClient();

            //4.取得客户端发送过来的数据
            NetworkStream stream = client.GetStream();//得到了一个网络流,从这个网络流可以取得客户端发送过来的数据

            byte[] data = new byte[1024];
            while (true)
            {
                int length = stream.Read(data, 0, 1024);//读取数据.参数:0是从哪个索引开始存放数据,1024最大读取的字节数。返回值为实际读取的数据
                string message = Encoding.UTF8.GetString(data, 0, length);
                Console.WriteLine("Get message:" + message);
            }

            //5.释放资源
            stream.Close();
            client.Close();
            listener.Stop();
            Console.ReadKey();
        }
    }

客户端

通过创建TcpClient建立跟服务器的连接,通过GetStream方法,获得stream流,调用Write方法写入数据,传送信息给服务器

class Program
    {
        static void Main(string[] args)
        {
            //当我们创建tcpclient对象的时候,就会跟server去建立连接
            TcpClient client = new TcpClient("192.168.1.103", 7788);

            NetworkStream stream = client.GetStream();

            //read读取数据,write写入数据
            //利用一个死循环,重复向服务器端发送数据
            while (true)
            {
                string message = Console.ReadLine();
                byte[] data = Encoding.UTF8.GetBytes(message);
                stream.Write(data, 0, data.Length);
            }

            stream.Close();
            client.Close();
            Console.ReadKey();

        }
    }

4.udpclient

udp只有一个类

Server端

创建UdpClient绑定ip和port

创建一个IPEndPoint存储接收到的数据来自什么ip和port

class Program
    {
        static void Main(string[] args)
        {
            //创建udpclient绑定ip跟端口号
            UdpClient udpClient = new UdpClient
           (new IPEndPoint(IPAddress.Parse("192.168.1.103"), 7788));

            while (true)
            {
                //接收数据
                IPEndPoint point = new IPEndPoint(IPAddress.Any, 0);
                byte[] data = udpClient.Receive(ref point);//通过point确定数据来自哪个ip的哪个端口号
                string message = Encoding.UTF8.GetString(data);
                Console.WriteLine("Get Msg:" + message);
            }
            udpClient.Close();
            Console.ReadKey();
        }
    }

客户端

创建UdpClient,使用Send方法将数据传输给制定的IP和Port

class Program
    {
        static void Main(string[] args)
        {
            UdpClient client = new UdpClient();
            while (true)
            {
                string message = Console.ReadLine();
                byte[] data = Encoding.UTF8.GetBytes(message);

                client.Send(data, data.Length, new IPEndPoint(IPAddress.Parse("192.168.1.103"), 7788));
            }
            client.Close();
            Console.ReadKey();
        }
    }

猜你喜欢

转载自blog.csdn.net/Game_Builder/article/details/81265560