zoukankan      html  css  js  c++  java
  • Unity 简易聊天室(基于TCP)(2)

    客户端用Unity开发,主要就是搭建一下聊天室的UI界面:输入框,聊天内容显示框,发送按钮

     

    灰色背景的就是Message,也就是聊天内容的显示框,是一个Text类型,这里创建UI方面就不多讲了

     在Canvas下挂一个ChatManager脚本

    using System;
    using UnityEngine;
    using System.Net.Sockets;
    using System.Net;
    using UnityEngine.UI;
    using System.Text;

    public class ChatManager : MonoBehaviour {
      private Socket clientSocket;

      private Button btn;
      private InputField inputField;
      private Text showMessage;

      private byte[] data = new byte[1024];

      private string msg = "";

      void Start()
      {

        //创建一个socket,绑定和服务器一样的ip和端口号,然后执行Connect就可以连接上服务器了(服务器已经运行)
        clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        clientSocket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6688));

        btn = transform.Find("Button").GetComponent<Button>();
        btn.onClick.AddListener(OnSendClick);

        inputField = transform.Find("InputField").GetComponent<InputField>();
        showMessage = transform.Find("BG/Message").GetComponent<Text>();

        ClientStart();
      }

      void Update()
      {

        if(msg!=null && msg != "")
        {
          showMessage.text += msg+" ";回调函数不能调用Unity的组件、UI;所以只能在Update里用,而不能直接在ReceiveCallBack(回调函数不属于Unity的主线程)
          msg = "";
        }
      }

      private void OnSendClick()  //绑定到发送按钮的方法
      {
        if (inputField.text != "")
        {
          byte[] databytes = Encoding.UTF8.GetBytes(inputField.text);
          clientSocket.Send(databytes);
          inputField.text = "";
        }
      }


      private void ClientStart()  //开始接收从服务器发来的消息
      {
        clientSocket.BeginReceive(data, 0, 1024,SocketFlags.None, ReceiveCallBack, null);
      }

      private void ReceiveCallBack(IAsyncResult ar)
      {
        try
        {  
          if (clientSocket.Connected == false)
          {
            clientSocket.Close();
            return;
          }
          int len = clientSocket.EndReceive(ar);
          string message = Encoding.UTF8.GetString(data, 0, len);
          msg = message;
          ClientStart();  //重复接收从服务器发来的信息
        }
        catch(Exception e)
        {
          Debug.Log("ReceiveCallBack:" + e);
        }
      }

      void OnDestroy()
      {
        clientSocket.Close();
      }

    }

  • 相关阅读:
    [三]JavaIO之IO体系类整体设计思路 流的概念以及四大基础分类
    [二] JavaIO之File详解 以及FileSystem WinNTFileSystem简介
    [一]FileDescriptor文件描述符 标准输入输出错误 文件描述符
    [零] JavaIO入门简介 程序设计语言 为什么需要IO库
    装饰器模式 Decorator 结构型 设计模式 (十)
    适配器模式 adapter 结构型 设计模式(九)
    layui 鼠标悬停单元格显示全部
    mysql 日期总结
    区域块路由与全局路由兼容,双重路由
    JS-SDK相关参考
  • 原文地址:https://www.cnblogs.com/darkif/p/10072479.html
Copyright © 2011-2022 走看看