我正在为在nodejs中实现的服务器设置C# websocket客户端(使用socket.io)。使用Websocket4nethttps://github.com/kerryjiang/WebSocket4Net。我的代码能够与套接字服务器连接,但WebClient.Send("message")不调用服务器事件。我被困在使用websocket4net库从服务器发送消息或调用事件。我之所以选择这个库,是因为我的实现是在framework 2.0或更低版本中实现的。
我曾尝试在连接后使用websocket.send(" message ")调用消息事件,但服务器无法识别它。无法调用服务器上的函数。我也研究了Execute Command,但无法在我的类中实现它。
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);
}
}
从我的main调用这个类
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#实现的新手,不知道如何调用服务器事件,之后我还会在客户端编写一些事件。期望从客户端调用所有服务器事件。
发布于 2019-07-16 15:38:19
它适用于桌面应用程序和xamarin.android应用程序
我使用过这个库,即使它是被弃用的https://github.com/Quobject/SocketIoClientDotNet
您可以直接从nuget Install-Package SocketIoClientDotNet
安装
using Quobject.EngineIoClientDotNet.Client.Transports;
using Quobject.SocketIoClientDotNet.Client;
var option = new IO.Options()
{
QueryString = "Type=Desktop",
Timeout = 5000,
ReconnectionDelay = 5000,
Reconnection = false,
ransports = Quobject.Collections.Immutable.ImmutableList.Create<string>(PollingXHR.NAME)
};
socket = IO.Socket("http://localhost:1453",option);
socket.On(Socket.EVENT_CONNECT, () =>
{
socket.Emit("iAmOnline", "1234");
});
socket.On("youAreOnline", () =>
{
Console.WriteLine("I am Online");
});
socket.On("hi", (data) =>
{
Console.WriteLine(data);
socket.Disconnect();
});
您可以根据需要添加任何传输。由于防火墙的原因,我添加了xhr-polling。您可以使用WebSocket.NAME和/或Polling.NAME
https://stackoverflow.com/questions/55742186
复制相似问题