Socket多人聊天MFC版

源码下载地址:
https://github.com/coderxj/Socket-Group-Chat
包括前面C语言版的1V1 和 多人聊天源码都有。

coding 环境:VS2015 WIN10

测试环境:VM虚拟机–>XP系统、2003server和主机WIN10

语言:C++,类库MFC

功能:基于服务器转发消息的多人聊天。

主要原理:server给每个连上的client都创建一个线程单独管理,这样就能实现多个client同时chatting,其中消息转发还是要靠用户名和指定聊天对象名。

界面功能介绍:

1.首先启动服务器

2.打开client exe程序,输入服务器IP,如果在本机测试则不需要输入,默认就是27.0.0.1,否则需要输入服务器所在主机的IP

3.输入username和chatname,这时候不能回车,要用鼠标点击connect,当对方上线后,服务器会发送对方在线状态过来,显示在friend status 状态栏中。这时就可以在输入框中输入消息,回车发送。

4.若中途想切换聊天用户,则只需要改变chatname后回车,程序会自动把焦点定位到输入框,输入消息后回车j发ji送即可。

5.server可以显示用户的在线状态和在线人数

程序中的难点:

1.最重要的,就是在while循环中,注意要加一个sleep函数,因为当程序出问题,不阻塞的时候,或者正常情况下的while死循环,会导致CPU使用率暴涨,加了个sleep后就会正常。

2.检查在线状态的时候,我是用send空字符串过去测试client是否能收到,若不能收到,则表示client已经离线,但是这也产生了一个问题,那就是如果频繁d发送检测消息给client,会和正常发送的消息冲突,导致消息发送失败,经过测试,在100ms/次的时候client几乎不能接收到消息。当检测间隔越大的时候,发生冲突的几率越小,而且检测client的在线状态并不需要很及时,延迟个几秒也是可以接受的其实。这样就能保证数据发送的时候不会冲突了。

3.拦截回车消息,一般就是重写一个预处理消息函数,然后判断是否按下回车,但是这里不行,这样会拦截整个对话框的回车消息,我们只需要在两个地方拦截,一个是chatname edit 和 input edit,所以拦截回车消息的时候判断一个是不是这两个控件,可以根据控件句柄来判断。

程序的BUG:

1.因为使用的是阻塞、同步I/O模式,所以需要给每个client分配一个线程,因为一个程序所能创建的线程的个数是有限的,一般2000多个吧,这样就不能处理多于2000个client的请求了。而且server运行起来肯定也很吃力。

2.client不能快速的切换状态,因为server是每隔2s检测一次。

3.目前只能发送文字,还没有对图片,和其它的文件进行处理。

4.and so on

程序可以改进的地方:

1.界面更加cool,可以使用自绘控件技术。

2.可以增加注册、登陆界面,用数据库进行管理

3.增加添加好友功能,然后好友列表用头像显示

4.双击好友头像会出一个聊天对话框

5.用非阻塞、异步I/O模型,这样就可以实现一个线程管理多用户了。也可以处理高并发任务了。

6.and so on

你可能感兴趣的:(Socket编程)