h8476532 2022-07-04 16:38 采纳率: 88.9%
浏览 26
已结题

Unity UI 按钮来开启客户端的问题

请问一下,目前想要用UI的按钮,按一下可以开启客户端并接收伺服端传来的资讯,但是由于我直接挂载到一个物件上,再把这个物件挂载到按钮的ON CLICK上面,但是由于已经挂载在一个物件上了,所以执行的时候没按按钮就直接执行了,想请问一下客户端这边程式该怎么修正?

客户端程式:

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

/// <summary>
/// 客戶端的控制腳本
/// </summary>
public class ClientSocketController : MonoBehaviour
{
    /// <summary>
    /// 鏈接對象
    /// </summary>
    public Socket clientSocket;
    /// <summary>
    /// ip地址
    /// </summary>
    public string ipAddress = "127.0.0.1";
    /// <summary>
    /// 端口號,這個是服務器開設的端口號
    /// </summary>
    public int portNumber = 10001;
    /// <summary>
    /// 鏈接間隔時間
    /// </summary>
    public float connectInterval = 1;
    /// <summary>
    /// 當前鏈接時間
    /// </summary>
    public float connectTime = 0;
    /// <summary>
    /// 鏈接次數
    /// </summary>
    public int connectCount = 0;
    /// <summary>
    /// 是否在連接中
    /// </summary>
    public bool isConnecting = false;


    //-------------------CoderZ 2022.06.16-------------------
    private Queue<string> dataQueue = new Queue<string>();

    void Start()
    {
        //調用開始連接
        ConnectedToServer();

    }
    /// <summary>
    /// 鏈接到服務器
    /// </summary>
    public void ConnectedToServer()
    {
        //鏈接次數增加
        connectCount++;
        isConnecting = true;
        Debug.Log("這是第" + connectCount + "次連接");
        //如果客戶端不為空
        if (clientSocket != null)
        {
            try
            {
                //斷開連接,釋放資源
                clientSocket.Disconnect(false);
                clientSocket.Close();
            }
            catch (System.Exception e)
            {
                Debug.Log(e.ToString());
            }

        }

        //創建新的鏈接(固定格式)
        clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        //設置端口號和ip地址
        EndPoint endPoint = new IPEndPoint(IPAddress.Parse(ipAddress), portNumber);

        //發起鏈接
        clientSocket.BeginConnect(endPoint, OnConnectCallBack, "");
    }
    /// <summary>
    /// 開始鏈接的回調
    /// </summary>
    /// <param name="ar"></param>
    public void OnConnectCallBack(IAsyncResult ar)
    {
        Debug.Log("連接完成!!!!");
        if (clientSocket.Connected)
        {
            //鏈接成功
            Debug.Log("連接成功");
            connectCount = 0;

            //開啟收消息
            ReceiveFormServer();
        }
        else
        {
            //鏈接失敗
            Debug.Log("連接失敗");
            //計時重置
            connectTime = 0;
        }
        isConnecting = false;
        //結束鏈接
        clientSocket.EndConnect(ar);
    }
    /// <summary>
    /// 向服務器發送字符串信息
    /// </summary>
    /// <param name="msg"></param>
    public void SendMessageToServer(string msg)
    {
        //將字符串轉成byte數組
        byte[] msgBytes = System.Text.Encoding.UTF8.GetBytes(msg);
        clientSocket.BeginSend(msgBytes, 0, msgBytes.Length, SocketFlags.None, SendMassageCallBack, 1);
    }
    /// <summary>
    /// 發送信息的回調
    /// </summary>
    /// <param name="ar"></param>
    public void SendMassageCallBack(IAsyncResult ar)
    {
        //關閉消息發送
        int length = clientSocket.EndSend(ar);
        Debug.Log("信息發送成功,發送的信息長度是:" + length);
    }
    /// <summary>
    /// 從服務器接收消息
    /// </summary>
    public void ReceiveFormServer()
    {
        //定義緩衝池
        byte[] buffer = new byte[512];
        clientSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveFormServerCallBack, buffer);
    }
    /// <summary>
    /// 信息接收方法的回調
    /// </summary>
    /// <param name="ar"></param>
    public void ReceiveFormServerCallBack(IAsyncResult ar)
    {
        //結束接收
        int length = clientSocket.EndReceive(ar);
        byte[] buffer = (byte[])ar.AsyncState;
        //將接收的東西轉為字符串
        string msg = System.Text.Encoding.UTF8.GetString(buffer, 0, length);
        //Debug.Log(msg); //接收到的消息是 //"接收到的消息是"+

        //開啟下一次接收消息
        ReceiveFormServer();

        //string robottarget = Convert.ToString(msg);
        //robottarget = string.Join("", robottarget.Split());

        //List<string> r_robottarget = robottarget.Split(',').ToList();
        //Debug.Log(robottarget);
        //Debug.Log(r_robottarget);

        //CoderZ 2020.06.16 将服务端发送来的数据存入队列
        dataQueue.Enqueue(msg);
    }

    void Update()
    {
        //if (Input.GetMouseButton(0))
        //{
        //    SendMessageToServer("哭阿!");
        //}
        //if (clientSocket != null && clientSocket.Connected == false)
        //{
        //    //鏈接沒有成功
        //    //計時
        //    connectTime += Time.deltaTime;
        //    if (connectTime > connectInterval && isConnecting == false)//如果時間大於鏈接重置時間間隔且沒有鏈接
        //    {
        //        if (connectCount >= 7)
        //        {
        //            Debug.Log("已經嘗試了7次,請檢查網絡連接");
        //            clientSocket = null;
        //        }
        //        else
        //        {
        //            //重連一次
        //            ConnectedToServer();
        //        }

        //    }


        //}

        //CoderZ 2020.06.16 从队列中取出数据
        if (dataQueue.Count > 0)
        {
            string data = dataQueue.Dequeue();
            string[] r_robottarget = data.Split(',');
            //打印
            for (int i = 0; i < r_robottarget.Length; i++)
            {
                Debug.Log(r_robottarget[i]);
            }

            //第一个关节数据
            joint1.Instance.ReceiveData(r_robottarget[0]);
            //第二個關節數據
            joint2.Instance.ReceiveData(r_robottarget[1]);
            //第三個關節數據
            joint3.Instance.ReceiveData(r_robottarget[2]);
            //第四個關節數據
            joint4.Instance.ReceiveData(r_robottarget[3]);
            //第五個關節數據
            joint5.Instance.ReceiveData(r_robottarget[4]);
            //第六個關節數據
            joint6.Instance.ReceiveData(r_robottarget[5]);
        }
    }

            private void OnDestroy()
    {
        Debug.Log("物體被銷毀");
        //關閉客戶端
        clientSocket.Close();
    }
}

