IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Hololens2初入—— Unity socket 异步通讯 -> 正文阅读

[游戏开发]Hololens2初入—— Unity socket 异步通讯

Hololens2初入——socket 异步通讯

介绍

Hololens2真机中运行的程序与在电脑端的程序要求有些不同。 它不支持同步的socket,必须采用异步的形式才能跑的通。具体的原因和细节我也没去研究过,不过记得在官网上确实提到过这一点。
下面是一段示例代码,忘了是不是从其他地方直接拷贝过来还是自己有稍微修改过了,时间有点长,也忘了参考的出处了,如果有侵犯问题请私信我。

把下面的代码复制到C#的脚本中, 脚本名称修改为TcpClient.cs,然后把这个脚本随意挂在某个对象上就可以。 这边的代码是客户端的代码,服务端的暂时忘了放在哪里了,找到再补上。
调式的话建议用一个网络调试助手小软件来调式。 网络调试助手中开启 服务端就可以。

有其他问题直接在文章下面询问, 这样其他人才能看得到,尽量不要私信我。

代码

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

namespace MyCode
{
    public class TcpClient : MonoBehaviour
    {
        //连接到Tcp客户端并能够收发信息,断线重连,将客户端发送过来的信息显示在debugText中
        //手机开热点服务器ip 172.20.10.1 (不一定是这个,从网络设置中查看)
        public Text debugText;
        public GameObject cube;
        public Socket m_socket;
        IPEndPoint m_endPoint;
        private SocketAsyncEventArgs m_connectSAEA;

        private SocketAsyncEventArgs m_sendSAEA;
        public string ip = "192.168.137.1";//改成自己的ip

        public int port = 56789;
        private string preMsg = " ";
        bool needReconnect = false;

        public UnityEvent  tcp发送事件;
        public UnityEvent  Tcp发送事件 => tcp发送事件;


        private void Start()
        {
            //Client();
            Invoke("Client", 1f);
        }
        private void Update()
        {

            // //接收信息的回调函数上无法处理与Unity直接相关部分,在这里进行修改
            // if (debugText && preMsg != " ") //接收消息
            // {
            //     //if (preMsg == "red")
            //     //{
            //     //    cube.GetComponent<Renderer>().material.color = Color.red;
            //     //    preMsg = "";
            //     //}
            //     //else if (preMsg == "green")
            //     //{
            //     //    cube.GetComponent<Renderer>().material.color = Color.green;
            //     //    preMsg = "";
            //     //}
            //     debugText.text = preMsg; //显示在Debug的UI上
            //     preMsg = " ";
            // }
            // //else
            // //{
            // //    cube.GetComponent<Renderer>().material.color = Color.yellow;
            // //}

            if (needReconnect) //处理断线重连
            {
                Invoke("Client", 5f);
                needReconnect = false;
            }
        }

        public void Client()
        {
            m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress iPAddress = IPAddress.Parse(ip);
            // IPAddress iPAddress = getIdAddress();
            print(iPAddress.ToString());
            m_endPoint = new IPEndPoint(iPAddress, port);
            m_connectSAEA = new SocketAsyncEventArgs {RemoteEndPoint = m_endPoint};
            m_connectSAEA.Completed += new EventHandler<SocketAsyncEventArgs>(OnConnectedCompleted);
            m_socket.ConnectAsync(m_connectSAEA);
        }

        private void OnConnectedCompleted(object sender, SocketAsyncEventArgs e)
        {
            if (e.SocketError != SocketError.Success)
            {
                needReconnect = true;
                return;
            }

            Socket socket = sender as Socket;
            string iPRemote = socket.RemoteEndPoint.ToString();
            Debug.Log("Client : 连接服务器" + iPRemote + "成功");

            SocketAsyncEventArgs receiveSAEA = new SocketAsyncEventArgs();
            byte[] receiveBuffer = new byte[1024 * 1024 * 16];
            receiveSAEA.SetBuffer(receiveBuffer, 0, receiveBuffer.Length);
            receiveSAEA.Completed += OnReceiveCompleted;
            receiveSAEA.RemoteEndPoint = m_endPoint;
            socket.ReceiveAsync(receiveSAEA);
        }

