C# 实现WebSocket服务端代码用于Unity WebGL通信

一般我们在做展厅项目的时候,交互方式和常见的数字孪生项目是不一样的,常见的数字孪生是通过鼠标点击来进行操作,但是在展厅中屏幕和主机物理距离是很远的,然后无线鼠标操作受到场地影响又影响用户的体验。那么我们是不是可以用一个平板或者手机来交互呢。

使用移动端控制我们的展厅必然会涉及到服务端和客户端通信的问题。我们的实现思路如下。

首先服务端要开启一个websocket监听,完成一个收消息和发消息的基本函数。

如果移动端要控制多个大屏还要实现消息的广播,将移动端收到的消息广播给所有的客户端,客户端再根据收到的消息再处理相应的逻辑。

服务端代码:

using System;
using System.Collections.Concurrent;
using System.Net;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    private static ConcurrentDictionary<string, WebSocket> _clients = new ConcurrentDictionary<string, WebSocket>();

    static async Task Main(string[] args)
    {
        HttpListener listener = new HttpListener();
        listener.Prefixes.Add("http://localhost:7799/");
        listener.Start();
        Console.WriteLine("Listening for WebSocket connections...");

        while (true)
        {
            HttpListenerContext context = await listener.GetContextAsync();
            if (context.Request.IsWebSocketRequest)
            {
                ProcessWebSocketRequest(context);
            }
            else
            {
                context.Response.StatusCode = 400;
                context.Response.Close();
            }
        }
    }

    static async void ProcessWebSocketRequest(HttpListenerContext context)
    {
        WebSocketContext webSocketContext = null;
        try
        {
            webSocketContext = await context.AcceptWebSocketAsync(subProtocol: null);

            string clientId = Guid.NewGuid().ToString();
            WebSocket webSocket = webSocketContext.WebSocket;
            _clients.TryAdd(clientId, webSocket);

            Console.WriteLine("WebSocket client connected. ClientId: " + clientId);

            byte[] buffer = new byte[1024];
            WebSocketReceiveResult result = null;
            CancellationTokenSource cts = new CancellationTokenSource();

            while (webSocket.State == WebSocketState.Open)
            {
                try
                {
                    result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), cts.Token);

                    if (result.MessageType == WebSocketMessageType.Text)
                    {
                        string message = Encoding.UTF8.GetString(buffer, 0, result.Count);
                        Console.WriteLine("Received message from ClientId " + clientId + ": " + message);

                        // 广播消息给所有客户端
                        Task broadcastTask = BroadcastMessage(message, clientId);
                        await broadcastTask; // 等待广播完成

                        // 示例:给指定客户端发送消息
                        await SendMessageToClient(message, clientId);
                    }
                    else if (result.MessageType == WebSocketMessageType.Close)
                    {
                        Console.WriteLine("WebSocket client disconnected. ClientId: " + clientId);
                        break;
                    }
                }
                catch (WebSocketException ex)
                {
                    Console.WriteLine("An error occurred while receiving or broadcasting message: " + ex.Message);
                    break;
                }
            }

            _clients.TryRemove(clientId, out _);
            webSocket.Dispose();
        }
        catch (Exception ex)
        {
            Console.WriteLine("An error occurred: " + ex.Message);
        }
        finally
        {
            if (webSocketContext != null)
            {
                webSocketContext.WebSocket.Dispose();
            }
        }
    }

    static async Task BroadcastMessage(string message, string senderClientId)
    {
        byte[] buffer = Encoding.UTF8.GetBytes(message);

        foreach (var client in _clients)
        {
            WebSocket webSocket = client.Value;

            if (webSocket.State == WebSocketState.Open && client.Key != senderClientId)
            {
                await webSocket.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Text, true, CancellationToken.None);
            }
        }
    }

    static async Task SendMessageToClient(string message, string clientId)
    {
        if (_clients.TryGetValue(clientId, out WebSocket webSocket))
        {
            byte[] buffer = Encoding.UTF8.GetBytes(message);
            await webSocket.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Text, true, CancellationToken.None);
        }
    }
}

