国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Unity使用webSocket與服務(wù)器通信(三)——C#服務(wù)端(Fleck)與Unity客戶端( NativeWebSocket)傳輸多種數(shù)據(jù)數(shù)據(jù)

這篇具有很好參考價(jià)值的文章主要介紹了Unity使用webSocket與服務(wù)器通信(三)——C#服務(wù)端(Fleck)與Unity客戶端( NativeWebSocket)傳輸多種數(shù)據(jù)數(shù)據(jù)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、通信時(shí)會(huì)傳輸哪些內(nèi)容

  • 1、字符串?dāng)?shù)據(jù)
    簡(jiǎn)單的字符串:比如登錄請(qǐng)求信息,登錄結(jié)果返回的信息。
    用json系列化的字符串:比如上傳一個(gè)表到服務(wù)器,讓它寫入到數(shù)據(jù)庫中。
    讀取文件的時(shí)候,讀取的是string內(nèi)容。

  • 2、二進(jìn)制數(shù)據(jù)
    比如傳輸?shù)氖俏募豪鏼yword.doc,myexcel.xls或者是assetboundle文件。
    比如上傳實(shí)驗(yàn)報(bào)告,生成實(shí)驗(yàn)報(bào)告并下載等。
    讀取文件的時(shí)候,直接讀取字節(jié)碼。

二、Unity(NativeWebSocket)和服務(wù)端(Fleck)怎么約定要傳輸?shù)臄?shù)據(jù)格式

Unity使用webSocket與服務(wù)器通信(三)——C#服務(wù)端(Fleck)與Unity客戶端( NativeWebSocket)傳輸多種數(shù)據(jù)數(shù)據(jù)

1、Unity(NativeWebSocket)發(fā)送和接收信息的API有哪些?

  • 發(fā)送字符串
    SendText(string message)
  • 發(fā)送二進(jìn)制
    Send(byte[] bytes)
  • 接收字符串【無】
    OnMessage(string : msg)
  • 接收二進(jìn)制
    OnMessage(bytes : byte[])

2、服務(wù)器發(fā)送string和byte[]給Unity時(shí),Unity如何處理?

  • Fleck發(fā)送string,使用Send(message:string)
  • Fleck發(fā)送二進(jìn)制,使用Send(bytes:byte[])
  • Unity客戶端統(tǒng)一使用OnMessage(bytes : byte[])進(jìn)行數(shù)據(jù)的接收
    Unity需要識(shí)別這個(gè)包是什么內(nèi)容:字符串指令,系列化的json字符串,不同種類的二進(jìn)制文件…等等!

3、傳輸?shù)臄?shù)據(jù)格式

Unity使用webSocket與服務(wù)器通信(三)——C#服務(wù)端(Fleck)與Unity客戶端( NativeWebSocket)傳輸多種數(shù)據(jù)數(shù)據(jù)

4、服務(wù)器和客戶端信息來往說明

Unity使用webSocket與服務(wù)器通信(三)——C#服務(wù)端(Fleck)與Unity客戶端( NativeWebSocket)傳輸多種數(shù)據(jù)數(shù)據(jù)

5、接收和發(fā)送的關(guān)鍵部分

(1)、客服端發(fā)送信息

  • 發(fā)送json文件到服務(wù)器
var jsonString = JsonUtility.ToJson(myScores); //myScores 預(yù)先定義的得分信息
websocket.SendText($"JSONSCOR{jsonString}");
  • 發(fā)送字符串指令到服務(wù)器
/// <summary>
/// 命令字符串
/// </summary>
/// <param name="text">命令字符串</param>
/// <returns></returns>
public async UniTask SendCommand(string cmdText)
{
    //傳輸時(shí)自動(dòng)在前面添加[COMD]
    var msg = $"COMD{cmdText}";
    await websocket.SendText(msg);
}
  • 發(fā)送二進(jìn)制文件到服務(wù)器
