我们再写一个继承自CollectionBase的类MessageCollection。用于存放消息队列。
1using System; 2 3namespace SocketLibrary 4{ 5 public class MessageCollection:System.Collections.CollectionBase 6 { 7 public MessageCollection() 8 { 9 10 } 11 public void Add(Message value) { 12 List.Add(value); 13 } 14 public Message this[int index] { 15 get { 16 return List[index] as Message; 17 } 18 set{ 19 List[index] = value; 20 } 21 } 22 public MessageCollection this[Connection connection] { 23 get { 24 MessageCollection collection = new MessageCollection(); 25 foreach(Message message in List) { 26 if(message.SendToOrReceivedFrom == connection) 27 collection.Add(message); 28 } 29 return collection; 30 } 31 } 32 } 33} 好了。协议制定完了,下面我们修改SocketBase的Listenning函数。当网络流可读时,我们就读出一个message格式的消息。并且在SocketBase中定义ConnectionClose、MessageReceived事件。并且在SocketBase的Listenning中根据情况触发。
再在SocketBase中增加一个MessageConnection型的属性。表示要发送的消息队列。
我们需要再启动一个线程。用于从消息队列中取出要发送的消息并发送。
最后源代码如下。在这个源代码中在停止时我们没有关闭网络连接。请自行关闭。
在最后的优化中,上面提到的源代码做了一定的修改,请从本文顶端下载源代码查看(点击查看附件)
|