服务端已经搭好了。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Unity 是一款强大的游戏开发引擎,但本身并不直接支持 WebSocket 服务端。但是,我们可以借助 Unity 的网络功能和一些第三方库来实现 WebSocket 服务端。 要实现 WebSocket 服务端,我们可以使用 .NET 库中的 HttpListener 类。首先,我们需要创建一个新的 C# 脚本,并在其中引入 System.Net 命名空间。然后,我们可以创建一个 HttpListener 对象,设置监听的地址和端口。例如: HttpListener httpListener = new HttpListener(); httpListener.Prefixes.Add("http://localhost:8080/"); 接下来,我们需要开始监听这个地址和端口: httpListener.Start(); 然后,我们可以使用异步方式等待客户端的连接: IAsyncResult result = httpListener.BeginGetContext(new AsyncCallback(ListenerCallback), httpListener); 在 ListenerCallback 回调函数中,我们可以获取客户端的连接和请求信息: void ListenerCallback(IAsyncResult result) { HttpListener listener = (HttpListener)result.AsyncState; HttpListenerContext context = listener.EndGetContext(result); // 处理客户端的请求 } 在处理客户端请求的过程中,我们可以根据不同的请求类型,实现相应的 WebSocket 逻辑。使用 .NET 中的 WebSocket 类,我们可以从 HttpListenerContext 中获取 WebSocket 对象,并执行诸如发送消息、接收消息等操作。 需要注意的是,为了实现完整的 WebSocket 逻辑,我们可能还需要处理握手过程中的协议判断、消息编码解码等细节。 综上所述,要在 Unity实现 WebSocket 服务端,我们可以利用 .NET 中的 HttpListener 类来监听客户端连接,并在处理请求过程中实现 WebSocket 的相关逻辑。这样就可以通过 Unity 实现 WebSocket 服务端了。 ### 回答2: Unity 是一款游戏开发引擎,通常用于开发各种类型的游戏。虽然 Unity 自身不支持直接实现 WebSocket 服务端,但我们可以通过使用插件或自定义脚本来实现。 首先,我们可以选择使用第三方插件或库,如 Best HTTP、WebSocket-Sharp 等来在 Unity实现 WebSocket 服务端。这些插件可以通过提供的 API 来创建、监听和处理 WebSocket 连接。我们可以根据项目需求选择最适合的插件,然后按照其文档进行配置和使用。 另外,如果我们希望自己编写 WebSocket 服务端,可以通过使用 Unity 提供的网络相关 API 来实现。首先,我们可以通过 Unity 的 NetworkTransport 类来创建一个基于 UDP 或 TCP 的网络连接。然后,我们可以使用 NetworkTransport.ReceiveFromHost() 方法来接收来自客户端的消息,并使用 NetworkTransport.SendToHost() 方法向客户端发送消息。使用这些 API,我们可以在 Unity实现一个简单的 WebSocket 服务端。 不过需要注意的是,WebSocket 是一种基于 TCP 的双向通信协议,与 HTTP 协议不同。在实现 WebSocket 服务端时,我们需要遵循 WebSocket 的协议规范,并正确处理握手、数据帧等操作。此外,我们还需要考虑并发连接、消息分发等问题,以确保 WebSocket 服务端的稳定性和可靠性。 总结来说,Unity 虽然不直接支持实现 WebSocket 服务端,但我们可以通过使用第三方插件或自定义脚本来实现。无论选择哪种方式,我们都需要理解 WebSocket 的协议规范,并根据需求正确配置和使用相关的插件或 API。 ### 回答3: 使用Unity实现WebSocket服务器可以通过Unity自带的Networking组件以及C#中的WebSocketSharp库来实现。下面是一个简单的步骤: 1. 在Unity中创建一个空的场景。然后创建一个空的游戏对象,并添加一个脚本来处理WebSocket服务器的逻辑。 2. 在脚本中导入WebSocketSharp库。你可以通过下载WebSocketSharp库的源代码,然后将其导入到Unity项目中,或者使用其他方法(如NuGet)从包管理器中引入。 3. 在脚本中添加WebSocket服务器的逻辑。你需要创建一个WebSocket服务器对象,并指定监听的端口号。例如: ``` using WebSocketSharp; using UnityEngine; public class WebSocketServer : MonoBehaviour { private WebSocketServer wsServer; private void Start() { wsServer = new WebSocketServer(12345); // 指定端口号 wsServer.Start(); wsServer.OnMessage += (sender, e) => { Debug.Log("Received message: " + e.Data); // 处理接收到的消息 }; wsServer.OnClose += (sender, e) => { Debug.Log("Connection closed"); // 处理连接关闭的逻辑 }; } private void OnDestroy() { if (wsServer != null) { wsServer.Stop(); wsServer = null; } } } ``` 4. 将脚本挂载到空的游戏对象上。然后按下Play按钮以在Unity中启动WebSocket服务器。 5. 在客户端上使用WebSocket连接到服务器。你可以使用浏览器的WebSocket API或其他WebSocket库来实现。提供服务器的IP地址和端口号,然后进行连接。 这样,你就可以通过Unity实现基本的WebSocket服务器。你可以根据具体的需求在OnMessage和OnClose事件中添加更多逻辑来处理消息和连接的关闭。同时需要注意,Unity的Networking组件也提供了一些网络功能,你也可以尝试使用这些组件来实现WebSocket服务器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值