/// <summary>
/// 發(fā)送文件
/// </summary>
/// <param name="file">file.extend</param>
/// <param name="data">byte[]數(shù)據(jù)</param>
/// <returns>成功與否</returns>
public async UniTask<bool> SendBinary(string fileName,byte[] data)
{
    Debug.Log($"即將發(fā)送數(shù)據(jù):{fileName} {data.Length}");
    var rtn = false;
    if (fileName.Length > 30)
    {
        Debug.Log("文件名不能超過30個(gè)字符");
        rtn = false;
    }
    else
    {
        var head = Encoding.UTF8.GetBytes("BINA");                         
        var fileNameBytes = Encoding.UTF8.GetBytes(fileName.PadRight(30)); 
        var allData = new List<byte>();                                         
        allData.AddRange(head);             //頭
        allData.AddRange(fileNameBytes);    //文件名稱
        allData.AddRange(data);             //文件數(shù)據(jù)
        await websocket.Send(allData.ToArray());
        rtn = true;
    }
    return true;
}

(2)、客戶端向服務(wù)器發(fā)送下載請(qǐng)求,并等待數(shù)據(jù)到達(dá)

  • 發(fā)送【COMDdown#shiYanBaoGao.docx】
  • 等待二進(jìn)制數(shù)據(jù)下載
  • 保存文件到本地
//下載文件
downLoadBtn.onClick.AddListener(async () =>
{
    //【1】文件名
    var file = "shiYanBaoGao.docx";

    Debug.Log("從服務(wù)器下載文件");
    //COMD + down + # + shiYanBaoGao.docx

    //【2】請(qǐng)求下載實(shí)驗(yàn)報(bào)告
    var cmdText = $"COMDdown#{file}";    //[COMD][down][#][shiYanBaoGao.docx]
    await Connection.instance.websocket.SendText(cmdText);
    
    //【3】等待接收實(shí)驗(yàn)報(bào)告
    var data = await Connection.instance.ReceiveBinaryAsync(file);

    //【4】保存文件
    Debug.Log($"收到文件{file},大小為{data.Length}");
    FileSave.instance.SaveFileBytes(file,data);
});

(3)、客戶端從服務(wù)器下載時(shí)的異步等待實(shí)現(xiàn)

客戶端申請(qǐng)下載某個(gè)文件的時(shí)候邏輯:

  • 客戶端創(chuàng)建下載任務(wù)
  • 客戶端收到下載數(shù)據(jù)時(shí)判斷是否是某個(gè)任務(wù)的下載需求,是則把收到的數(shù)據(jù)寫入該任務(wù)緩沖里面
  • 下載完成后讀取收到的數(shù)據(jù),并從列表中刪除該任務(wù)

任務(wù)列表的定義:

/// <summary>
/// 下載任務(wù)列表: 客戶端申請(qǐng)下載某個(gè)文件的時(shí)候使用。
///  private List<DownFileTask> DownFileTasks = new List<DownFileTask>();
/// </summary>
[Serializable]
public class DownFileTask
{
    /// <summary>
    /// 任務(wù)ID
    /// </summary>
    public int taskID;

    /// <summary>
    /// 要下載的文件的名字:
    /// </summary>
    public string fileName;

    /// <summary>
    /// 下載狀態(tài):false-未下載,true-下載成功
    /// </summary>
    public bool state;

    /// <summary>
    /// 文件的數(shù)據(jù):二進(jìn)制信息
    /// </summary>
    public List<byte> data;
}

異步等待下載文件:

