You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 18:17:32