基于Socket的即时通讯系统.docx
《基于Socket的即时通讯系统.docx》由会员分享,可在线阅读,更多相关《基于Socket的即时通讯系统.docx(12页珍藏版)》请在冰豆网上搜索。
![基于Socket的即时通讯系统.docx](https://file1.bdocx.com/fileroot1/2022-11/15/a581da0f-9ed6-431d-b318-7bd424a372ec/a581da0f-9ed6-431d-b318-7bd424a372ec1.gif)
基于Socket的即时通讯系统
《综合课程设计》
设计报告
论文题目:
基于Socket的即时通讯系统
学院(系):
电子信息工程系
班级:
72-2
学生姓名:
严冬兴
学号:
10907990627
指导教师:
梁快佘丽
时间:
2012年9月10日到2012年9月21日
一、设计目的:
通过综合课程设计,使学生能够运用《数字信号处理》、《信号与系统》、《通信原理》、《面向对象的程序设计》、《计算机通信网》、《通信协议开发及应用》等课程的知识来设计一个基于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>1000
#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//!
defined(AFX__H__C85C7F64_AD5B_11D2_800F_5254AB250EAA__INCLUDED_)
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中
allMes->UpdateData(FALSE);
memset(recvBuf,0,4096);//置0
}
/*
intlength;
length=dialWnd->m_listAll.GetLength();//从后面插入
recvBuf[recvNum]='\0';//使之成为字符串
dialWnd->m_listAll.Insert(length,recvBuf);
*/
AsyncSelect(FD_READ);
CAsyncSocket:
:
OnReceive(nErrorCode);
}
voidworkingSock:
:
OnSend(intnErrorCode)
{
//TODO:
Addyourspecializedcodehereand/orcallthebaseclass
CWinApp*thisApp;//获得进程的句柄
thisApp=AfxGetApp();
CMyDlg*dialWnd;//获得对话框的句柄
dialWnd=(CMyDlg*)thisApp->GetMainWnd();
//AfxMessageBox("SENDING",MB_OK);
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="";
dialWnd->UpdateData(FALSE);
AsyncSelect(FD_READ);
CAsyncSocket:
:
OnSend(nErrorCode);
}
voidworkingSock:
:
OnConnect(intnErrorCode)
{
//TODO:
Addyourspecializedcodehereand/orcallthebaseclass
this->AsyncSelect(FD_READ);
//AfxMessageBox("client:
ConnectionisOK",MB_OK);
{
CWinApp*thisApp;//获得进程的句柄
thisApp=AfxGetApp();
CMyDlg*dialWnd;//获得对话框的句柄
dialWnd=(CMyDlg*)thisApp->GetMainWnd();
CWnd*sendBut,*mesEdit;
sendBut=dialWnd->GetDlgItem(IDC_BUTTON3);
mesEdit=dialWnd->GetDlgItem(IDC_EDIT3);
sendBut->EnableWindow(TRUE);
mesEdit->EnableWindow(TRUE);//使可以输入信息
}
CAsyncSocket:
:
OnConnect(nErrorCode);
}
3.HCURSORCMyDlg:
:
OnQueryDragIcon()
{
return(HCURSOR)m_hIcon;
}
voidCMyDlg:
:
OnListen()
{
//TODO:
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;
}
if(!
ServerListenSock.Listen
(1))//listen
{//listenfailure
AfxMessageBox("SocketError!
");
ServerListenSock.Close();
PostQuitMessage(0);