/// <summary>
/// 等待接收文件
/// </summary>
/// <param name="fileName">文件名</param>
/// <returns></returns>
public async UniTask<byte[]> ReceiveBinaryAsync(string fileName)
{
    //【1】創(chuàng)建下載任務(wù)
    var taskId = CreatTask(fileName, ref DownFileTasks);

    //【2】OnMessage(bytes[])+ ()=>{}中更新,收到文件,寫入數(shù)據(jù)
    //在ParseBytes()里
    
    Debug.Log(DownFileTasks.Where(x => x.taskID == taskId).All(x => x.state));
    Debug.Log("開始等待下載......");

    //【3】等待下載
    await UniTask.WaitUntil
    (
        () => DownFileTasks.Where(x => x.taskID == taskId).All(x => x.state) == true
    );

    //【4】提取數(shù)據(jù)
    Debug.Log("提取數(shù)據(jù)......");
    var data = DownFileTasks.First(x => x.taskID == taskId).data;

    //【5】刪除下載任務(wù)
    Debug.Log("刪除下載任務(wù)......");
    DeleteTask(taskId, ref DownFileTasks);

    //【6】返回?cái)?shù)據(jù)
    return data.ToArray();
}

6、客戶端socket的主要事件綁定

  • 連接打開時(shí)…
  • 連接出錯(cuò)時(shí)…
  • 連接關(guān)閉時(shí)…
  • 收到二進(jìn)制數(shù)據(jù)時(shí)…
/// <summary>
/// 連接服務(wù)器
/// </summary>
/// <param name="ip">服務(wù)器ip</param>
/// <param name="port">服務(wù)器端口號(hào)</param>
/// <returns></returns>
async UniTask<bool> ConnectServer(string ip, int port)
{
    bool rtn = false;
    try
    {
        //websocket = new WebSocket("ws://192.168.0.137:8081");
        Debug.Log($"ws://{ip}:{port}");
        websocket = new WebSocket($"ws://{ip}:{port}");

        //連接打開時(shí)...
        websocket.OnOpen += () =>
        {
            hasConnected = true;

            userID = iptfdUsername.text;
            Debug.Log("Connection open!");
            textLog.text = $"Connection open! {Time.realtimeSinceStartup} {Environment.NewLine} {textLog.text}";
            websocket.SendText($"COMDname#{userID}"); //發(fā)送用戶id
        };

        //連接出錯(cuò)時(shí)...
        websocket.OnError += (e) =>
        {
            Debug.Log("Error! " + e);
            textLog.text = $"Error:{e} {Time.realtimeSinceStartup} {Environment.NewLine} {textLog.text}";
        };

        //連接關(guān)閉時(shí)...
        websocket.OnClose += (e) =>
        {
            hasConnected = false;
            Debug.Log("連接被關(guān)閉了!");
            textLog.text = $"連接被關(guān)閉了! {Time.realtimeSinceStartup} {Environment.NewLine} {textLog.text}";
        };

        //收到二進(jìn)制數(shù)據(jù)時(shí)...
        websocket.OnMessage += (bytes) =>
        {
            //解析數(shù)據(jù)
            ParseBytes(bytes);
        };

        //開始連接
        await websocket.Connect();
        rtn = true;
    }
    catch (Exception e)
    {
        Debug.Log($"連接服務(wù)器出錯(cuò):{e.Message}");
        textLog.text = $"連接服務(wù)器出錯(cuò):{e.Message}";
        rtn = false;
    }
    return rtn;
}

7、服務(wù)器端socket的主要事件綁定

  • 連上時(shí)…
  • 斷開時(shí)…
  • 收到字符串?dāng)?shù)據(jù)時(shí)…
  • 收到二進(jìn)制數(shù)據(jù)時(shí)…