        private void OnReceiveCompleted(object sender, SocketAsyncEventArgs e)
        {
            if (e.SocketError == SocketError.OperationAborted) return;
            Socket socket = sender as Socket;
            if (e.SocketError == SocketError.Success && e.BytesTransferred > 0)
            {
                string ipAdress = socket.RemoteEndPoint.ToString();
                int lengthBuffer = e.BytesTransferred;
                byte[] receiveBuffer = e.Buffer;

                //读取指定位数的信息
                byte[] data = new byte[lengthBuffer];
                Array.Copy(receiveBuffer, 0, data, 0, lengthBuffer);
                string str = System.Text.Encoding.Default.GetString(data);
                string newstr = str;
                Debug.Log(newstr);
                preMsg = newstr; //这里直接赋值给debugText.text无法更新,通过update中检测的方式更新信息
                //向服务器端发送消息
                Send("Receive Message");
                socket.ReceiveAsync(e);
            }
            else if (e.BytesTransferred == 0) //连接断开的处理
            {
                if (e.SocketError == SocketError.Success)
                {
                    Debug.Log("主动断开连接 ");
                    //DisConnect();
                }
                else
                {
                    Debug.Log("被动断开连接 ");
                }

                needReconnect = true; //通过update中检测的方式更新信息
            }
            else
            {
                return;
            }
        }

        #region 发送

        public void Send(string msg)
        {
            byte[] sendBuffer = Encoding.Default.GetBytes(msg);
            if (m_sendSAEA == null)
            {
                m_sendSAEA = new SocketAsyncEventArgs();
                m_sendSAEA.Completed += OnSendCompleted;
            }

            m_sendSAEA.SetBuffer(sendBuffer, 0, sendBuffer.Length);
            if (m_socket != null)
            {
                m_socket.SendAsync(m_sendSAEA);
            }
        }

        void OnSendCompleted(object sender1, SocketAsyncEventArgs e1)
        {
            if (e1.SocketError != SocketError.Success) return;
            Socket socket1 = sender1 as Socket;
            byte[] sendBuffer = e1.Buffer;

            string sendMsg = Encoding.Default.GetString(sendBuffer);
            Debug.Log("Client : Send message" + sendMsg + "to Serer" + socket1.RemoteEndPoint.ToString());
        }

        #endregion

        #region 断开连接

        void DisConnect()
        {
            Debug.Log("断开连接");
            if (m_socket != null)
            {
                try
                {
                    m_socket.Shutdown(SocketShutdown.Both);
                }
                catch (SocketException excep)
                {
                }
                finally
                {
                    m_socket.Close();
                }
            }
        }

        #endregion

        //——————————2021-10-03———————#date#—————#time#—————————//
        private IPAddress getIdAddress()
        {
            //IPHostEntry ipEntity = Dns.GetHostEntry(Dns.GetHostName());
            IPAddress ipAddr = ipEntity.AddressList[0];

            //IPAddress ipAddr = Dns.GetHostAddresses(Dns.GetHostName())[0];
            //if (ipAddr.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6)//判断是否IP6协议
            //{
            //    ipAddr = Dns.GetHostEntry(Dns.GetHostName()).AddressList[1];
            //}
            IPAddress ipAddr = null;
            IPAddress[] arrIP = Dns.GetHostAddresses(Dns.GetHostName());
            foreach (IPAddress ip in arrIP)
            {
                if (System.Net.Sockets.AddressFamily.InterNetwork.Equals(ip.AddressFamily))
                {
                    ipAddr = ip; // IPV4
                }

                // else if (System.Net.Sockets.AddressFamily.InterNetworkV6.Equals(ip.AddressFamily))
                // {
                //     ipAddr = ip;
                // }
            }

            return ipAddr;
        }
    }
}
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-10-08 12:05:58  更:2021-10-08 12:06:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 2:41:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码