Unity双端Socket,同步和异步

客户端

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using  System.Net.Sockets;
using System.Threading;
using UnityEngine.UI;

public class Echo : MonoBehaviour
{
    //定义套接字
    private Socket _socket;

    //UGUI
    public InputField inputField;
    public Text text;
    private string recvStr = "";
    readonly byte[] readBuff = new byte[1024];

    //点击连接按钮
    public void Connection()
    {
        //Socket
        _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //地址族,套接字类型,协议

        //syncConnect
        // _socket.Connect("192.168.1.151",8888);
        //AsyncConnect
        _socket.BeginConnect("192.168.1.151", 8888, ConnectCallback, _socket);
    }

    //Async Connect 回调
    void ConnectCallback(IAsyncResult asyncResult)
    {
        try
        {
            Socket socket = (Socket) asyncResult.AsyncState;
            socket.EndConnect(asyncResult);
            Debug.Log("Socket Connect Success");
            socket.BeginReceive(readBuff, 0, 1024, 0, ReceiveCallback, socket);
        }
        catch (SocketException e)
        {
            Debug.Log($"Socket Connect fail{e.ToString()}");
        }
    }

    //Async Receive 回调
    void ReceiveCallback(IAsyncResult asyncResult)
    {
        try
        {
            Socket socket = (Socket) asyncResult.AsyncState;
            int count = socket.EndReceive(asyncResult);
            recvStr = System.Text.Encoding.Default.GetString(readBuff, 0, count);
            socket.BeginReceive(readBuff, 0, 1024, 0, ReceiveCallback, socket);
        }
        catch (SocketException e)
        {
            Debug.Log($"Socket Receive fail{e.ToString()}");
        }
    }

    //点击发送按钮
    public void Send()
    {
        // SendSync();
        SendAsync();
    }

    public void SendSync()
    {
        //Send 
        string sendStr = inputField.text;
        byte[] sendBytes = System.Text.Encoding.Default.GetBytes(sendStr);
        _socket.Send(sendBytes);
        //Recv
        int count = _socket.Receive(readBuff);
        string recvStr = System.Text.Encoding.Default.GetString(readBuff, 0, count);
        text.text = recvStr;
        //Close
        _socket.Close();

        Connection();
    }

    //Async 发送
    public void SendAsync()
    {
        //Send 
        string sendStr = inputField.text;
        byte[] sendBytes = System.Text.Encoding.Default.GetBytes(sendStr);
        for (int i = 0; i < 10000; i++)
        {
            _socket.BeginSend(sendBytes, 0, sendBytes.Length, 0, SendCallBck, _socket);
        }
    }

    public void SendCallBck(IAsyncResult asyncResult)
    {
        try
        {
            Socket socket = (Socket) asyncResult.AsyncState;
            int count = socket.EndSend(asyncResult);
        }
        catch (SocketException e)
        {
            Debug.Log($"Socket Send fail {e.ToString()}");
        }
    }
    private void Start()
    {
        AsyncTest();
        Debug.Log("ling,ling,ling");
    }

    private void Update()
    {
        text.text = recvStr;
    }

    void SyncTest()
    {
        System.Threading.Thread.Sleep(5000);
        Debug.Log("铃铃铃");
    }
    void AsyncTest()
    {
        Timer timer = new Timer(TimeOut, null, 5000, 0);
        timer.Change(5000, 0);
    }

    private void TimeOut(System.Object state)
    {
        Debug.Log("铃铃铃");
    }
}

服务端

VS建立一个Console C# 工程

using System;
using System.Net;
using System.Net.Sockets;
using System.Collections.Generic;
namespace SocketSaver
{
    class ClientState
    {
        public Socket socket;
        public byte[] readBuff = new byte[1024];
    }
    class MainClass
    {
        //监听
        static Socket listenfd;
        //客户端Socket及状态信息
        static Dictionary<Socket, ClientState> clients = new Dictionary<Socket, ClientState>();

        public static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            //Socket
            Socket listenfd = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //Bild
            IPAddress ipAdr = IPAddress.Parse("192.168.1.151");
            IPEndPoint ipEp = new IPEndPoint(ipAdr,8888);
            MainClass mainClass = new MainClass();
            //
            //mainClass.SyncSaver(listenfd, ipEp);
            //
            mainClass.AsyncSaver(listenfd, ipEp);
        }
        public void SyncSaver(Socket listenfd,IPEndPoint ipEp)
        {
            listenfd.Bind(ipEp);
            //Listen
            listenfd.Listen(0);
            Console.WriteLine("[服务器]启动成功");
            while (true)
            {
                //Accept
                Socket connfd = listenfd.Accept();
                Console.WriteLine("[服务器]Accept");
                //Receive
                byte[] readBuff = new byte[1024];
                int count = connfd.Receive(readBuff);
                string readStr = System.Text.Encoding.Default.GetString(readBuff, 0, count);
                Console.WriteLine("[服务器接收]" + readStr);
                //Console.WriteLine("[服务器接收来自]" + connfd.Available);
                //Send
                byte[] sendBytes = System.Text.Encoding.Default.GetBytes(readStr);
                connfd.Send(sendBytes);
            }
        }
        void AsyncSaver(Socket listenfd,IPEndPoint ipEp)
        {
            listenfd.Bind(ipEp);
            listenfd.Listen(0);
            Console.WriteLine("[Async 服务器]启动成功");
            listenfd.BeginAccept(AsyncAcceptCallBack,listenfd);
            //等待
            Console.ReadLine();
        }
        //Accept 回调
        void AsyncAcceptCallBack(IAsyncResult asyncResult)
        {
            try
            {
                Console.WriteLine("[服务器]Accept");
                Socket listenfd = (Socket) asyncResult.AsyncState;
                Socket clientfd = listenfd.EndAccept(asyncResult);
                //clients 列表
                ClientState state = new ClientState();
                state.socket = clientfd;
                clients.Add(clientfd,state);
                //接收数据BeginReceive
                clientfd.BeginReceive(state.readBuff,0,1024,0, ReceiveCallBack,state);
                //继续Accept
                listenfd.BeginAccept(AsyncAcceptCallBack,listenfd);
            }
            catch (SocketException e)
            {

                Console.WriteLine($"Socket Accept fail{e.ToString()}");
            }
        }
        void ReceiveCallBack(IAsyncResult asyncResult)
        {
            try
            {
                ClientState state = (ClientState)asyncResult.AsyncState;
                Socket clientfd = state.socket;
                int count = clientfd.EndReceive(asyncResult);
                //客户端关闭
                if (count == 0)
                {
                    clientfd.Close();
                    clients.Remove(clientfd);
                    return;
                }

                string recvStr = System.Text.Encoding.Default.GetString(state.readBuff,0,count);
                Console.WriteLine("[服务器接收]" + recvStr);
                byte[] sendBytes = System.Text.Encoding.Default.GetBytes("服务端:echo我接收到客户端消息:"+ recvStr);
                clientfd.Send(sendBytes);//减少代码量,不用异步
                clientfd.BeginReceive(state.readBuff,0,1024,0,ReceiveCallBack,state);
            }
            catch (SocketException e)
            {
                Console.WriteLine($"Socket Receive fail{e.ToString()}");
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_35385242/article/details/126728760