//var server = new WebSocketServer("ws://192.168.0.137:8081");  
var server = new WebSocketServer($"ws://{ip}:{port}");
server.Start(socket =>
{
    //連上ss
    socket.OnOpen = () =>
    {
        this.Invoke(new Action(() =>
        {
            //textBoxLog.Text += $"有新用戶連入:{socket.ConnectionInfo.ClientIpAddress} {Environment.NewLine} {textBoxLog.Text}";
            AddText($"有新用戶連入:{socket.ConnectionInfo.ClientIpAddress}");
        }));
   
        //報(bào)錯(cuò)的寫法
        //textBoxLog.Text = $"有新用戶連入:{socket.ConnectionInfo.ClientIpAddress} \n {textBoxLog.Text}";
        //SetTextLog($"有新用戶連入:{socket.ConnectionInfo.ClientIpAddress}");

        Debug.WriteLine($"有新用戶連入:{socket.ConnectionInfo.ClientIpAddress}");

        //回復(fù)一個(gè)信息
        //SendCommand(socket);
    };

    //斷開
    socket.OnClose = () =>
    {
        Debug.WriteLine($"用戶斷開連接:{socket.ConnectionInfo.ClientIpAddress}");
        this.Invoke(new Action(() =>
        {
            AddText($"用戶斷開連接:{socket.ConnectionInfo.ClientIpAddress}");
        }));
        UserSockets.First(x => x.socket.ConnectionInfo.Id == socket.ConnectionInfo.Id).connected = false;
    };

    //收到string信息
    socket.OnMessage = message =>
    {
        Debug.WriteLine($"收到一條消息,來自:{socket.ConnectionInfo.ClientIpAddress}");
        Debug.WriteLine(message);

        this.Invoke(new Action(() =>
        {
            AddText($"收到一條消息,來自:{socket.ConnectionInfo.ClientIpAddress}");
            AddText($"{message}");
        }));

        //解析客戶端字符串命令
        ParseString(message,socket);
    };

    //收到二進(jìn)制信息
    socket.OnBinary = bytes =>
    {
        var userName = UserSockets.First(x => x.socket.ConnectionInfo.Id == socket.ConnectionInfo.Id)
            .userID;
        Debug.WriteLine($"收到二進(jìn)制數(shù)據(jù),長(zhǎng)度為{bytes.Length}Bytes,來自ip:{socket.ConnectionInfo.ClientIpAddress},userID ={userName}");
        
        this.Invoke(new Action(() =>
        {
            AddText($"收到二進(jìn)制數(shù)據(jù),長(zhǎng)度為{bytes.Length}Bytes,來自ip:{socket.ConnectionInfo.ClientIpAddress},userID ={userName}");
        }));

        var head = Encoding.UTF8.GetString(bytes.Take(4).ToArray());

        switch (head)
        {
            case "BINA":
                //收到二進(jìn)制文件
                ParseBinaryFile(bytes,socket);
                break;

            case "other":
                //
                break;

            default:
                //
                break;
        }
    };
});

三、todo

實(shí)時(shí)傳輸語音和視頻文章來源地址http://www.zghlxwxcb.cn/news/detail-402820.html

