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

推荐订阅源

Simon Willison's Weblog
Simon Willison's Weblog
T
Threatpost
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Spread Privacy
Spread Privacy
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Engineering at Meta
Engineering at Meta
T
Tenable Blog
C
Cisco Blogs
T
The Blog of Author Tim Ferriss
NISL@THU
NISL@THU
T
Threat Research - Cisco Blogs
T
The Exploit Database - CXSecurity.com
P
Privacy & Cybersecurity Law Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
S
Secure Thoughts
N
News and Events Feed by Topic
Google DeepMind News
Google DeepMind News
博客园 - 三生石上(FineUI控件)
Microsoft Azure Blog
Microsoft Azure Blog
月光博客
月光博客
H
Hacker News: Front Page
I
InfoQ
L
LangChain Blog
Security Latest
Security Latest
The Cloudflare Blog
Forbes - Security
Forbes - Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Stack Overflow Blog
Stack Overflow Blog
TaoSecurity Blog
TaoSecurity Blog
量子位
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V
Visual Studio Blog
Scott Helme
Scott Helme
爱范儿
爱范儿
A
Arctic Wolf
F
Full Disclosure
酷 壳 – CoolShell
酷 壳 – CoolShell
Schneier on Security
Schneier on Security
N
News and Events Feed by Topic
C
CXSECURITY Database RSS Feed - CXSecurity.com
L
LINUX DO - 最新话题
V2EX - 技术
V2EX - 技术
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
人人都是产品经理
人人都是产品经理
The Hacker News
The Hacker News
Hugging Face - Blog
Hugging Face - Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
Know Your Adversary
Know Your Adversary
Application and Cybersecurity Blog
Application and Cybersecurity Blog

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