C#原生WebSocket客户端ClientWebSocket使用
WebSocket DLL有很多,最近在搞WebSocket服务器,服务端用的是SuperSocket.WebSocket,客户端封装在Dll里面供第三方调用,如果dll里面引用第三方框架WebSocket的话,引用dll时还需要引用一堆额外的包,这就显得有点臃肿,因为dll里面的WebSocket只有客户端,所以考虑用原生的ClientWebSocket即可;
连接并发送消息:
public class SocketClient { public static ClientWebSocket clientWebSocket; public static Uri serverUri; public SocketClient(string ip, int port) { var webSocketUrl = $@"ws://{ip}:{port}"; clientWebSocket = new ClientWebSocket(); serverUri = new Uri(webSocketUrl); clientWebSocket.ConnectAsync(serverUri, CancellationToken.None).Wait(); } public async Task SendMessageAsync(string Msg) { if (clientWebSocket.State != WebSocketState.Open) { await clientWebSocket.ConnectAsync(serverUri, CancellationToken.None); } if (clientWebSocket.State == WebSocketState.Open) { ArraySegment<byte> bytesToSend = new ArraySegment<byte>(Encoding.UTF8.GetBytes(Msg)); await clientWebSocket.SendAsync(bytesToSend, WebSocketMessageType.Text, true, CancellationToken.None); } } }
接收消息
ArraySegment<byte> bytesReceived = new ArraySegment<byte>(new byte[1024]); WebSocketReceiveResult result = await ws.ReceiveAsync(bytesReceived, CancellationToken.None); Console.WriteLine(Encoding.UTF8.GetString(bytesReceived.Array, 0, result.Count));
ClientWebSocket里面的方法都是异步的,如果同步方法调用异步:
1.不需要获取返回值的:
clientWebSocket.ConnectAsync(serverUri, CancellationToken.None).Wait();
2.需要获取返回值的
var result = clientWebSocket.ConnectAsync(serverUri, CancellationToken.None).GetAwaiter().GetResult();
因为是引用dll发送给服务器的,当主线程关闭前一刻发送信息给服务器可能接收不到最后面那条数据,原因是链接已经关闭了,发送信息失败,为确保信息能接收可以定义结束命令,在发送结束命令后程序休眠两秒,或者全局定义,每次发送信息都休眠一会。
更新:代理问题
WebSocket客户端一般都是Web的JS,在控制台搞客户端最简单的方法是引用第三方的包,像WebSocket4Net,websocket-sharp等,用第三方的包越过代理可以直接在设置里面这样操作:
而如果用原生的ClientWebSocket的话上面的越过代理方式就不行了,即使设置了也会报403的错误:
System.AggregateException:“One or more errors occurred. (The server returned status code '403' when status code '101' was expected.)”
琢磨了老半天后面无意试一下:
clientWebSocket.Options.Proxy = null;
居然就连接成功了。
示例:
static void Main(string[] args) { ClientWebSocket clientWebSocket = new ClientWebSocket(); var webSocketUrl = $@"ws://10.88.22.62:6008"; var serverUri = new Uri(webSocketUrl); clientWebSocket.Options.Proxy = null; clientWebSocket.ConnectAsync(serverUri, CancellationToken.None).Wait(); Console.ReadKey(); }
更新:ClientWebSocket不支持win7系统,由于要用到我去挖了第三方库的底层并将他们实现:C#WebSocket Client底层实现 - 点终将连成线 - 博客园 (cnblogs.com)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人