到了這里,關(guān)于Unity使用webSocket與服務(wù)器通信(三)——C#服務(wù)端(Fleck)與Unity客戶端( NativeWebSocket)傳輸多種數(shù)據(jù)數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C#知識(shí)點(diǎn)-13(進(jìn)程、多線程、使用Socket實(shí)現(xiàn)服務(wù)器與客戶端通信)

    C#知識(shí)點(diǎn)-13(進(jìn)程、多線程、使用Socket實(shí)現(xiàn)服務(wù)器與客戶端通信)

    進(jìn)程 定義:每一個(gè)正在運(yùn)行的應(yīng)用程序,都是一個(gè)進(jìn)程? 進(jìn)程不等于正在運(yùn)行的應(yīng)用程序。而是為應(yīng)用程序的運(yùn)行構(gòu)建一個(gè)運(yùn)行環(huán)境 多線程 這段代碼在執(zhí)行完成之前,程序會(huì)被卡死(不能操作程序,包括關(guān)閉窗口)。因?yàn)槲覀兂绦蛟谧鲆恍┖臅r(shí)操作的時(shí)候,如果主線程去執(zhí)

    2024年02月22日
    瀏覽(229)
  • JavaWeb-WebSocket瀏覽器服務(wù)器雙向通信

    JavaWeb-WebSocket瀏覽器服務(wù)器雙向通信

    WebSocket是基于TCP的一種新的網(wǎng)絡(luò)協(xié)議。它實(shí)現(xiàn)了瀏覽器與服務(wù)器 全雙工通信 —瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就可以創(chuàng)建 持久性 的連接,并進(jìn)行雙向數(shù)據(jù)傳輸。 HTTP傳輸 WebSocket傳輸 HTTP協(xié)議和WebSocket協(xié)議的對(duì)比: HTTP是短連接,WebSocket是長(zhǎng)連接 HTTP通信是單向

    2024年01月21日
    瀏覽(30)
  • python模塊websockets,瀏覽器與服務(wù)器之間的雙向通信

    一、簡(jiǎn)介 WebSocket是一種在Web瀏覽器和服務(wù)器之間進(jìn)行實(shí)時(shí)雙向通信的協(xié)議。它通過建立一條持久的連接,允許服務(wù)器主動(dòng)向客戶端推送數(shù)據(jù),實(shí)現(xiàn)實(shí)時(shí)性和雙向通信的能力。 與傳統(tǒng)的HTTP請(qǐng)求-響應(yīng)模式不同,WebSocket提供了一個(gè)長(zhǎng)時(shí)間運(yùn)行的連接,可以在客戶端和服務(wù)器之間進(jìn)

    2024年02月21日
    瀏覽(19)
  • C#與西門子PLC1500的ModbusTcp服務(wù)器通信3--搭建ModbusTcp服務(wù)器

    C#與西門子PLC1500的ModbusTcp服務(wù)器通信3--搭建ModbusTcp服務(wù)器

    ?注意,這個(gè)IP地址必須與西門子虛擬網(wǎng)卡的IP地址及虛擬機(jī)的網(wǎng)卡IP地址同一網(wǎng)段 ? ? ? ? ? 找到程序塊main,找到右邊的指令,找到通信,找到其它,拖到MB_SERVER到程序段1中 ? ?重點(diǎn)看mb_hold_reg和connect參數(shù),disconnet為false表示被動(dòng)連接,意思是說服務(wù)器等待客戶機(jī)來連接,而

    2024年02月11日
    瀏覽(31)
  • OPC通信從入門到精通_2_OPC通信詳解和C#客戶端編程(OPC基礎(chǔ)概念;OPC通信仿真(KepServer作為OPC服務(wù)器;使用Modbus Slave和另外軟件仿真2個(gè)PLC設(shè)備);C#程序)

    OPC通信從入門到精通_2_OPC通信詳解和C#客戶端編程(OPC基礎(chǔ)概念;OPC通信仿真(KepServer作為OPC服務(wù)器;使用Modbus Slave和另外軟件仿真2個(gè)PLC設(shè)備);C#程序)

    OPC誕生緣由:OPC誕生之前,軟件工程師是不了解硬件和協(xié)議的 OPC解決的是軟件和硬件之間的問題,讓軟件工程師無需了解協(xié)議及底層硬件,例如串口協(xié)議等 OPC起到了橋梁的作用:軟件工程師對(duì)接OPC,OPC對(duì)接硬件 OPC是一種通訊方式,落到實(shí)處就是一個(gè)軟件,就需要開發(fā)相應(yīng)的

    2024年02月05日
    瀏覽(103)
  • C#與西門子PLC1500的ModbusTcp服務(wù)器通信1--項(xiàng)目背景

    C#與西門子PLC1500的ModbusTcp服務(wù)器通信1--項(xiàng)目背景

    最近在一個(gè)120萬元的項(xiàng)目中,涉及到modbustcp通信,我作為軟件總工負(fù)責(zé)項(xiàng)目的通信程序開發(fā),modbus是一個(gè)在工業(yè)自動(dòng)化領(lǐng)域中的通信協(xié)議,可以是modbusrtu,modbusascii,modbustcp三個(gè)形式,具體來說是三個(gè)不同的數(shù)據(jù)包結(jié)構(gòu),具體的細(xì)節(jié)請(qǐng)讀者自行熟悉,這里只講項(xiàng)目中應(yīng)用過程

    2024年02月12日
    瀏覽(20)
  • Unity-UDP-客戶端/服務(wù)器通信功能

    Unity-UDP-客戶端/服務(wù)器通信功能

    這里簡(jiǎn)單實(shí)現(xiàn)客戶端和服務(wù)器,復(fù)雜的實(shí)現(xiàn)需要和前幾篇文章的TCP一樣,管理多個(gè)鏈接過來的客戶端,這里只有一個(gè)。需要自己封裝類似listener來管理多個(gè)鏈接過來的設(shè)備,每次都緩存ReceiveAsync收到消息的中的RemoteEndPoint地址端口,統(tǒng)一管理發(fā)送接收消息。 https://zhidao.baidu.c

    2024年02月11日
    瀏覽(34)
  • C#與西門子PLC1500的ModbusTcp服務(wù)器通信2--ModbusTcp協(xié)議

    C#與西門子PLC1500的ModbusTcp服務(wù)器通信2--ModbusTcp協(xié)議

    Modbus TCP是近年來越來越流行的工業(yè)控制系統(tǒng)通信協(xié)議之一,與其他通信協(xié)議相比,Modbus TCP通信速度快、可靠性高、兼容性強(qiáng)、適用于模擬或數(shù)字量信號(hào)的傳輸,閱讀本文前你必須比較熟悉Modbus協(xié)議,了解tcp網(wǎng)絡(luò)。 Modbus TCP是一種以太網(wǎng)協(xié)議,它將Modbus通信協(xié)議封裝在TCP/IP包內(nèi)

    2024年02月11日
    瀏覽(23)
  • C# Socket通信從入門到精通(16)——單個(gè)同步UDP服務(wù)器監(jiān)聽多個(gè)客戶端C#代碼實(shí)現(xiàn)

    C# Socket通信從入門到精通(16)——單個(gè)同步UDP服務(wù)器監(jiān)聽多個(gè)客戶端C#代碼實(shí)現(xiàn)

    我們?cè)陂_發(fā)UDP通信程序時(shí),有時(shí)候我們也需要開發(fā)UDP服務(wù)器程序,這個(gè)服務(wù)器只需要和一個(gè)客戶端實(shí)現(xiàn)通信,比如這篇博文C# Socket通信從入門到精通(15)——單個(gè)同步UDP服務(wù)器監(jiān)聽一個(gè)客戶端C#代碼實(shí)現(xiàn),但是在實(shí)際項(xiàng)目中有的時(shí)候需要和多個(gè)客戶端進(jìn)行通信,這時(shí)和一個(gè)客

    2024年01月22日
    瀏覽(97)
  • C# Socket通信從入門到精通(15)——單個(gè)同步UDP服務(wù)器監(jiān)聽一個(gè)客戶端C#代碼實(shí)現(xiàn)

    C# Socket通信從入門到精通(15)——單個(gè)同步UDP服務(wù)器監(jiān)聽一個(gè)客戶端C#代碼實(shí)現(xiàn)

    我們?cè)陂_發(fā)UDP通信程序時(shí),除了開發(fā)UDP客戶端程序,有時(shí)候我們也需要開發(fā)UDP服務(wù)器程序,這在實(shí)際項(xiàng)目中是經(jīng)常會(huì)遇到的,所以說掌握UDP服務(wù)器程序的開發(fā)是一項(xiàng)必備的技能,尤其在上位機(jī)軟件開發(fā)領(lǐng)域,掌握UDP服務(wù)器程序的開發(fā)是走向高級(jí)工程師的必經(jīng)之路,也是面試必

    2024年02月03日
    瀏覽(94)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包