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";//改成自己的ippublic 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;}}
}

Hololens2初入—— Unity socket 异步通讯相关推荐

  1. HoloLens2初入——Unity远程调试时启用眼动追踪和手势追踪功能

    文章目录 HoloLens2初入--Unity远程调试时启用眼动追踪和手势追踪功能 引言 基础环境 安装DotNetWinRT包 设置MRTK配置文件 配置光标指示点 效果图 现在的中文博客很少,公司 ...

  2. Hololens2初入——解决HL真机到PC图像传输的实时性问题

    文章目录 Hololens2初入--解决HL真机到PC图像传输的实时性问题 引言 正文 解决方案 具体方案 示例动图 原工程的一个小问题 Hololens2初入--解决HL真机到PC图像传输的实时性问 ...

  3. HoloLens2 初入——从Lut表中求解相机内参

    文章目录 HoloLens2 初入--从Lut表中求解相机内参 引言 HoloLens2 的相机们 基本条件 解畸变 ----------------------------------------- ...

  4. MicroPython_ESP8266_IoT——第四回 初入联网(接入了贝壳物联)

    第四回 初入联网(接入了贝壳物联) 本来计划先把所有的硬件介绍完,再介绍如何介入贝壳物联的.但是那样就比较枯燥,还是先尝试接入贝壳物联,来增加ESP8266模块的可玩性. 需要了解[贝壳物联平台通信协 ...

  5. Linux网络编程一步一步学-异步通讯聊天程序select

    什么是异步通讯? 就是通讯任意一方可以任意发送消息,有消息来到时会收到系统提示去接收消息. 这里要用到select函数.使用步骤如下: 1.设置一个集合变量,用来存放所有要判断的句柄(file des ...

  6. 2019 初入IT十年(下)---- 视线所及只剩生活

    文章大纲 视线所及只剩生活 挣钱 迷茫之后 10条建议 那些年我写过的总结 2018 初入IT十年(上)----成为一名优秀的程序员 初入IT十年下,本来打算在2019年初写完,结果拖到了现在.在程序 ...

  7. 初入Android~系统化学习必备(转自http://bbs.weand.com/read-htm-tid-6142.html)

    初入Android~系统化学习必备 什么是Android手机? 答:简单的说Android手机是运行在谷歌Android手机操作系统上的手机统称为Android手机,也可称为gphone手机. 目前A ...

  8. 程序员初入公司:10大经验让你能力提升20倍!

    IT企业普遍有个特点,"把女人当男人用,把男人当**(此处略去2个字)用." 有句俗话说,"男怕入错行",我想这句话其实也同样适用IT女生. 我们可以做个小测试 ...

  9. 程序员初入公司:10大经验让你能力提升20倍! 1

    IT企业普遍有个特点,"把女人当男人用,把男人当**(此处略去2个字)用." 有句俗话说,"男怕入错行",我想这句话其实也同样适用IT女生. 我们可以做个小测试 ...

最新文章

  1. JAVA C++ 左花括号{该另起一行写还是写在行尾的思考
  2. 通过反射获取子类和父类定义的属性
  3. linux mysql忘记root_linux下mysql-5.6忘记root密码,重置root密码详细过程
  4. python send 案例_python socket编程入门(编写server实例)+send 与sendall的区别与使用方法...
  5. 游戏角色坐标的保存间隔_使用C++编写飞机大战游戏【手把手教程】
  6. 1-100之间的奇数
  7. mfc链表中的数据如何排序输出_java程序员面试中最容易被问到的18个算法题(附答案!)...
  8. OpenCart 之 CSV 格式商品导入 – 如何导入商品主图片和附加图片?
  9. ASP.NET MVC 利用AreaRegistration进行Area区域模块化开发
  10. 苹果充电线android头断了,苹果充电线又坏了?其实一招就能搞定!还不花1分钱......
  11. 亲身经历:如何判断一个字符在a/z之前?
  12. 鲸会务,多场景覆盖数字化会议管家
  13. matlab 模拟滤波器转换为数字滤波器,模拟低通滤波器转换为数字高通滤波器.doc...
  14. postgres 判断null_postgresql基础:null的那些坑
  15. 如何下载并安装mysql_超详细的MySQL下载与安装教程
  16. 高小英和张东健1998年合作出演过爱情片《恋风恋歌
  17. ATF:Gicv源码文件系列-gic_common.h
  18. Python语言的33个保留字(记得一定要收藏好哦)
  19. Matlab符号微积分练习
  20. Component name “xxx“ should always be multi-word. vue3项目eslint报错

热门文章

  1. [原创]谷歌插件 - YE搜图助手(YeImageFinder)
  2. 如何获取与清除IE历史记录
  3. 【C语言初阶】初识C语言(上)
  4. 基于jQuery的在线商城设计与实现
  5. VisionPro 8.2支持的工业相机和格式
  6. java 游戏背包网格_网格背包的简单实现
  7. 百度统计接口 java_百度统计API的使用
  8. 推股指期货规则准备工作基本完毕
  9. 应用层 :细解PHP中的流,礼尚往来的真朋友 HTTP/HTTPS/RTMP
  10. 读书笔记-最全的 Swift 4 新特性解析