尝试使用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>
其他备注
有一个库可以像这个或者这样方便地进行重新连接。