基于Socket的即时通讯系统Word下载.docx
《基于Socket的即时通讯系统Word下载.docx》由会员分享,可在线阅读,更多相关《基于Socket的即时通讯系统Word下载.docx(12页珍藏版)》请在冰豆网上搜索。
一、设计目的:
通过综合课程设计,使学生能够运用《数字信号处理》、《信号与系统》、《通信原理》、《面向对象的程序设计》、《计算机通信网》、《通信协议开发及应用》等课程的知识来设计一个基于Socket的即时通讯系统,培养学生的动手能力以及分析问题、解决问题的能力。
二、设计内容:
1.利用Socket通信机制实现一种即时通信系统。
2.系统分为服务端和客户端两部分:
2.1客户端向服务器注册自己的信息,包括IP地址、端口号、用户名等;
2.2客户端启动后向服务器查询其它用户在线状态,包括用户名、IP地址、端口号等;
2.3客户端之间建立直接连接,实现一对一的信息交换;
2.4服务器端维护用户的状态信息,对用户查询做出响应;
三、设计要求:
1基本要求:
(1)熟练掌握面向对象的程序设计方法;
(2)实现点对点通讯,能进行文字对话传输,包括客户端与服务器;
(3)能对系统参数进行配置。
2提高要求:
(1)实现文件、图片传输;
(2)语音对话(两人及两人以上);
(3)友好的对话界面
四、设计原理:
服务器:
服务器端主要完成监听和接收用户的连接请求,以及管理用户之间的通信和用户的状态,比如登陆和退出聊天室。
服务器端在启动时先建立一个SOCKET用以监听客户端的连接请求,由客户连接时新建一个SOCKET来进行与用户之间的数据传输,本程序定义了一个大小为20的SOCKET数组用来作于用户的连接,所以本程序同时最多可以有20人在同一聊天室中聊天。
客户退出聊天室时释放该用户占有的SOCKET,使之可以供其它用户使用。
客户端:
客户端主要是客户之间用来法聊天的,客户端启动后首先建立一个SOCKET根据客户输入的服务器的地址和用户名,向服务器发出连接请求,连接成功后就可以用同一个SOCKET用作数据传输,退出聊天室时关闭该SOCKET。
五、操作界面与演示:
打开程序
然后启动服务端:
登陆服务器,填写服务器IP和用户名。
程序演示结束。
六、源程序清单:
1//聊天程序.h:
mainheaderfileforthe聊天程序application
//
#if!
defined(AFX__H__C85C7F64_AD5B_11D2_800F_5254AB250EAA__INCLUDED_)
#defineAFX__H__C85C7F64_AD5B_11D2_800F_5254AB250EAA__INCLUDED_
#if_MSC_VER>
1000
#pragmaonce
#endif//_MSC_VER>
#ifndef__AFXWIN_H__
#errorinclude'
stdafx.h'
beforeincludingthisfileforPCH
#endif
#include"
resource.h"
//mainsymbols
/////////////////////////////////////////////////////////////////////////////
//CMyApp:
//See聊天程序.cppfortheimplementationofthisclass
classCMyApp:
publicCWinApp
{
public:
CMyApp();
//Overrides
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CMyApp)
public:
virtualBOOLInitInstance();
//}}AFX_VIRTUAL
//Implementation
//{{AFX_MSG(CMyApp)
//NOTE-theClassWizardwilladdandremovememberfunctionshere.
//DONOTEDITwhatyouseeintheseblocksofgeneratedcode!
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
}
//{{AFX_INSERT_LOCATION}}
//MicrosoftVisualC++willinsertadditionaldeclarationsimmediatelybeforethepreviousline.
#endif//!
2.voidworkingSock:
:
OnReceive(intnErrorCode)
//TODO:
Addyourspecializedcodehereand/orcallthebaseclass
//AfxMessageBox("
receiving"
MB_OK);
recvNum=0;
recvNum=Receive(recvBuf,4096);
//,MSG_PEEK);
if(recvNum!
=0)
{
CWinApp*thisApp;
//获得进程的句柄
thisApp=AfxGetApp();
CMyDlg*dialWnd;
//获得对话框的句柄
dialWnd=(CMyDlg*)thisApp->
GetMainWnd();
CListBox*allMes;
allMes=(CListBox*)dialWnd->
GetDlgItem(IDC_LIST1);
//获得listbox句柄
recvBuf[recvNum]='
\0'
;
allMes->
AddString(recvBuf);
//将接收到的消息显示在LISTBOX中
UpdateData(FALSE);
memset(recvBuf,0,4096);
//置0
}
/*
intlength;
length=dialWnd->
m_listAll.GetLength();
//从后面插入
//使之成为字符串
dialWnd->
m_listAll.Insert(length,recvBuf);
*/
AsyncSelect(FD_READ);
CAsyncSocket:
OnReceive(nErrorCode);
voidworkingSock:
OnSend(intnErrorCode)
SENDING"
if(dialWnd->
m_message!
="
"
)
intlength;
length=dialWnd->
m_message.GetLength();
memcpy(recvBuf,dialWnd->
m_message.GetBuffer(length),length);
dialWnd->
m_message.ReleaseBuffer();
Send(recvBuf,length,0);
dialWnd->
m_message="
OnSend(nErrorCode);
OnConnect(intnErrorCode)
this->
AsyncSelect(FD_READ);
client:
ConnectionisOK"
CWnd*sendBut,*mesEdit;
sendBut=dialWnd->
GetDlgItem(IDC_BUTTON3);
mesEdit=dialWnd->
GetDlgItem(IDC_EDIT3);
sendBut->
EnableWindow(TRUE);
mesEdit->
//使可以输入信息
OnConnect(nErrorCode);
3.HCURSORCMyDlg:
OnQueryDragIcon()
return(HCURSOR)m_hIcon;
voidCMyDlg:
OnListen()
Addyourcontrolnotificationhandlercodehere
NowPCis=0;
//server
//初始化serverSOCKET类
//in_addraddLocal;
//addLocal.S_un.S_addr=htonl(INADDR_ANY);
//本地IP地址,把整形的INADDR_ANY变换成字符串
BOOLFlag=ServerListenSock.Create(5150,SOCK_STREAM,FD_ACCEPT);
//,inet_ntoa(addLocal));
if(!
Flag)
{//createfailure
AfxMessageBox("
SocketError!
);
ServerListenSock.Close();
PostQuitMessage(0);
return;
ServerListenSock.Listen
(1))//listen
{//listenfailure