没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
ROOMCHAT(version.3.0)
1.界面:
这是一个基于 TCP/IP 的聊天室软件,整个软件分为服务端部分和客户端部
分。界面如下:
2.使用步骤:
1.首先在服务器开启服务器端
2.客户打开客户端后在客户端填写自己的 NICKNAME
3.点击连接(默认为作者本地 IP,)
4.一开始默认进入大厅,并自动发出进入房间的信息。
4.用户可在编辑区编辑自己想说的话
5.按发送或者直接 ENTER 即可发送出去
6.在左边的编辑框可以编辑自己想建的房间名称
7.点击 CREAT 建立
8.或点击其他房间之后点击 IN 按钮进入其他房间
9.若想换一个服务器频道可点击断开,按照自己的意愿更换到其他开启了服务端
的 IP 点连接即可。
10.完成了对话则点击退出,可退出对话框。
3.主要思路:
信息的传输主要是基于 socket 类,令服务端使用多线程监听来自多个客户端的
请求,AC 之后以此被基于信息的传递,建立一个套接字的数组来记录所有连通
的客户端。
3.1 关于显示聊天信息
当用户发送信息之后全部交给服务器来处理,接收到一个客户的信息之后将由服
务器处理它,当确认该信息的前缀为‘1’时,将作为聊天信息发送给所有的用
户,包括他自己,当客户接受到信息之后也会根据信息的前缀来决定显示到哪里
去,去掉前缀之后将显示到聊天框当中去。
3.2 关于信息的前缀处理
在这个聊天的信息处理中,使用前三位数字来作为信息的辅助信息。第一位用来
分类每一种信息的用处以此来在服务器端和客户端分类处理这些信息。第二三位
是每个用户的 clitag 表示他们所在的房间的 tag,通过这个 tag 使得每个人只能
可见改 tag 来的信息和 useronline 实现 room 的功能。下面是第一位的分类作用
列表:
第一位
前缀
在服务端中代表的意义 在客户端中的意义
1
从客户端到服务端的信息,表示正
常的聊天信息,应该被发送到各个
用户的聊天框内容中去
这意味着要显示到聊天客户端的
所有信息。只要发送到 List 控件
中即可。
2
从客户端到服务端的信息,该信息
表示有新的用户连接到这个服务
端,将用户的昵称加入记录数组中
去,并刷新 USER 列表,并发送到
所有的客户让他们更新列表
3
从客户端到服务端的信息,该信息
表示有用户退出了,将他的昵称在
昵称数组中清除,并更新所有用户
USER 列表
4
从客户端到服务端的信息,该信息
帮助处理显示刚进入的用户的进
入信息。
9
从客户端到服务端的信息,创建一
个房间并刷新房间列表,更改房间
人数,更改创建者的 clitag 为创
建的房间的 tag。
a
是关于申请者更换房间的信息,更
改申请者的 clitag,重置房间人
数,并且刷新所有人的房间列表。
0 代表各种系统功能(socket 连接
问题)的信息
5
这是关于服务器发来的用户列表
的信息,循环接收它并根据 tag 来
显示你所在的房间该显示的用户
8 这是关于服务器发来的房间列表
的信息,循环接收
b
循环接收更新 ROOM 或 USER 内容完
成
c 更改客户第二第三位的 clitag 的
内容
9
创建一个新的房间,并作各种更新
内容
a
表明有用户要换房间,那么更改他
的 clitag 并且做相关的更新
3.3 关于 USERONLINE&&ROOM 的显示
这一部分的功能也靠的是上一部分的分类,并且全部在服务端处理。服务端接受
所有的 IN 和 OUT 的信息。并储存在一个用户列表以及 ROOM 列表当中去。并根据
其他的 INOUT 的信息来更新这些数组,一旦更新就发送到所有的用户那里是他们
也更新。
3.4 关于 ROOM 的 CREAT 和 IN
上面已经谈到,关于 CREAT 的处理方式其实和用户的昵称的处理方式是一样的,
根据用户的 CREAT 来动态更新。多了一点是需要将他的 clitag 更改。来造成房
间的效果。因为每个用户只会看到跟他同 TAG 的用户的 Onlie 显示和信息。
而关于 IN 的部分,通过控件的选中的行号来处理,返获得房间 tag 然后更
新每个房间的人数,以及该申请者的 tag,然后 fresh 他的对话框,和所有人的
useronline 即可。
4.目前的源代码:
4.1 CLI 部分:
class CCSocketDlg : public CDialog
{
// Construction
public:
CCSocketDlg(CWnd* pParent = NULL); // standard constructor
~CCSocketDlg();
// Dialog Data
//{{AFX_DATA(CCSocketDlg)
enum { IDD = IDD_CSOCKET_DIALOG };
CButton m_button;
CListCtrl m_list;
CEdit m_edit;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CCSocketDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV
support
//}}AFX_VIRTUAL
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CCSocketDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
virtual void OnOK();
afx_msg void OnButton1();
afx_msg void OnFresh();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
public:
SOCKET sock,msgsock[50],clisock;
char clinickname[50][100];//
记录客户的名字
char roomshow[50][100];//
记录房间
int onlinecount[50];//
记录房间人数
int addlen;
sockaddr_in serv;
int count;
int countuser;
int getcount();
void sendtoall(char*);
CListCtrl m_user;
void freshuser(void);
};
UINT thread(LPVOID);
//
初始化对话框
BOOL CCSocketDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
剩余31页未读,继续阅读
亚赛大人
- 粉丝: 24
- 资源: 333
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0