利用TCP和UDP协议进行网络通信

TCP和UDP传输介绍

1.TCP协议通信需要在服务器与客户端之间建立连接。服务器端通过服务器方创建的端口接受客户端连接,客户端通过客户端方创建的端口socket发送消息、接收消息。服务器端通过在客户端连接服务器时创建的端口socket向客户端发送消息、接受消息。

2.UDP协议通信不需要建立连接,也无服务器与客户端之分,传输消息只需要向特定端口发送消息即可。

3.协议通信包括同步通信和异步通信

4.图解

  1. 服务器创建套接字socket,绑定端口,监听端口,并开启接受连接
  2. 客户端创建套接字socket,绑定端口,连接服务器
  3. 当客户端连接服务器时,服务器端将创建客户端socket副本并保存
  4. 客户端socket可以向服务器发送报文
  5. 服务器通过客户端socket副本发送报文

  1. 服务器端创建套接字socket,绑定端口,开启接受消息
  2. 客户端创建套接字socket,绑定端口,开启接受消息
  3. 服务器端通过本身socket向指定端口发送消息
  4. 客户端通过本身socket向指定端口发送消息

同步通信:

接受连接:Accept()

接收消息:Receive()

发送消息:Send()

异步通信:

开始异步接受连接:BeginAccept()

当有连接请求时,触发回调函数:EndAccept()

开始异步接受消息:BeginReceive()

当有消息到达时,触发回调函数:EndReceive ()

TCP通信实例:

创建服务器

 public void CreateServer()
        {

//创建TCP协议套接字
            listenfd = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress ipAdr = IPAddress.Parse("192.168.1.112");
            IPEndPoint ipEp = new IPEndPoint(ipAdr, 1234);
            //listenfd.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);   //端口复用


            listenfd.Bind(ipEp);   //绑定端口

            listenfd.Listen(maxConn);      //监听,maxConn是允许客户端连接的最大数量
            listenfd.BeginAccept(AcceptCb, null);                 //开启异步连接,当有客户端连接时,触发回调函数AcceptCb()
        }

  private void AcceptCb(IAsyncResult ar)
        {
            try
            {
                Socket socket = listenfd.EndAccept(ar);         //为连接客户端创建新的socket副本
//功能语句
                    conn.socket.BeginReceive(conn.readBuff, conn.buffCount, conn.BuffRemain(), SocketFlags.None, ReceiveCb, conn);                                          //对所连接客户端开始异步接收消息,当有客户端发送消息时触发回调函数ReceiveCb()
                }
                listenfd.BeginAccept(AcceptCb, null);
            }
            catch (Exception e)
            {

            }
        }

 public void ReceiveCb(IAsyncResult ar)
        {
            Conn conn = (Conn)ar.AsyncState; 
            try
            {
                int count = conn.socket.EndReceive(ar);//获取接收到的字节流的长度

//功能语句
                }

//开启异步接收消息,当接收到消息时,触发回调函数ReceiveCb()
              conn.socket.BeginReceive(conn.readBuff, conn.buffCount, conn.BuffRemain(), SocketFlags.None, ReceiveCb, conn);
            }
            catch (Exception)
            {
            }
        }

创建客户端:

  public void ConnectServer()
    {

//创建TCP协议套接字
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        string host = "192.168.1.112";
        int port = 1234;
        try
        {

//连接服务器
            socket.Connect(host, port);

//开启异步接收消息
            socket.BeginReceive(readBuff, 0, BUFFER_SIZE, SocketFlags.None, ReceiveCb, null);
        }
        catch (Exception e)
        {
            socket.Close();   //关闭socket
        }
    }

  private void ReceiveCb(IAsyncResult ar)
    {
        try
        {
        //功能语句

//开启异步接收消息
            socket.BeginReceive(readBuff, buffCount, BUFFER_SIZE - buffCount, SocketFlags.None, ReceiveCb, null);
        }
        catch (Exception)
        {

        }
    }

UDP通信实例

创建客户端

   public void CreateServer()
        {
            if (server == null)
            {

//创建UDP套接字
                server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            }

//绑定端口
            server.Bind(new IPEndPoint(IPAddress.Parse(serverIPAddress), serverEndPoint));//绑定端口号和IP

//新建线程接收数据
            receiveThread = new Thread(ReciveMsg);
            receiveThread.Start();                        
           // Debug.Log("服务器创建成功");
        }

  private void ReciveMsg()
        {
            while (m_IsReceive)
            {
                EndPoint point = new IPEndPoint(IPAddress.Any, 0);//用来保存发送方的ip和端口号
                byte[] buffer01 = new byte[1024 * 256];
                try
                {
                    int length = server.ReceiveFrom(buffer01, ref point);//接收数据
                }
                catch (Exception e)
                {
                   // Debug.Log(e);
                }
                // inputBufferQueue.Enqueue(buffer);
            }
        }

创建客户端

 private void CreateClient()
    {

       //创建UDP套接字
        m_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

        //绑定端口
        m_Socket.Bind(new IPEndPoint(IPAddress.Parse(clientIPAddress), clientEndPoint));

        receiveThread = new Thread(ReciveMsg);
        receiveThread.Start();

        //新建显示屏幕
        Debug.Log("客户端已经开启");
    }
    private void ReciveMsg()
    {
        while (m_IsReceive)
        {
            EndPoint point = new IPEndPoint(IPAddress.Any, 0);//用来保存发送方的ip和端口号
            try
            {
                byte[] buffer = new byte[1024 * 64];     //udp传输包的最大限制是1024*64
                int length = m_Socket.ReceiveFrom(buffer, ref point);//接收数据报

                 texBufferQue.Add(buffer);         //将数据放入缓冲区
            }
            catch (Exception e)
            {
                Debug.Log(e);
            }
            //Sort(texBufferQue);
        }
    }

本人第一次接触网络传输编程,这是在工作中经过学习,自己积累了对网络传输的一些了解。如有不对的地方希望各位看到之后指出,也希望各位能进行补充。希望不会对各位读者产生误解!

谢谢

发布了13 篇原创文章 · 获赞 9 · 访问量 8263

猜你喜欢

转载自blog.csdn.net/qq_39025293/article/details/81750811