RSS订阅悠然探索,悠然索取
你的位置:首页 » 技术笔记 » 正文

继续讲讲怎么自己编写QQ(自编QQ铺垫篇之三)

选择字号: 超大 标准 发布时间:2014-5-14 10:28:46 | 作者:admin | 0个评论 | 人浏览

这篇是关于C++入门。

为了自编一个聊天程序,我们先考虑一下每一个聊天个体在程序中是个什么存在形式。

一个个体(这里把一个参与聊天的个体成为一个对象)有多个属性,比如他的昵称、他的ID、他的IP地址和端口等,这些属性都属于同一个对象;对于每个人,他和别的人都可能产生对话,那么这些对话都是需要保存的,否则你切换一个聊天对象,之前对象的聊天内容都不在了。

为了给所有对象一个唯一且易查找的标志,ID属性是必要的,而且最好用无符号整数来表示。

C++是面向对象的语言,对象是什么?

好吧,你该反思为什么你现在还没对象了。

类是对象的抽象。

有个故事是一个人去水果摊买水果,姑且叫他琪琪。

琪琪:我买水果

店家:什么水果?

琪琪:我买水果。

店家:拿,香蕉。

琪琪:我要水果。

店家:(手拿梨子)给。

琪琪:我要水果。

店家觉得这货太装逼了,一把刀砍死了琪琪。

 

从这个故事我们可以看出类和对象的关系,故事中有一个水果类CFruit:

class CFruit

{

CString Name;

CColor Color;

CTaste Taste;

CFruit(CString Name);

};

前三行中的CString、CColor、CTaste都是类型名,它们前面的“C”是Class的意思,表示这个类型是一个类(区别于int这些基础类型);跟在它们后面的是对应类型的变量Name、Color、Taste,而它们在CFruit类中就叫CFruit类的成员变量。

最后一行的与类名同名的一个函数,没有返回值,参数根据需要可有可无。它叫做这个类的构造函数,每新建一个该类的对象就会显式或隐式地调用这个函数。

显式像这样:

CFruit *Apple=new CFruit("苹果");

或者这样:

CFruit Apple=*(new CFruit("苹果"));

任何类的对象都可以用new来新建,它的返回值是该对象的指针。

前者用的是传指针的方法来获得生成的对象

后者是用的传值的方法来复制了一个新生成的对象。

所以琪琪应该说“我要买名叫XX的水果”。

我们在操作系统中也不能要水果,一定要指明要什么样的水果。

不过水果是什么,还得我们告诉操作系统。

这是哲学么?

好了,类就说到这里。

考虑服务程序端,一个聊天对象可以定义为这样的一个类:

class CUser

{

unsigned int UserID;

CString NickName;//CString 是C++中的一个类,它集成了关于字符串的很多属性以及操作。

CString ClientIP;用例如“113.54.141.250”的字符串形式保存客户端IP

int ClientPort;

CUser(int userid,CString nickname);//构造函数,在构造的时候就为该对象赋值。

};

如果聊天记录保存在客户端,那么服务端知道这些信息就够了。

服务端会利用这个类为每个聊天个体构造一个对象,从而保存下所有聊天个体的必要信息。

对于客户端,定义这样一个类:

class CPeer

{

unsigned int PeerID;

CString NickName;

CString Dialog;//保存与该类的对象的聊天记录。

};

差不多就这样了。

然后预告一下下期节目:

1.socket网络编程。

2.我们用MFC编写windows平台的可视化程序。

SDK:Visual Studio 2010

语言:C/C++

 

服务端的属性与工作:

服务端需要一个固定的公网IP和端口;

记录每个客户端的连接信息;

新用户上线时服务端通知其他所有客户端有新用户上线,并且把其他所有用户的信息送到新上线的这个客户端;

转发客户端之间的消息;

定时更新每个用户的上下线状态;

 

客户端:

以UDP报文的方式告诉给服务器端它选择的聊天对象以及消息内容;

由于是UDP方式,需要定时刷新与服务端的连接;

保存聊天记录。

标签:

猜你喜欢

发表评论

必填

选填

选填

必填,不填不让过哦,嘻嘻。

记住我,下次回复时不用重新输入个人信息

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。