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

Unity中使用WebSocket (ws://)的方法

這篇具有很好參考價值的文章主要介紹了Unity中使用WebSocket (ws://)的方法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

WebSocket使得客戶端和服務器之間的數(shù)據(jù)交換變得更加簡單,允許服務端主動向客戶端推送數(shù)據(jù)。在WebSocket API中,瀏覽器和服務器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進行雙向數(shù)據(jù)傳輸。

WebSocket與http

其實從歷史上來講,websocket是為了克服http無法雙向通信而引入的,在通常的使用中,可以復用http的端口與功能,除此外,他們沒有其他的聯(lián)系,而是完全是獨立的協(xié)議,通常情況下,http是單向的web 服務,而websocket是全雙工的,服務器和客戶端可以實時的傳輸信息,在引用時他們可以在http服務器上同時部署,特別是在NodeJs中。

WebSocket與Socket?

那么websocket和socket是什么關系呢? 其實可以理解為websocket是在socket的基礎上實現(xiàn)的,其基于消息幀和TCP協(xié)議,而socket更通用,在編程中,可以選在tcp,udp,也需要自己控制數(shù)據(jù)流格式,每次的數(shù)據(jù)的長度都需要自己控制與讀取。

下邊記錄兩種Unity客戶端使用WebSocket的方法。

1.不使用插件的客戶端

引入System.Net.WebSockets;命名空間。

在使用過程中發(fā)現(xiàn)這種方法打包WebGl的的時候是存在問題的。

具體使用方法如下:

WebSocket 類 (System.Net.WebSockets) | Microsoft Learn

Unity中使用WebSocket (ws://)的方法

?Unity客戶端代碼:

using System;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using UnityEngine;
using UnityEngine.UI;

public class test4 : MonoBehaviour
{
    private void Start()
    {
        WebSocket();
    }

    public async void WebSocket()
    {
        try
        {
            ClientWebSocket ws = new ClientWebSocket();
            CancellationToken ct = new CancellationToken();
            //添加header
            //ws.Options.SetRequestHeader("X-Token", "eyJhbGciOiJIUzI1N");
            Uri url = new Uri("ws://xxx.xxx.xxx.xx:18x/xxx/xxx");
            await ws.ConnectAsync(url, ct);
            await ws.SendAsync(new ArraySegment<byte>(Encoding.UTF8.GetBytes("hello")), WebSocketMessageType.Binary, true, ct); //發(fā)送數(shù)據(jù)

            while (true)
            {
                var result = new byte[1024];
                await ws.ReceiveAsync(new ArraySegment<byte>(result), new CancellationToken());//接受數(shù)據(jù)
                var str = Encoding.UTF8.GetString(result, 0, result.Length);
                Debug.Log(str);
            }
          
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }

}

2.使用Best HTTP插件

這款插件不但支持WebSockets,還支持HTTP,Sockets等通信方式是一款不錯的插件。也支持打包Webgl

插件地址:

https://download.csdn.net/download/f402455894/87597949?spm=1001.2014.3001.5501文章來源地址http://www.zghlxwxcb.cn/news/detail-489433.html

客戶端代碼:

using UnityEngine;
using System;
using BestHTTP.WebSocket;
using Newtonsoft.Json;

public class GaoYaGuHuaLu : MonoBehaviour
{

     string address = "ws://10.xxx.xx.193:1880/xxx";

    WebSocket webSocket;

    public GaoYaGuHuaLuEntity gaoYaGuHuaLu = new GaoYaGuHuaLuEntity();

    private void Awake()
    {
       
    }
    private void Start()
    {
        Init();
    }
    public void Init()
    {
        if (webSocket == null)
        {
            webSocket = new WebSocket(new Uri(address));

#if !UNITY_WEBGL
            webSocket.StartPingThread = true;
#endif

            // Subscribe to the WS events
            webSocket.OnOpen += OnOpen;
            webSocket.OnMessage += OnMessageRecv;
            webSocket.OnBinary += OnBinaryRecv;
            webSocket.OnClosed += OnClosed;
            webSocket.OnError += OnError;

            // Start connecting to the server
            webSocket.Open();
        }
    }


    public void Destroy()
    {
        if (webSocket != null)
        {
            webSocket.Close();
            webSocket = null;
        }
    }

    void OnOpen(WebSocket ws)
    {
        Debug.Log("OnOpen: ");
      //  webSocket.Send("我來啦");
    }


    void OnMessageRecv(WebSocket ws, string message)
    {
        Debug.LogFormat("OnMessageRecv: msg={0}", message);

    }

    void OnBinaryRecv(WebSocket ws, byte[] data)
    {
        Debug.LogFormat("OnBinaryRecv: len={0}", data.Length);
    }

    void OnClosed(WebSocket ws, UInt16 code, string message)
    {
        Debug.LogFormat("OnClosed: code={0}, msg={1}", code, message);
        webSocket = null;
    }

    void OnError(WebSocket ws, string ex)
    {
        string errorMsg = string.Empty;
#if !UNITY_WEBGL || UNITY_EDITOR
        if (ws.InternalRequest.Response != null)
        {
            errorMsg = string.Format("Status Code from Server: {0} and Message: {1}", ws.InternalRequest.Response.StatusCode, ws.InternalRequest.Response.Message);
        }
#endif
        Debug.LogFormat("OnError: error occured: {0}\n", (ex != null ? ex : "Unknown Error " + errorMsg));
        webSocket = null;
    }

    public void OnClose()
    {
        // 關閉連接
        webSocket.Close(1000, "Bye!");
    }
}

加上心跳檢測和斷線重連

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
using BestHTTP;
using BestHTTP.WebSocket;
using BestHTTP.Examples;


public class ZGAndroidcCient : MonoBehaviour
{
    // w ws://XXXX:7799
    public string address = "ws://XXXX:7799";


    WebSocket webSocket;
    private bool lockReconnect = false;
    private Coroutine _pingCor, _clientPing, _serverPing;

    private void Start()
    {
        CreateWebSocket();
    }

    void CreateWebSocket()
    {
        try
        {
            webSocket = new WebSocket(new Uri(address));
#if !UNITY_WEBGL
            webSocket.StartPingThread = true;
#endif
            InitHandle();
            webSocket.Open();
        }
        catch (Exception e)
        {
            Debug.Log("websocket連接異常:" + e.Message);
            ReConnect();
        }

    }

    private void Update()
    {
        Debug.Log(lockReconnect);
    }

    void InitHandle()
    {
        RemoveHandle();
        webSocket.OnOpen += OnOpen;
        webSocket.OnMessage += OnMessageReceived;
        webSocket.OnClosed += OnClosed;
        webSocket.OnError += OnError;
    }

    void RemoveHandle()
    {
        webSocket.OnOpen -= OnOpen;
        webSocket.OnMessage -= OnMessageReceived;
        webSocket.OnClosed -= OnClosed;
        webSocket.OnError -= OnError;
    }

    void OnOpen(WebSocket ws)
    {
        Debug.Log("websocket連接成功");
        webSocket.Send("一個客戶端連過來了");
        if (_pingCor != null)
        {
            StopCoroutine(_pingCor);
            _pingCor = null;
        }
        _pingCor = StartCoroutine(HeartPing());
        // 心跳檢測重置
        HeartCheck();
    }

    void OnMessageReceived(WebSocket ws, string message)
    {
        // 如果獲取到消息,心跳檢測重置
        // 拿到任何消息都說明當前連接是正常的
        HeartCheck();
        Debug.Log(message);
    }

    void OnClosed(WebSocket ws, UInt16 code, string message)
    {
        Debug.LogFormat("OnClosed: code={0}, msg={1}", code, message);
        webSocket = null;
        ReConnect();
    }

    void OnError(WebSocket ws, string ex)
    {
        string errorMsg = string.Empty;
#if !UNITY_WEBGL || UNITY_EDITOR
        if (ws.InternalRequest.Response != null)
        {
            errorMsg = string.Format("Status Code from Server: {0} and Message: {1}", ws.InternalRequest.Response.StatusCode, ws.InternalRequest.Response.Message);
        }
#endif
        Debug.LogFormat("OnError: error occured: {0}\n", (ex != null ? ex : "Unknown Error " + errorMsg));
        webSocket = null;
        ReConnect();

    }

    void ReConnect()
    {
        if (this.lockReconnect)
            return;
        this.lockReconnect = true;
        StartCoroutine(SetReConnect());
    }

    private IEnumerator SetReConnect()
    {
        Debug.Log("正在重連websocket");
        yield return new WaitForSeconds(5);
        CreateWebSocket();
        lockReconnect = false;
    }

    //心跳檢測
    private void HeartCheck()
    {
        if (_clientPing != null)
        {
            StopCoroutine(_clientPing);
            _clientPing = null;
        }
        if (_serverPing != null)
        {
            StopCoroutine(_serverPing);
            _serverPing = null;
        }
        _clientPing = StartCoroutine(ClientPing());
    }

    // 這里發(fā)送一個心跳,后端收到后,返回一個心跳消息
    // onmessage拿到返回的心跳就說明連接正常
    private IEnumerator ClientPing()
    {
        yield return new WaitForSeconds(5);
        WebSend("heartbeat");
        _serverPing = StartCoroutine(ServerPing());
    }
    // 如果超過一定時間還沒重置,說明后端主動斷開了
    // 如果onclose會執(zhí)行reconnect,我們執(zhí)行ws.close()就行了.如果直接執(zhí)行reconnect 會觸發(fā)onclose導致重連兩次
    private IEnumerator ServerPing()
    {
        yield return new WaitForSeconds(5);
        if (webSocket != null)
        {
            webSocket.Close();
        }
      
    }

    //發(fā)送心跳
    private IEnumerator HeartPing()
    {
        while (true)
        {
            yield return new WaitForSeconds(5);
            this.WebSend("Heartbeat");
        }
    }
    //向服務端發(fā)送信息
    public void WebSend(string msg)
    {
        if (webSocket == null || string.IsNullOrEmpty(msg)) return;
        if (webSocket.IsOpen)
        {
            webSocket.Send(msg);
        }
    }

    public void OnClose()
    {
        // 關閉連接
        webSocket.Close(1000, "Bye!");
    }


}

到了這里,關于Unity中使用WebSocket (ws://)的方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領支付寶紅包贊助服務器費用

相關文章

  • 【ChatGPT】如何使用Qt設計SocketIO類型的WebSocket協(xié)議客戶端

    本文第一次發(fā)布 2023年03月24日09點28分 Authors ChatGPT / THDMI 最近寫 Flask-SocketIO 服務端的時候,苦于不熟悉前端代碼,想試著用 QT 來寫客戶端,但不清楚該怎么描述,以致于好像一直查的都是 RAW 類型的 WebSocket 協(xié)議處理,于是一直沒找到 event 和 room 或者 namespace 處理方式。 簡單

    2023年04月21日
    瀏覽(22)
  • java后端使用websocket實現(xiàn)與客戶端之間接收及發(fā)送消息

    客戶端請求websocket接口,連接通道=》我這邊業(yè)務成功客戶端發(fā)消息=》客戶端自動刷新。 接口:ws://localhost:8080/websocket/xx 經(jīng)測試,成功 如果是線上服務器連接,則需要在nginx里配置websocket相關內(nèi)容,再重啟nginx,代碼如下 本地連接的時候用的是ws://,因為是http鏈接,但是如果是

    2024年02月16日
    瀏覽(26)
  • Java 構建websocket客戶端,構建wss客戶端,使用wss連接,并發(fā)送數(shù)據(jù)到服務器端,接收服務器端消息

    Java 構建websocket客戶端,構建wss客戶端,使用wss連接,并發(fā)送數(shù)據(jù)到服務器端,接收服務器端消息 回調(diào)函數(shù)處理

    2024年02月13日
    瀏覽(33)
  • 服務器端使用django websocket,客戶端使用uniapp 請問服務端和客戶端群組互發(fā)消息的代碼怎么寫的參考筆記

    服務器端使用django websocket,客戶端使用uniapp 請問服務端和客戶端群組互發(fā)消息的代碼怎么寫的參考筆記

    2023/8/29 19:21:11 服務器端使用django websocket,客戶端使用uniapp 請問服務端和客戶端群組互發(fā)消息的代碼怎么寫 2023/8/29 19:22:25 在服務器端使用Django WebSocket和客戶端使用Uniapp的情況下,以下是代碼示例來實現(xiàn)服務器端和客戶端之間的群組互發(fā)消息。 服務器端代碼 (使用Django Chann

    2024年02月11日
    瀏覽(22)
  • AI對話交互場景使用WebSocket建立H5客戶端和服務端的信息實時雙向通信

    AI對話交互場景使用WebSocket建立H5客戶端和服務端的信息實時雙向通信

    WebSocket使得客戶端和服務器之間的數(shù)據(jù)交換變得更加簡單,允許 服務端主動向客戶端推送數(shù)據(jù) 。在WebSocket API中,瀏覽器和服務器只需要完成一次握手,兩者之間就可以創(chuàng)建持久性的連接,并進行雙向數(shù)據(jù)傳輸。 初次接觸 WebSocket 的人,都會問同樣的問題:我們已經(jīng)有了 HT

    2024年02月03日
    瀏覽(24)
  • Winform中使用Websocket4Net實現(xiàn)Websocket客戶端并定時存儲接收數(shù)據(jù)到SQLite中

    Winform中使用Websocket4Net實現(xiàn)Websocket客戶端并定時存儲接收數(shù)據(jù)到SQLite中

    SpringBoot+Vue整合WebSocket實現(xiàn)前后端消息推送: SpringBoot+Vue整合WebSocket實現(xiàn)前后端消息推送_websocket vue3.0 springboot 往客戶端推送-CSDN博客 上面實現(xiàn)ws推送數(shù)據(jù)流程后,需要在windows上使用ws客戶端定時記錄收到的數(shù)據(jù)到文件中,這里 文件使用SQLite數(shù)據(jù)庫進行存儲。 Winform中操作Sql

    2024年02月22日
    瀏覽(23)
  • Java WebSocket客戶端

    1.依賴 2.代碼 1.依賴 2.代碼 2.1 自定義 websocket handler 2.2 將websocket handler加入容器 2.3 定時器監(jiān)控

    2024年02月16日
    瀏覽(22)
  • 客戶端 WebSocket詳細用法

    WebSocket是一種網(wǎng)絡通信協(xié)議,很多高級功能都需要用到它。 有些人會想,既然我們已經(jīng)有了HTTP協(xié)議了,為什么還要花時間學另一種協(xié)議呢?這個協(xié)議到底有什么魔力,值得我們花時間學它。 因為 HTTP 協(xié)議有一個缺陷:通信只能由客戶端發(fā)起。只能是客戶端向服務器發(fā)出請求

    2024年02月04日
    瀏覽(18)
  • Java實現(xiàn)websocket客戶端

    常規(guī)情況下,大多數(shù)時候Java后臺作為websocket服務端,實現(xiàn)方式也比較簡單,網(wǎng)上很多案例代碼。但是很多時候項目中服務與服務之間也需要使用websocket通信,此時項目就需要實現(xiàn)客戶端功能。 步驟一:導入依賴: 步驟二:實現(xiàn)WebSocketClient抽象類: 該類中和websocket服務端接口

    2024年02月16日
    瀏覽(86)
  • SpringBoot WebSocket做客戶端

    常見的都是springboot應用做服務,前端頁面做客戶端,進行websocket通信進行數(shù)據(jù)傳輸交互。但其實springboot服務也能做客戶端去連接別的webSocket服務提供者。 剛好最近在項目中就使用到了,需求背景大概就是我們作為一個java段應用需要和一個C語言應用進行通信。在項目需求及

    2024年02月11日
    瀏覽(23)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領取紅包

二維碼2

領紅包