unity3d Socket异步通信

服务端

基本流程

  • 创建套接字
  • 绑定套接字的IP和端口号——Bind()
  • 使套接字处于监听状态等待客户端的连接请求——Listen()
  • 当请求到来后,使用BeginAccept()和EndAccept()方法接受请求,返回新的套接字
  • 使用BeginSend()/EndSend和BeginReceive()/EndReceive()两组方法与客户端进行收发通信
  • 返回,再次等待新的连接请求
  • 关闭套接字
  • using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Net;
    using System.Net.Sockets;
     
    namespace AsyncServer
    {
    public class AsyncTCPServer
    {
    public void Start()
    {
    //创建套接字
    IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6065);
    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    //绑定端口和IP
    socket.Bind(ipe);
    //设置监听
    socket.Listen(10);
    //连接客户端
    AsyncAccept(socket);
    }
     
    /// <summary>
    /// 连接到客户端
    /// </summary>
    /// <param name="socket"></param>
    private void AsyncAccept(Socket socket)
    {
    socket.BeginAccept(asyncResult =>
    {
    //获取客户端套接字
    Socket client = socket.EndAccept(asyncResult);
    Console.WriteLine(string.Format("客户端{0}请求连接...", client.RemoteEndPoint));
    AsyncSend(client, "服务器收到连接请求");
    AsyncSend(client, string.Format("欢迎你{0}",client.RemoteEndPoint));
    AsyncReveive(client);
    }, null);
    }
     
    /// <summary>
    /// 接收消息
    /// </summary>
    /// <param name="client"></param>
    private void AsyncReveive(Socket socket)
    {
    byte[] data = new byte[1024];
    try
    {
    //开始接收消息
    socket.BeginReceive(data, 0, data.Length, SocketFlags.None,
    asyncResult =>
    {
    int length = socket.EndReceive(asyncResult);
    Console.WriteLine(string.Format("客户端发送消息:{0}", Encoding.UTF8.GetString(data)));
    }, null);
    }
    catch (Exception ex)
    {
    Console.WriteLine(ex.Message);
    }
    }
     
    /// <summary>
    /// 发送消息
    /// </summary>
    /// <param name="client"></param>
    /// <param name="p"></param>
    private void AsyncSend(Socket client, string p)
    {
    if (client == null || p == string.Empty) return;
    //数据转码
    byte[] data = new byte[1024];
    data = Encoding.UTF8.GetBytes(p);
    try
    {
    //开始发送消息
    client.BeginSend(data, 0, data.Length, SocketFlags.None, asyncResult =>
    {
    //完成消息发送
    int length = client.EndSend(asyncResult);
    //输出消息
    Console.WriteLine(string.Format("服务器发出消息:{0}", p));
    }, null);
    }
    catch (Exception e)
    {
    Console.WriteLine(e.Message);
    }
    }
    }
    }

    客户端

    基本流程

    • 创建套接字并保证与服务器的端口一致
    • 使用BeginConnect()和EndConnect()这组方法向服务端发送连接请求
    • 使用BeginSend()/EndSend和BeginReceive()/EndReceive()两组方法与服务端进行收发通信
    • 关闭套接字
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Net;
    using System.Net.Sockets;
     
    namespace AsyncClient
    {
    public class AsyncTCPClient
    {
    /// <summary>
    /// 连接到服务器
    /// </summary>
    public void AsynConnect()
    {
    //端口及IP
    IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6065);
    //创建套接字
    Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    //开始连接到服务器
    client.BeginConnect(ipe, asyncResult =>
    {
    client.EndConnect(asyncResult);
    //向服务器发送消息
    AsynSend(client,"你好我是客户端");
    AsynSend(client, "第一条消息");
    AsynSend(client, "第二条消息");
    //接受消息
    AsynRecive(client);
    }, null);
    }
     
    /// <summary>
    /// 发送消息
    /// </summary>
    /// <param name="socket"></param>
    /// <param name="message"></param>
    public void AsynSend(Socket socket, string message)
    {
    if (socket == null || message == string.Empty) return;
    //编码
    byte[] data = Encoding.UTF8.GetBytes(message);
    try
    {
    socket.BeginSend(data, 0, data.Length, SocketFlags.None, asyncResult =>
    {
    //完成发送消息
    int length = socket.EndSend(asyncResult);
    Console.WriteLine(string.Format("客户端发送消息:{0}", message));
    }, null);
    }
    catch (Exception ex)
    {
    Console.WriteLine("异常信息:{0}", ex.Message);
    }
    }
     
    /// <summary>
    /// 接收消息
    /// </summary>
    /// <param name="socket"></param>
    public void AsynRecive(Socket socket)
    {
    byte[] data = new byte[1024];
    try
    {
    //开始接收数据
    socket.BeginReceive(data, 0, data.Length, SocketFlags.None,
    asyncResult =>
    {
    int length = socket.EndReceive(asyncResult);
    Console.WriteLine(string.Format("收到服务器消息:{0}", Encoding.UTF8.GetString(data)));
    AsynRecive(socket);
    }, null);
    }
    catch (Exception ex)
    {
    Console.WriteLine("异常信息:", ex.Message);
    }
    }
    }
    }



猜你喜欢

转载自blog.csdn.net/zouxin_88/article/details/80372372