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

推荐订阅源

博客园 - Franky
N
Netflix TechBlog - Medium
Google Online Security Blog
Google Online Security Blog
月光博客
月光博客
量子位
酷 壳 – CoolShell
酷 壳 – CoolShell
V
V2EX
腾讯CDC
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
M
MIT News - Artificial intelligence
Vercel News
Vercel News
The GitHub Blog
The GitHub Blog
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
Apple Machine Learning Research
Apple Machine Learning Research
aimingoo的专栏
aimingoo的专栏
博客园 - 三生石上(FineUI控件)
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
MongoDB | Blog
MongoDB | Blog
H
Help Net Security
The Cloudflare Blog
Blog — PlanetScale
Blog — PlanetScale
F
Full Disclosure
G
Google Developers Blog
罗磊的独立博客
Jina AI
Jina AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Y
Y Combinator Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
J
Java Code Geeks
A
About on SuperTechFans
IT之家
IT之家
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
有赞技术团队
有赞技术团队
GbyAI
GbyAI
雷峰网
雷峰网
T
The Blog of Author Tim Ferriss
The Register - Security
The Register - Security
U
Unit 42
D
Docker
Martin Fowler
Martin Fowler
L
LINUX DO - 热门话题
NISL@THU
NISL@THU
阮一峰的网络日志
阮一峰的网络日志
C
Cybersecurity and Infrastructure Security Agency CISA
博客园_首页
Google DeepMind News
Google DeepMind News

博客园 - 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()就可以获得真正的消息。
目前正在做这方面的修改。
放寒假了。。。回家去。