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