创建WebSocket客户端
定义
命名空间:TouchSocket.Http.WebSockets
程序集:TouchSocket.Http.dll
一、可配置项
二、支持插件接口
插件方法 | 功能 |
---|---|
IWebSocketHandshakingPlugin | 当收到握手请求之前,可以进行连接验证等 |
IWebSocketHandshakedPlugin | 当成功握手响应之后 |
IWebSocketReceivedPlugin | 当收到Websocket的数据报文 |
IWebSocketClosingPlugin | 当收到关闭请求时,如果对方直接断开连接,此方法则不会触发。 |
IWebSocketClosedPlugin | 当WebSocket连接断开时触发,无论是否正常断开。但如果是断网等操作,可能不会立即执行,需要结合心跳操作和UseCheckClear 插件来进行清理。 |
三、创建客户端
3.1 创建常规客户端
var client = new WebSocketClient();
await client.SetupAsync(new TouchSocketConfig()
.SetRemoteIPHost("ws://127.0.0.1:7789/ws")
.ConfigureContainer(a =>
{
a.AddConsoleLogger();
}));
await client.ConnectAsync();
client.Logger.Info("连接成功");
3.2 创建WSs客户端
当需要连接到由证书机构颁发的网址(例如:小程序、物联网等)时,仅需要设置带有wss
的url即可。
wss://127.0.0.1:7789/ws
当连接自定义证书的Ssl:wss://127.0.0.1:7789/ws
var client = new WebSocketClient();
await client.SetupAsync(new TouchSocketConfig()
.SetRemoteIPHost(new IPHost("wss://127.0.0.1:7789/ws"))
.SetClientSslOption(
new ClientSslOption()
{
ClientCertificates = new X509CertificateCollection() { new X509Certificate2("RRQMSocket.pfx", "RRQMSocket") },
SslProtocols = SslProtocols.Tls12,
TargetHost = "127.0.0.1",
CertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => { return true; }
}));
await client.ConnectAsync();
Console.WriteLine("连接成功");
注意
当使用域名连接时,TargetHost
为域名,例如连接到IPHost("wss://baidu.com")
时,TargetHost
应当填写:baidu.com
四、连接服务器
WebSocketClient
可以使用默认配置直接连接到服务器,同时也支持使用多种方法定义连接。
4.1 直接连接
使用url
直接建立连接,这一般是服务器也只是普通的ws
服务器的情况下。
var client = new WebSocketClient();
await client.SetupAsync(new TouchSocketConfig()
.ConfigureContainer(a =>
{
a.AddConsoleLogger();
})
.SetRemoteIPHost("ws://127.0.0.1:7789/ws"));
await client.ConnectAsync();
client.Logger.Info("通过ws://127.0.0.1:7789/ws连接成功");
4.2 带Query参数连接
带Query
参数连接,实际上还是通过url
直接连接。
var client = new WebSocketClient();
await client.SetupAsync(new TouchSocketConfig()
.ConfigureContainer(a =>
{
a.AddConsoleLogger();
})
.SetRemoteIPHost("ws://127.0.0.1:7789/wsquery?token=123456"));
await client.ConnectAsync();
client.Logger.Info("通过ws://127.0.0.1:7789/wsquery?token=123456连接成功");
4.3 使用特定Header连接
一般的,当某些服务器安全级别较高时,可能会定制特定的header
用于验证连接。
var client = new WebSocketClient();
await client.SetupAsync(new TouchSocketConfig()
.ConfigureContainer(a =>
{
a.AddConsoleLogger();
})
.ConfigurePlugins(a =>
{
a.Add(typeof(IWebSocketHandshakingPlugin), async (IWebSocket client, HttpContextEventArgs e) =>
{
e.Context.Request.Headers.Add("token", "123456");
await e.InvokeNext();
});
})
.SetRemoteIPHost("ws://127.0.0.1:7789/wsheader"));
await client.ConnectAsync();
client.Logger.Info("通过ws://127.0.0.1:7789/wsheader连接成功");
提示
实际上OnWebSocketHandshaking
就是插件委托,也可以自己封装到插件使用。
4.4 使用Post方式连接
WebSocket
默认情况下是基于Get
方式连接的,但是在一些更特殊的情况下,需要以Post
,甚至其他方式连接,那么可以使用以下方式实现。
using var client = new WebSocketClient();
await client.SetupAsync(new TouchSocketConfig()
.ConfigureContainer(a =>
{
a.AddConsoleLogger();
})
.ConfigurePlugins(a =>
{
a.Add(typeof(IWebSocketHandshakingPlugin), async (IWebSocket client, HttpContextEventArgs e) =>
{
e.Context.Request.Method = HttpMethod.Post;//将请求方法改为Post
await e.InvokeNext();
});
})
.SetRemoteIPHost("ws://127.0.0.1:7789/postws"));
await client.ConnectAsync();
client.Logger.Info("通过ws://127.0.0.1:7789/postws连接成功");
提示
使用此方式时,基本上就能完全定制请求连接了。比如一些Cookie
等。
五、发送数据
客户端定义了一些发送方法,方便开发者快速发送数据。
5.1 发送文本类消息
await client.SendAsync("Text");
5.2 发送二进制消息
await client.SendAsync(new byte[10]);
5.3 直接发送自定义构建的数据帧
using (var frame = new WSDataFrame())
{
frame.Opcode = WSDataType.Text;
frame.FIN = true;
frame.RSV1 = true;
frame.RSV2 = true;
frame.RSV3 = true;
frame.AppendText("I");
frame.AppendText("Love");
frame.AppendText("U");
await client.SendAsync(frame);
}
备注
此部分功能就需要你对WebSocket
有充分了解才可以操作。