全部博文(372)
2012年(372)
分类: 虚拟化
2012-03-26 18:00:12
组件封装方便使用的TcpChannel,通过事件定义就能方便进行tcp连接,数据接收事件定义等.更重要的是组件提供灵活的协议分析器,可以根据分析器直接实现对象和byte[]的转换.除了提供数据对象转换外还提供tcp粘包问题,可以让使用者完全不用关心这些烦锁的事情.
组件协议分析器的制定也是非常灵活,除了提供基于结束符和头描述大小的分包机制外,使用者还可以根据自己的需要实现自己的封包协议.自带的协议分析所组装的协也是基于基础类型的存格式.所以服务端也可以方便地使用c++,java等平台实现.
连接定义
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 |
mChannel = new TcpChannel(new HeadSizePackage());
mChannel.Connected += OnConnected;
mChannel.Error += OnError;
mChannel.Receive += OnReceive;
mChannel.Connect(txtIPAddress.Text, 4505);
private void OnReceive(object sender, EventChannelReceiveArgs e)
{
this.Dispatcher.BeginInvoke(() =>
{
Register reg =(Register)e.Message;
txtLog.Text+= string.Format("Name:{0}\r\n",reg.Name);
txtLog.Text += string.Format("EMail:{0}\r\n", reg.EMail);
});
}
private void OnError(object sender, EventChannelErrorArgs e)
{
this.Dispatcher.BeginInvoke(() =>
{
this.txtStatus.Content = e.Error.Message;
});
}
private void OnConnected(object sender, EventChannelArges e)
{
this.Dispatcher.BeginInvoke(() =>
{
this.txtStatus.Content = "Connected!";
this.cmdRegister.IsEnabled = true;
});
} |
定义消息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 |
public class Register:IMessage
{
public string Name;
public string EMail;
public void Save(BufferWriter writer)
{
writer.Write(Name);
writer.Write(EMail);
}
public void Load(BufferReader reader)
{
Name = reader.ReadString();
EMail = reader.ReadString();
}
} |
发送消息
1
2
3
4
5
6
7
8
9
10
11
12
13 |
Register reg = new Register();
reg.Name = txtName.Text;
reg.EMail = txtEMail.Text;
mChannel.Send(reg);
//以上消息的封装格式是
int32 //总长度 4byte
int32 //消息类型名称长度 4byte
string //消息名称utf8编码 byte[]
int32 // Name长度4byte
string // Name utf8编码 byte[]
int32 //EMail 长度4byte
string // EMail utf8编码byte[] |
以上协义格式相信做过socket通讯的朋友都比较熟悉,这样的协议分析c++,java也是很方便就能处理得到.如果你对这个组件感兴趣可以到以下地址获取完整代码