前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、Socket通信原理
Socket是比较常用的一种通信方式。有关介绍可以点击查看Socket通信原理
二、画面传输设计
1.逻辑设计图
2.Unity服务端
首先创建一个Unity工程,然后新建Server场景,用于接受数据,展示画面。
然后再场景中创建一个RawImage并设置为全屏。
如图:
然后创建一个脚本,命名为UnityServer,再创建一个UnityServer.cs
在Start函数中创建Socket服务器,并开启一个线程用于接受数据。
这里要注意一点,不能在接受数据线程中处理数据,需要在主线程中进行处理。
因为Unity主线程里面的资源不允许其他线程进行访问。
在Update函数中处理数据,并展示图片。
UnityServer .cs代码如下:
using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Net.Sockets; using System.Threading; using UnityEngine; using UnityEngine.UI; public class UnityServer : MonoBehaviour { Socket socket = null; Thread thread = null; byte[] buffer = null; bool receState = true; int readTimes = 0; public RawImage rawImage; private Queue<byte[]> datas; void Start () { buffer = new byte[1024 * 1024 * 10]; // 创建服务器, 以Tcp的方式 socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Connect(IPAddress.Parse("192.168.1.87"), 10002); // 开启一个线程, 用于接受数据 thread = new Thread(new ThreadStart(Receive)); thread.Start(); datas = new Queue<byte[]>(); } private void Receive() { while (thread.ThreadState == ThreadState.Running && socket.Connected) { // 接受数据Buffer count是数据的长度 int count = socket.Receive(buffer); if (receState && count > 0) { receState = false; BytesToImage(count, buffer); } } } MemoryStream ms = null; public void BytesToImage(int count, byte[] bytes) { try { ms = new MemoryStream(bytes, 0, count); datas.Enqueue(ms.ToArray()); // 将数据存储在一个队列中,在主线程中解析数据。这是一个多线程的处理。 readTimes++; if (readTimes > 5000) { readTimes = 0; GC.Collect(2); // 达到一定次数的时候,开启GC,释放内存 } } catch { } receState = true; } void Update() { if (datas.Count > 0) { // 处理纹理数据,并显示 Texture2D texture2D = new Texture2D(Screen.width, Screen.height); texture2D.LoadImage(datas.Dequeue()); rawImage.texture = texture2D; } } void OnDestroy() { try { if (socket != null) { socket.Shutdown(SocketShutdown.Both); } } catch { } try { if (thread != null) { thread.Abort(); } } catch { } datas.Clear();<i style="color:transparent">本文来源gaodai$ma#com搞$$代**码网$</i> } }