惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 司徒正美
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
腾讯CDC
WordPress大学
WordPress大学
爱范儿
爱范儿
GbyAI
GbyAI
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 聂微东
Google DeepMind News
Google DeepMind News
Recent Announcements
Recent Announcements
Latest news
Latest news
Last Week in AI
Last Week in AI
V2EX - 技术
V2EX - 技术
I
InfoQ
N
News | PayPal Newsroom
SecWiki News
SecWiki News
Microsoft Azure Blog
Microsoft Azure Blog
美团技术团队
T
Troy Hunt's Blog
H
Hacker News: Front Page
S
SegmentFault 最新的问题
TaoSecurity Blog
TaoSecurity Blog
V
Visual Studio Blog
Martin Fowler
Martin Fowler
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园_首页
S
Security @ Cisco Blogs
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
小众软件
小众软件
L
LangChain Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
Tor Project blog
L
LINUX DO - 热门话题
月光博客
月光博客
S
Schneier on Security
Y
Y Combinator Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
P
Proofpoint News Feed
Forbes - Security
Forbes - Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Hugging Face - Blog
Hugging Face - Blog
A
Arctic Wolf
Webroot Blog
Webroot Blog
博客园 - 叶小钗
F
Fortinet All Blogs
S
Securelist
AI
AI
B
Blog RSS Feed
Security Latest
Security Latest

博客园 - BearOcean

LOG.ZS.0001.基于Freetype的游戏字体渲染优化思路 const 和指针 C++ 下啥时候用struct, 啥时候用class C++ 和 Java 中的变参 解决站点关键数据,状态数据,无须持久化数据的一些思路 BS程序代码与安全与基本攻击/防御模式 Struts 实现的I18N Ant 阅读笔记 进度,效率,与个人事务管理 Personal Task 1.0 MySql与Java的时间类型 数据挖掘概述 解决Thread 的关闭问题和参数传递时想到的办法. Command 模式 .Net标准控件与自定义控件(2) ToolTipButton 内网聊天工具FreeChat 2.0 局域网聊天工具FreeChat 1.0 开发日志 内网聊天工具FreeChat Beta 为Socket写的附加方法 .Net 事件
FreeChat 2.0 ...大改 模型和架构
BearOcean · 2006-01-26 · via 博客园 - BearOcean

相关链接:

FreeChat(Beta) :     

http://bearocean.cnblogs.com/archive/2006/01/18/319310.html
FreeChat(1.0) :         http://bearocean.cnblogs.com/archive/2006/01/19/320510.html

FreeChat 2.0 模型:/Files/BearOcean/FreeChat2.0.rar

2006/01/26
FreeChat 2.0开发日志
最近出了很多事情所以一直没有更新,但是没事的时候对它又重新考虑了。。
到FreeChat1.0为止,几乎所有的逻辑都是写在form里边的。这样从架构的角度来看,是很不科学的。
所以对它进行了重新设计。

包含了如下的类:
1)FreeChatBaseForm
继承自System.Windows.Forms.Form
是FreeChat所有Form的基类。因为在做1.0的时候,发现一个Form已经不够用,不得不    做新的Form ,但是又有很多东西是可重用的。所以考虑做一个基类。

2)FreeChatBase
FreeChatMessage ,FreeChatListener, FreeChatSender的基类。包含他们的公共字段。

3)FreeChatMessage
封装发送和接受的字节流。目前一个消息包含了如下的附加信息:
   a) 消息正文的长度 (int)
   b) 消息发送方的计算机名 (string)
   c) 消息类型 (enum)
   d) 消息正文 (string)
  

这些都作为属性存在:
iType(消息类型)
strRemoteName (发送方标识)
iMessageLength (正文长度)
strRealMessage (字符串正文)
bytesPackedMessage (待解包的byte数组)
另外提供方法:
Pack()
将上述的字段转化成一个byte[],准备发送。
UnPack()
提取出byte[]中的各种信息。

所以在发送消息的时候:
FreeChatMessage Msg =new FreeChatMessage();
Msg.Type =(int)FreeChatMessage.MessageType.TextMessage;
Msg.RemoteName ="192.168.0.123";
Msg.RealMessage ="你好";

Msg.Pack();
这样,上述的所有字段就会被整合,并将生成的byte[]赋给Msg.bytesPackedMessage
然后可以将该FreeChatMessage作为参数传给后面将要讲到的
FreeChatSender.Send (FreeChatMessage)
这样就可以将byte[]发送给目标端。

接收方收到该byte[]后,可以:
FreeChatMessage Msg =new FreeChatMessage();
Msg.bytesPackedMessage =bytesBuffer;//bytesBuffer是从Socket得到的byte[]

//将Msg.bytesPackedMessage解包。并将各种信息分别赋给
//Type(消息类型)
//strRemoteName (发送方标识)
//iMessageLength (正文长度)
//strRealMessage (字符串正文)

Msg.Unpack()
//以后在通过Msg.strRealMessage属性就可以得到字符串正文。。。其他的属性也是一样的//办法取得。

4) FreeChatSender
初始化一个Socket,并发送一个Message到Server.
目前只有一个方法FreeChatSender.Send (FreeChatMessage Msg)

5) FreeChatListener
Listener在Forn的Load方法内初始化,在单独的线程内负责绑定监听,并异步的接受数据,采用了.Net Socket的异步机制。。。
接受到一个Msg以后,将激活一个GetMessage事件。

然后我在Form的Load里建立了该事件的连接。也就是说,FreeChat的所有Form与Socket的联系全部都由事件机制来完成,也就实现了这两个逻辑的独立性,而且FreeChatListener和FreeChatSender以及FreeChatMessage也都独立出来。

目前考虑到的最核心的逻辑就是这样的,做了一个模型实现了上述的机制,可以在开始位置下载到源码。。但是FreeChatMessage里面还有一些问题:
接受消息的时候,很可能一次接受不完整个数据,所以考虑添加FreeChatMessage.Append(byte[])方法。把UnPack()分解成2个方法:
GetSubInfo()
GetRealMessage()

这样在Listener里可以通过Msg.GetSubInfo()取得附加信息。
根据附加信息进行循环调用Msg.Append(byte[])将取道的信息放到Msg中,先前调用了GetSubInfo(),所以可以取到Msg.MessageLength,再根据这个确认消息是否取完。

确认取完后,再Msg.GetRealMessage()就可以获得真正的消息。
目前正在做这方面的修改。
放寒假了。。。回家去。