尝试使用NodeJS服务器和C# WebSocket客户端进行测试

当使用websocket-sharp进行搜索时,可以看到许多示例是在Unity中使用的。
虽然最终可能会在Unity中使用,但我还是要确认普通的C#客户端如何使用WebSocket。

websocket-sharp的构建

尽管客户端有点旧,但使用websocket-sharp连接似乎是个不错的选择。由于许可证是MIT,所以没有问题。
首先,需要从git上下载并构建,这似乎是必要的手段。

在Unity中,关于资产等的说明也可以在git中找到,但可以通过git下载。也可以通过从右上角的Code按钮下载zip文件并解压缩来克隆git。然后删除Example文件夹。

使用VSCode打开文件夹,选择模板并创建构建任务可能是件麻烦的事情,所以我选择使用以下方式来进行操作:将项目使用msbuild.exe工具进行构建,命令如下:
msbuild.exe /p:Configuration=Release websocket-sharp.sln
在执行这个命令的时候,会出现错误提示:MSBUILD: error MSB4132: 无法识别工具版本”3.5″,可用的工具版本只有”14.0″和”4.0″。
因此,我将文件复制到安装了.NET3.5的服务器上并进行执行,命令如下:
C:\Windows\Microsoft.NET\Framework\v3.5\MSBuild.exe /p:Configuration=Release websocket-sharp.sln
虽然删除了示例,会导致一些错误产生,但是在webxoket-sharp\bin\Release目录下会生成dll文件。

虽然有关CookieException的云云文章,但由于dll已经生成,所以暂时不予处理。

服务器

使用Node.js(16.x)进行设置。
上次我们使用socket.io简单地创建了与浏览器的协作,但这次我们将使用ws。
这样做是为了与Unity进行协作,一些地方会使用到。

一旦收到消息,只需将其在控制台上打印并返回回应。

const server = require("ws").Server;
const s = new server({ port: 5001 });

s.on("connection", ws => {
    ws.on("message", message => {
        console.log("Received: " + message);
        ws.send("server response");
    });
});

客户

由於未安裝VS,因此使用csc.exe編譯C#的源代碼。
出現”The type or namespace name ‘WebSocketSharp’ could not be found”錯誤。
使用csc.exe /r:websocket-sharp.dll socket.cs類似這樣的/r選項可以編譯具有外部dll的源代碼。

由于不需要异步操作,因此可以使用Thread.Sleep每1秒进行通信。

using WebSocketSharp;
using System;
using System.Threading;

class socket {

    static void Main(string[] args) {
        WebSocket _webSocket;

        const string WEBSOCKET_URL = "ws://localhost:5001/";

        _webSocket = new WebSocket(WEBSOCKET_URL);

        _webSocket.OnMessage += (sender, e) => Console.WriteLine(e.Data);
        _webSocket.OnClose += (sender, e) => Console.WriteLine("Close");

        _webSocket.Connect();

        while(true){
            Delay1000(_webSocket);
        }
    }

    static void Delay1000(WebSocket skt)
    {  
        try{
            skt.Send("Send message");
        }
        catch(Exception ex){
            Console.WriteLine(ex);
        }
        Thread.Sleep(1000);
    }
}

很容易就做完了。

通过浏览器进行连接

由于之前和以前不同,服务器现在是ws,因此我们也可以尝试使用普通的JavaScript进行发送和接收。

<html>
    <body>
        <div>
            <input
                id="send-message"
                type="text"
                placeholder="メッセージを入力"
            >
        </div>
        <div>
            <button id="send-button" onClick="sendMessage(document.getElementById('send-message').value)">
            メッセージ送信
            </button>
        </div>
        <div id="res-message">
            <!-- 表示エリア -->
        </div>
    <script>
    // 接続設定
    const URL = 'ws://localhost:5001/';
    const SUBPROTOCOL = 'ws-sample';

    // WebSocket 通信を開始する
    // const socket = new WebSocket(URL, SUBPROTOCOL);
    const socket = new WebSocket(URL);

    // ------------------------------
    // WebSocket イベント
    // ------------------------------

    // WebSocketOpen時
    socket.addEventListener('open', (event) => {
        console.log('open');
        socket.send('OpenMessage'); // メッセージの送信
    });

    // WebSocket受け取り時
    socket.addEventListener('message', ({ data }) => {
        resMessage(data);
    });

    // WebSocketエラー時
    // socket.onerror = () => {} でも可
    socket.addEventListener('error', (event) => {
        console.log('error');
    });

    // WebSocket がクローズしたら発火する
    // socket.onclose = () => {} でも可
    socket.addEventListener('close', (event) => {
        console.log('close');
    });

    // メッセージ送信 
    const sendMessage = (message) => {
        socket.send(message)
    }

    // 受信メッセージ表示
    const resMessage = (message) => {
        var new_element = document.createElement('div');
        new_element.textContent = message;
        document.getElementById('res-message').appendChild(new_element);
    } 
    </script>
    </body>
</html>

其他备注

有一个库可以像这个或者这样方便地进行重新连接。

bannerAds