使用C#连接到websocket(我可以使用JavaScript连接,但C#给出状态代码200错误)

我是websocket领域的新手。

我可以使用以下代码使用JavaScript连接到websocket服务器:

var webSocket = new WebSocket(url); 

但对于我的应用程序,我需要使用c#连接到同一台服务器。 我使用的代码是:

 ClientWebSocket webSocket = null; webSocket = new ClientWebSocket(); await webSocket.ConnectAsync(new Uri(url), CancellationToken.None); 

代码的第3行导致错误:

“当预期状态代码101时,服务器返回状态代码200”

经过一点点的调查,我意识到服务器无法在连接过程中将http协议切换到websocket协议。

我在C#代码中做了什么愚蠢的事情,或者服务器出了问题。 我没有任何访问服务器的权限,因为我使用的url是第三方url。

你能否就这个问题给我任何建议?

使用WebSocketSharp库并轻松连接:

WebSocket客户端

 using System; using WebSocketSharp; namespace Example { public class Program { public static void Main (string[] args) { using (var ws = new WebSocket ("ws://dragonsnest.far/Laputa")) { ws.OnMessage += (sender, e) => Console.WriteLine ("Laputa says: " + e.Data); ws.Connect (); ws.Send ("BALUS"); Console.ReadKey (true); } } } } 

步骤1

必需命名空间

 using WebSocketSharp; 

WebSocket类存在于WebSocketSharp命名空间中。

第2步

使用要连接的WebSocket URL创建WebSocket类的新实例。

 using (var ws = new WebSocket ("ws://example.com")) { ... } 

WebSocket类inheritanceSystem.IDisposable接口,因此您可以使用using语句。 当控件离开使用块时,WebSocket连接将以关闭状态1001(离开)关闭。

第3步

设置WebSocket事件。

WebSocket.OnOpen事件

建立WebSocket连接时发生WebSocket.OnOpen事件。

 ws.OnOpen += (sender, e) => { ... }; 

e已作为System.EventArgs.Empty传递,因此您不需要使用它。

WebSocket.OnMessage事件

WebSocket接收消息时发生WebSocket.OnMessage事件。

 ws.OnMessage += (sender, e) => { ... }; 

e已作为WebSocketSharp.MessageEventArgs传递。

e.Type property返回表示消息类型的WebSocketSharp.Opcode.Text或WebSocketSharp.Opcode.Binary。 因此,通过检查,您可以确定应该使用哪个项目。

如果它返回Opcode.Text,您应该使用返回字符串的e.Data属性(表示Text消息)。

或者,如果它返回Opcode.Binary ,则应使用返回byte [](表示二进制消息)的e.RawData属性。

 if (e.Type == Opcode.Text) { // Do something with e.Data. ... return; } if (e.Type == Opcode.Binary) { // Do something with e.RawData. ... return; } 

WebSocket.OnError事件

WebSocket收到错误时发生WebSocket.OnError事件。

 ws.OnError += (sender, e) => { ... }; 

e已作为WebSocketSharp.ErrorEventArgs传递。

e.Message属性返回表示错误消息的字符串。

如果错误是由exception引起的,则e.Exception属性返回导致错误的System.Exception实例。

WebSocket.OnClose事件

WebSocket连接关闭时发生WebSocket.OnClose事件。

 ws.OnClose += (sender, e) => { ... }; 

e已作为WebSocketSharp.CloseEventArgs传递。

e.Code属性返回一个ushort,表示状态代码,表示关闭的原因,e.Reason属性返回一个字符串,表示关闭的原因。

第4步

连接到WebSocket服务器。

 ws.Connect (); 

如果要以异步方式连接到服务器,则应使用WebSocket.ConnectAsync()方法。

第5步

将数据发送到WebSocket服务器。

 ws.Send (data); 

WebSocket.Send方法已重载。

您可以使用WebSocket.Send (string), WebSocket.Send (byte[])WebSocket.Send (System.IO.FileInfo)方法发送数据。

如果要异步发送数据,则应使用WebSocket.SendAsync方法。

 ws.SendAsync (data, completed); 

如果您希望在发送完成后执行某些Action ,则应将完成设置为任何Action委托。

第6步

关闭WebSocket连接。

 ws.Close (code, reason); 

如果要显式关闭连接,则应使用WebSocket.Close方法。

WebSocket.Close方法已重载。

您可以使用WebSocket.Close(),WebSocket.Close(ushort),WebSocket.Close(WebSocketSharp.CloseStatusCode),WebSocket.Close(ushort,string)或WebSocket.Close(WebSocketSharp.CloseStatusCode,string)方法来关闭连接。

如果要异步关闭连接,则应使用WebSocket.CloseAsync方法。

如果您使用WebSocket客户端连接并获得HTTP 200作为响应,则意味着您可能连接到错误的位置(主机,路径和/或端口)。

基本上,您正在连接到一个不理解您的WebSocket要求的普通HTTP端点,它只是返回“OK”响应(HTTP 200)。 WebSocket服务器可能在同一服务器中的另一个端口或路径中运行。

检查您的url。

Websocket URL应该以ws://wss://开头,后者是安全的websocket。