通过套接字从 c# 向节点 socket.io 服务器发送数据
Posted
技术标签:
【中文标题】通过套接字从 c# 向节点 socket.io 服务器发送数据【英文标题】:Sending data via sockets from c# to a node socket.io server 【发布时间】:2017-01-06 13:30:17 【问题描述】:我目前正在尝试向我的 socket.io 服务器提供来自我的 C# 客户端的数据。但是我不确定如何在服务器上接收消息。
我的服务器代码:
const io = require('socket.io')(9000);
io.on('connection', (socket) =>
console.log('Connected');
首先我不知道我必须听哪个事件,但是我无法使用以下客户端(使用 Websocket-sharp)代码向我的服务器发送数据:
private void init()
// start socket connection
using (var ws = new WebSocket("ws://localhost:9000/socket.io/?EIO=2&transport=websocket"))
ws.OnMessage += (sender, e) =>
API.consoleOutput("Message: " + e.Data);
ws.OnError += (sender, e) =>
API.consoleOutput("Error: " + e.Message);
ws.Connect();
ws.Send("server");
连接正常,但我如何接收服务器的消息?发送不会引发错误,因此我认为它确实有效。
【问题讨论】:
我认为,您的连接不工作,因为socket.io
不完全使用websocket
协议。所以,c#
websocket
客户端无法与node.js
socket.io
服务器通信。或许,你可以试试github.com/Quobject/SocketIoClientDotNet c#
socket.io
客户端。
还没有找到那个。只有一个过时的。稍后会尝试。
我不确定SocketIoClientDotNet
的维护,但我可以肯定地说websocket-sharp
不能直接用于与socket.io
服务器通信。 github.com/sta/websocket-sharp/issues/81#issuecomment-104650660
SocketIoClientDotNet
不断重新连接并且不会触发本地 Socket.EVENT_CONNECT
事件。似乎也不起作用。
【参考方案1】:
我已经为连接到 node.js 服务器的 UWP 应用程序工作。基本上我所做的是连接到一个看起来像 ws://localhost:4200/socket.io/?EIO=3&transport=websocket
我们选择的端口号。
设置完成后,我通过以下代码行连接到 node.js 套接字 io 库。
private async Task ConnectWebsocket()
websocket = new MessageWebSocket();
Uri server = new Uri(WebSocketURI); //like ws://localhost:4300/socket.io/?EIO=3&transport=websocket
websocket.Control.MessageType = SocketMessageType.Utf8;
websocket.MessageReceived += Websocket_MessageReceived;
websocket.Closed += Websocket_Closed;
try
await websocket.ConnectAsync(server);
isConnected = true;
writer = new DataWriter(websocket.OutputStream);
catch ( Exception ex ) // For debugging
// Error happened during connect operation.
websocket.Dispose();
websocket = null;
Debug.Log("[SocketIOComponent] " + ex.Message);
if ( ex is COMException )
Debug.Log("Send Event to User To tell them we are unable to connect to Pi");
return;
`
此时您的“连接”上的套接字 io 应该在您的服务器上触发
然后你可以像往常一样向它发出事件。除了 C# 套接字代码并不区分各种通道,因此您必须自己这样做。下面是我们的做法(又名 SocketData 和 SocketIOEvent 是我们定义的类)
private void Websocket_MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args)
try
using ( DataReader reader = args.GetDataReader() )
reader.UnicodeEncoding = UnicodeEncoding.Utf8;
try
string read = reader.ReadString(reader.UnconsumedBufferLength);
//read = Regex.Unescape(read);
SocketData socc = SocketData.ParseFromString(read);
if (socc != null )
Debug.Log(socc.ToString());
SocketIOEvent e = new SocketIOEvent(socc.channel, new JSONObject( socc.jsonPayload));
lock ( eventQueueLock ) eventQueue.Enqueue(e);
catch ( Exception ex )
Debug.Log(ex.Message);
catch (Exception ex )
Debug.Log(ex.Message);
在我们的特定应用程序中,我们不需要向我们的服务器发送消息,因此我没有一个好的答案。
【讨论】:
以上是关于通过套接字从 c# 向节点 socket.io 服务器发送数据的主要内容,如果未能解决你的问题,请参考以下文章
c# SocketIoClientDotNet, node js socket.IO