使用C# SocketIOClient无法发送简单字符串,Node.js/JS客户端正常
问题:.NET Core 5 + SocketIOClient 3.0.8 无法发送字符串消息
在Linux环境下使用.NET Core 5搭配SocketIOClient 3.0.8版本时,调用EmitAsync发送简单字符串失败:
- 客户端连接成功后,
EmitAsync执行后后续日志未打印 - 服务端仅收到连接事件,未接收到消息
- Node.js或HTML/JS客户端可正常发送消息
服务端代码(Linux + Node.js v16)
const express = require('express'); const app = express() const server = require('http').Server(app) const io = require('socket.io')(server, { maxHttpBufferSize: 1e7 }) io.on('connection', function (socket) { console.log("headers at connection:") console.log(socket.handshake.headers) socket.on('hi', async function (msg) { console.log(">>>>>>>>>>>>>>>"+msg.data); }); }); server.listen(3000) console.log("Running on port: " + 3000)
客户端代码(.NET Core 5)
using System; using System.Threading.Tasks; using SocketIOClient; class Program { static async Task Main(string[] args) { Console.WriteLine("starting Program.cs"); var client = new SocketIO("http://localhost:3000"); client.OnConnected += async (sender, e) => { Console.WriteLine("Connected"); await client.EmitAsync("hi", "im a simple string"); Console.WriteLine("After send"); }; await client.ConnectAsync(); } }
日志情况
- 客户端:
Console.WriteLine("After send");未打印 - 服务端:仅输出连接时的headers日志,未接收到'hi'消息内容
解决方案
1. 阻止客户端程序提前退出
客户端Main方法在执行完await client.ConnectAsync()后会直接退出,导致OnConnected事件中的异步操作(EmitAsync)未完成。需要在连接后阻止程序退出:
修改客户端Main方法:
static async Task Main(string[] args) { Console.WriteLine("starting Program.cs"); var client = new SocketIO("http://localhost:3000"); client.OnConnected += async (sender, e) => { Console.WriteLine("Connected"); await client.EmitAsync("hi", "im a simple string"); Console.WriteLine("After send"); }; await client.ConnectAsync(); // 阻止程序退出,可按需选择其中一种方式 await Task.Delay(-1); // 或者使用Console.ReadLine(),按回车结束程序 // Console.ReadLine(); }
2. 修正服务端消息接收逻辑
.NET客户端发送的简单字符串,服务端无需通过msg.data获取,直接使用参数本身即可:
修改服务端的消息监听代码:
socket.on('hi', async function (msg) { console.log(">>>>>>>>>>>>>>>"+msg); });
内容的提问来源于stack exchange,提问作者JRichardsz
相关产品推荐
相关产品推荐

