Unity3D总结记录(十三) Unity中Sockets的运用

服务端创建,如下代码可实现创建TCP服务端,可发送并接受来自客户端的消息,仅能支持一个客户端。

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


public class socketServer : MonoBehaviour
{
    Thread connectThread;  //当前服务端监听子线程
    public string address; //当前地址
    public int port=8888;
    TcpClient remoteClient;  //远程客户端

    // Use this for initialization
    void Start()
    {
        connectThread = new Thread(InitServerSocket);
        connectThread.Start();
    }

    // Update is called once per frame
    void Update()
    {


    }

    //severSocket方法创建
    public void InitServerSocket()
    {
        int bufferSize = 8192;  //缓存区大小
        IPAddress ip = IPAddress.Parse("192.168.1.115");
        //新建TCP链接,并开启子线程
        TcpListener tcpListener = new TcpListener(ip, port);
        tcpListener.Start();
        Debug.Log("服务端---->客户端完成,并开启tcp链接监听");


        //如有远程客户端链接,此时,得到的其对象,用于通讯
        remoteClient = tcpListener.AcceptTcpClient();
        Debug.Log("客户端链接开始,本地地址端口:" + remoteClient.Client.LocalEndPoint + "远程客户端端口:" + remoteClient.Client.RemoteEndPoint);

        NetworkStream stream = remoteClient.GetStream();


        do
        {
            try
            {
                byte[] buffer = new byte[bufferSize];
                int byteRead = stream.Read(buffer, 0, bufferSize);
                if (byteRead == 0)
                {
                    Debug.Log("客户端断开");
                    break;
                }
                string msg = Encoding.Default.GetString(buffer, 0, byteRead);
                Debug.Log("接收到的数据" + msg + "数据长度" + byteRead + "字节");

            }
            catch (System.Exception ex)
            {
                Debug.Log("客户端异常:" + ex.Message);
                //客户端出现异常或者断开的时候,关闭线程,防止溢出
                tcpListener.Stop();
                break;
            }


        } while (true);


    }
    public void SendMessageToClient()
    {
        if (remoteClient != null)
        {
            remoteClient.Client.Send(Encoding.UTF8.GetBytes("MovieSelect|1.wmv#"));
        }
    }

    /// <summary>e
    /// 销毁时关闭监听线程及连接
    /// </summary>
    void OnDestroy()
    {
        if (remoteClient != null)
            remoteClient.Close();
        if (connectThread != null)
            connectThread.Abort();


    }


}


客户端的创建,如下代码可实现tcp客户端的创建,可发送并接受来自服务器的消息,支持Hex数据格式。

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




public class sockets : MonoBehaviour
{
    private  IPAddress serverIP;
    private Socket Client;
    private bool connectState = false;
    private byte[] receiveData = new byte[1024];
    private string receiveMessage;
    private Thread reThread;


    void Start()
    {
        reConnect();
        
        
    }

    void Update()
    {
        
        Debug.Log(Client.Connected);

    }


    //链接服务器
    void reConnect()
    {
        serverIP = IPAddress.Parse("127.0.0.1");
        Client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        Client.Connect(serverIP,8885);

        reThread = new Thread(ReceiveMessage);
        reThread.Start();
        //ReceiveMessage();

    }


    //接受服务器的消息
    void ReceiveMessage()
    {
        bool flag = true;
        while (flag)
        {
            if (Client.Connected == false)
                flag=!flag;
            int length = Client.Receive(receiveData);
            receiveMessage = Encoding.Default.GetString(receiveData,0, length);
            Debug.Log("Recieve Message is "+receiveMessage);
        }


    }


    public void sendMsg()
    {
        try
        {
            //定义要传送的信息 字符串
            //string message = sendText.GetComponent<Text>().text;


            string message = "要发送的字符串";
            byte[] data = Encoding.Default.GetBytes(message);
            Client.Send(data, 0, data.Length, SocketFlags.None);
            Debug.Log("send successfull");
        }
        catch (System.Exception ex) 
        {

            Debug.Log("sendStringError"+ex);
        }
       
    }

    public void sendHexMsg()
    {
        try
        {
            //定义要传送的信息16进制
            byte[] buffer = { 0x23, 0x56, 0xFE, 0x39 };
            //byte[] data = Encoding.Default.GetBytes(message);
            //myClientsocket.Send(buffer, 0, buffer.Length, SocketFlags.None);
            Client.Send(buffer, buffer.Length, 0);


            Debug.Log("send successfull");
        }
        catch (System.Exception ex)
        {
            Debug.Log("sendHexError"+ex);
           
        }
       
    }

    public void shutDownThread()
    {
        reThread.Abort();
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_39591280/article/details/80925347