伺服端程式:

            double c_px = 90;
            double c_py = -90;
            double c_pz = 90;
            double c_rx = 90;
            double c_ry = 90;
            double c_rz = 0;

            //創建服務器
            Socket severSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            //ip地址和端口號綁定
            EndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10001);
            //綁定服務器
            severSocket.Bind(endPoint);

            //發起監聽
            severSocket.Listen(1000);

            Console.WriteLine("server already opened!");
            Console.WriteLine("Waiting for Client connect!");
            Socket cilentSocket = severSocket.Accept();//這裡會阻塞,等待鏈接
            Console.WriteLine("client is connect.");

            string data = string.Format("{0},{1},{2},{3},{4},{5}", c_px, c_py, c_pz, c_rx, c_ry, c_rz);
            byte[] sendMsg = System.Text.Encoding.UTF8.GetBytes(data);
            int sendLength = cilentSocket.Send(sendMsg, SocketFlags.None);
            System.Threading.Thread.Sleep(500); //停頓秒

img

play之后按下去disconnect可以结束执行unity,现在想要按一下Connect按钮才开启客户端并接收资讯,但是不知道要怎么修改?
求各位博主帮帮忙指导一下!!

  • 写回答

1条回答 默认 最新

  • 周周的Unity小屋 2022-07-04 17:34
    关注

    你这个脚本是挂载到了某个游戏物体上是吗,然后你的connect按钮也注册了ConnectedToServer()连接方法了是吗?那你把开始方法里面注释或删掉 ConnectedToServer()就可以了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 7月12日
  • 已采纳回答 7月4日
  • 创建了问题 7月4日

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。