我正在为 nodejs 中实现的服务器设置 C# websocket 客户端(使用 socket.io)。使用[Websocket4net]:https ://github.com/kerryjiang/WebSocket4Net 。我的代码能够与套接字服务器连接,但 WebClient.Send("message") 不会调用服务器事件。我被困在使用 websocket4net lib 从服务器发送消息或调用事件。我选择这个库是因为我的实现是在框架 2.0 或更低版本中。
我尝试使用 websocket.send("message") 在连接后调用消息事件,但在服务器上无法识别。在服务器调用函数失败。还研究了执行命令,但无法在我的课堂上实现这一点。
public class JniorWebSocket : IDisposable
{
//public delegate void LogEventHandler(object sender, LogEventArgs args);
//public event LogEventHandler Log;
public event EventHandler Connected;
public event EventHandler Disconnected;
private WebSocket _websocket;
private string _uri;
private string sid;
public JniorWebSocket(string host) : this(host, 0) { }
public JniorWebSocket(string host, int port)
{
_uri = "ws://" + host;
if (0 != port) _uri += ":" + port + "/join/?EIO=3&transport=websocket";
_websocket = new WebSocket(_uri);
_websocket.Opened += new EventHandler(websocket_Opened);
_websocket.Error += Websocket_Error;
_websocket.Closed += websocket_Closed;
_websocket.MessageReceived += Websocket_MessageReceived;
_websocket.Open();
}
public void Dispose()
{
_websocket.Dispose();
GC.SuppressFinalize(this);
}
public bool AllowUnstrustedCertificate
{
get
{
return _websocket.AllowUnstrustedCertificate;
}
set
{
_websocket.AllowUnstrustedCertificate = value;
}
}
public void Connect()
{
_websocket.Open();
while (_websocket.State == WebSocketState.Connecting) { };
if (_websocket.State != WebSocketState.Open)
{
throw new Exception("Connection is not opened.");
}
}
public void Close()
{
_websocket.Close();
}
public void Send(string message)
{
try
{
_websocket.Send(message);
}
catch (Exception ex)
{
}
}
private void Websocket_Error(object sender, ErrorEventArgs e)
{
}
private void Websocket_MessageReceived(object sender, MessageReceivedEventArgs e)
{
if (e.Message.IndexOf("{") != -1)
{
var json = JObject.Parse(e.Message.Substring(e.Message.IndexOf("{")));
sid = json["sid"].ToString();
Console.WriteLine(sid);
if ("Error".Equals(sid)) HandleErrorMessage(json);
}
}
private void HandleErrorMessage(JObject json)
{
}
private void websocket_Opened(object sender, EventArgs e)
{
Connected?.Invoke(this, EventArgs.Empty);
Send(string.Empty);
}
private void websocket_Closed(object sender, EventArgs e)
{
Disconnected?.Invoke(this, EventArgs.Empty);
}
}
从我的主要调用这个类
JniorWebSocket jniorWebSocket = new JniorWebSocket(uri, port);
jniorWebSocket.AllowUnstrustedCertificate = true;
jniorWebSocket.Connect();
jniorWebSocket.Send("message");
nodejs端的socket.io
const server = require('http').Server(app);
global.socketIO = SocketIO(server, { path: '/join' });
global.socketIO.on('connection', (socket) =>
{
socket.on('message',async (data) => {
console.info(data);
});
socket.on('authenticate', async (data) => {
try {
}
} catch(error) {
console.warn('Error while authenticating socket', error);
}
});
});
我是这个 websocket C# 实现的新手,不知道如何调用服务器事件,之后我也会在客户端编写一些事件。期望从客户端调用所有服务器事件。