SUPERSOCKET 客户端
SUPERSOCKET.CLIENTENGINE 简单使用
江大没有给ClientEngine的Demo,一直没有找到其它的。。 自己从 websocket4net 项目中看了一些,然后写了一个简单的命令行的Client。
首先
引用 SuperSocket.ClientEngine.Core.dll和 SuperSocket.ClientEngine.Common.dll
然后
就可以使用ClientEngine了。
ClientEngine
我找了好久,只找到 AsyncTcpSession这么一个可以实例化的连接会话,那么,就用这个吧。
|
1
2
3
|
string ip = "127.0.0.1";int port = 12345;AsyncTcpSession client = new AsyncTcpSession(new IPEndPoint(IPAddress.Parse(ip), port)); |
处理连接的事件
|
1
2
3
4
5
6
7
8
|
// 连接断开事件client.Closed += client_Closed;// 收到服务器数据事件client.DataReceived += client_DataReceived;// 连接到服务器事件client.Connected += client_Connected;// 发生错误的处理client.Error += client_Error; |
处理函数
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
void client_Error(object sender, ErrorEventArgs e){ Console.WriteLine(e.Exception.Message);}void client_Connected(object sender, EventArgs e){ Console.WriteLine("连接成功");}void client_DataReceived(object sender, DataEventArgs e){ string msg = Encoding.Default.GetString(e.Data); Console.WriteLine(msg);}void client_Closed(object sender, EventArgs e){ Console.WriteLine("连接断开");}public void Connect(){ client.Connect(); string loginCmd = "LOGIN test"; byte[] data = Encoding.Default.GetBytes(loginCmd); client.Send(data, 0, data.Length);} |
连接到服务器
|
1
|
client.Connect(); |
向服务器发送数据
|
1
2
3
|
string loginCmd = "LOGIN test\r\n";byte[] data = Encoding.Default.GetBytes(loginCmd);client.Send(data, 0, data.Length); |
需要注意的是,因为服务器是使用的命令行协议,所以在数据末需要加上 \r\n。如果是使用其它协议,只是这里数据的结构发生变化。
如果服务器返回了数据,那么就可以在client_DataReceived函数中处理了。
具体的不怎么清楚,我也没有测试,从名称AsyncTcpSession来看,这个连接是异步的,也就是说,如果直接在 client.Connect()后执行 client.Send(xxxx) 很可能会异常,因为此时连接不一定建立了。所以,发送数据要在事件session_ConnectStarted调用后。
最后,就有了这样的代码:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
using SuperSocket.ClientEngine;using System;using System.Collections.Generic;using System.Net;using System.Text;namespace hyjiacan.com{ public class SSClient { private AsyncTcpSession client; /// <summary> /// /// </summary> /// <param name="ip">服务器IP</param> /// <param name="port">服务器端口</param> public SSClient(string ip, int port) { client = new AsyncTcpSession(new IPEndPoint(IPAddress.Parse(ip), port)); // 连接断开事件 client.Closed += client_Closed; // 收到服务器数据事件 client.DataReceived += client_DataReceived; // 连接到服务器事件 client.Connected += client_Connected; // 发生错误的处理 client.Error += client_Error; } void client_Error(object sender, ErrorEventArgs e) { Console.WriteLine(e.Exception.Message); } void client_Connected(object sender, EventArgs e) { Console.WriteLine("连接成功"); } void client_DataReceived(object sender, DataEventArgs e) { string msg = Encoding.Default.GetString(e.Data); Console.WriteLine(msg); } void client_Closed(object sender, EventArgs e) { Console.WriteLine("连接断开"); } /// <summary> /// 连接到服务器 /// </summary> public void Connect() { client.Connect(); } /// <summary> /// 向服务器发命令行协议的数据 /// </summary> /// <param name="key">命令名称</param> /// <param name="data">数据</param> public void SendCommand(string key, string data) { if (client.IsConnected) { byte[] arr = Encoding.Default.GetBytes(string.Format("{0} {1}", key, data)); client.Send(arr, 0, arr.Length); } else { throw new InvalidOperationException("未建立连接"); } } }} |
using SuperSocket.ClientEngine;using System;using System.Collections.Generic;using System.Net;using System.Text;namespace hyjiacan.com{ public class SSClient { private AsyncTcpSession client; /// <summary> /// /// </summary> /// <param name="ip">服务器IP</param> /// <param name="port">服务器端口</param> public SSClient(string ip, int port) { client = new AsyncTcpSession(new IPEndPoint(IPAddress.Parse(ip), port)); // 连接断开事件 client.Closed += client_Closed; // 收到服务器数据事件 client.DataReceived += client_DataReceived; // 连接到服务器事件 client.Connected += client_Connected; // 发生错误的处理 client.Error += client_Error; } void client_Error(object sender, ErrorEventArgs e) { Console.WriteLine(e.Exception.Message); } void client_Connected(object sender, EventArgs e) { Console.WriteLine("连接成功"); } void client_DataReceived(object sender, DataEventArgs e) { string msg = Encoding.Default.GetString(e.Data); Console.WriteLine(msg); } void client_Closed(object sender, EventArgs e) { Console.WriteLine("连接断开"); } /// <summary> /// 连接到服务器 /// </summary> public void Connect() { client.Connect(); } /// <summary> /// 向服务器发命令行协议的数据 /// </summary> /// <param name="key">命令名称</param> /// <param name="data">数据</param> public void SendCommand(string key, string data) { if (client.IsConnected) { byte[] arr = Encoding.Default.GetBytes(string.Format("{0} {1}", key, data)); client.Send(arr, 0, arr.Length); } else { throw new InvalidOperationException("未建立连接"); } } }}SUPERSOCKET 客户端的更多相关文章
- C#网络编程技术SuperSocket实战项目演练
一.SuperSocket课程介绍 1.1.本期<C#网络编程技术SuperSocket实战项目演练>课程阿笨给大家带来三个基于SuperSocket通讯组件的实战项目演示实例: ● 基于 ...
- 超详细的TCP、Sokcket和SuperSocket与TCP入门指导
前言 本文主要介绍TCP.Sokcket和SuperSocket的基础使用. 创建实例模式的SuperSocket服务 首先创建控制台项目,然后Nuget添加引用SuperSocket.Engine. ...
- 基于SuperSocket的IIS主动推送消息给android客户端
在上一篇文章<基于mina框架的GPS设备与服务器之间的交互>中,提到之前一直使用superwebsocket框架做为IIS和APP通信的媒介,经常出现无法通信的问题,必须一天几次的手动回 ...
- SuperSocket与Netty之实现protobuf协议,包括服务端和客户端
今天准备给大家介绍一个c#服务器框架(SuperSocket)和一个c#客户端框架(SuperSocket.ClientEngine).这两个框架的作者是园区里面的江大渔. 首先感谢他的无私开源贡献. ...
- SuperSocket入门(一)-Telnet服务器和客户端请求处理
本文的控制台项目是根据SuperSocket官方Telnet示例代码进行调试的,官方示例代码:Telnet示例. 开始我的第一个Telnet控制台项目之旅: 创建控制台项目:打开vs程序,文件=> ...
- 基于开源SuperSocket实现客户端和服务端通信项目实战
一.课程介绍 本期带给大家分享的是基于SuperSocket的项目实战,阿笨在实际工作中遇到的真实业务场景,请跟随阿笨的视角去如何实现打通B/S与C/S网络通讯,如果您对本期的<基于开源Supe ...
- SuperSocket 服务器管理器客户端
SuperSocket 服务器管理器当前有两种类型的客户端, Silverlight客户端和WPF客户端.这两种客户端的代码都在源代码中的"Management"目录,你可以自行编 ...
- SuperSocket主动从服务器端推送数据到客户端
关键字: 主动推送, 推送数据, 客户端推送, 获取Session, 发送数据, 回话快照 通过Session对象发送数据到客户端 前面已经说过,AppSession 代表了一个逻辑的 socke ...
- SuperSocket 学习笔记-客户端
客户端: 定义 private AsyncTcpSession client; 初始化 client = new AsyncTcpSession(); client.Connected += Clie ...
随机推荐
- 给rm命令设置别名防止误操作
1通过alias命令查看别名格式并按照格式修改 alias rm='rm -i' 修改为 alias rm='echo command not found' 2通过编辑vim /etc/profile ...
- HihoCoder - 1483 区间最值
给定n个数A1...An,小Ho想了解AL..AR中有多少对元素值相同.小Ho把这个数目定义为区间[L,R]的价值,用v[L,R]表示. 例如1 1 1 2 2这五个数所组成的区间的价值为4. 现在小 ...
- [转]linux shell 多线程实现
情景 shell脚本的执行效率虽高,但当任务量巨大时仍然需要较长的时间,尤其是需要执行一大批的命令时.因为默认情况下,shell脚本中的命令是串行执行的.如果这些命令相互之间是独立的,则可以使用“并发 ...
- netty源码理解补充 之 DefaultChannelPipeline到底是个啥
- 福大软工 · BETA 版冲刺前准备之拖鞋旅游队
拖鞋旅游队BETA 版冲刺前准备 前言 队名:拖鞋旅游队 组长博客:https://www.cnblogs.com/Sulumer/p/10083834.html 本次作业:https://edu.c ...
- $_SERVER['URI']
WordPress通过301重定向实现非首先域(非www)跳转向本来是一个很简单事情,由于没弄清楚$_SERVER['HTTP_X_REWRITE_URL'] 和$_SERVER['REQUEST_U ...
- 分析攻击IP来源地并画出饼图
此文中的API将台湾列为国家,非本人立场,台湾属于中国,台湾岛生活的人不一定! 上码: #!/usr/bin/python #coding=utf-8 ''' http://ip-api.com/js ...
- Window下部署Maven Nexus
Nexus下载地址:https://www.sonatype.com/download-oss-sonatype 选择相应的版本下载后,本人下载的是nexus-2.12.0-01-bundle.zip ...
- jvm内存增长问题排查简例
jvm内存增长问题排查 排查个jvm 内存占用持续增加的问题,纪录一下,引以为戒. 运维发现应用jvm内存占用在发布后回落,然后持续增高,,dump后分析一下: 占内存的大部分是这种名字相似的bean ...
- linux下history命令显示执行时间
想在输入history命令之后,显示自己历史的命令执行的时间,需要在用户目录下~/.bashrc的文件末尾追加添加如下几行 之前一直想看一下自己历史命令执行的时间,找了很多教程都没有卵用,最终参考了如 ...