网络聊天室的实现计算机操作系统课程设计
网络程序设计课程设计--VC(MFC)实现简单的聊天室程序

《网络程序设计》课程设计报告书题目:简单的聊天室程序专业:网络工程完成日期:一、题目:简单的聊天室程序要求:本题是一个简单的聊天室程序,采用客户/服务器模式,分为客户端程序和服务器端程序。
由于服务器只能支持一个客户,实际上是一个点对点通信的程序。
客户端程序和服务器程序通过网络交换聊天字符串内容,并在窗口的列表框中显示。
二、系统概要设计聊天室是分客户端和服务端两个应用程序的,两个应用程序要想实现交互必须编写相应的指令和识别指令的代码,我写的这是个指令依次是启动停止用户退出的命令,但用户想要进行以上动作中的任何一个时,在用户按下按键的时候,客户端都是向服务端发送相应的指令,再由服务端实际的执行。
三、系统详细设计对概要设计中提到的功能函数进行详细设计。
服务器端:// ChatRoomServerDlg.cpp : implementation file//#include "stdafx.h"#include "ChatRoomServer.h"#include "ChatRoomServerDlg.h"#include "ListenSocket.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DATA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CChatRoomServerDlg dialogCChatRoomServerDlg::CChatRoomServerDlg(CWnd* pParent /*=NULL*/) : CDialog(CChatRoomServerDlg::IDD, pParent){//{{AFX_DATA_INIT(CChatRoomServerDlg)// NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CChatRoomServerDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CChatRoomServerDlg)DDX_Control(pDX, IDC_BUTTON_STOP, m_IDC_BUTTON_STOP);DDX_Control(pDX, IDC_BUTTON_START, m_IDC_BUTTON_START);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CChatRoomServerDlg, CDialog)//{{AFX_MSG_MAP(CChatRoomServerDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON_START, OnButtonStart)ON_BN_CLICKED(IDC_BUTTON_STOP, OnButtonStop)//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CChatRoomServerDlg message handlersBOOL CChatRoomServerDlg::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);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// Set the icon for this dialog. The framework does this automatically// when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization herem_IDC_BUTTON_STOP.EnableWindow(FALSE);return TRUE; // return TRUE unless you set the focus to a control}void CChatRoomServerDlg::OnSysCommand(UINT nID, LPARAM lParam)if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}// If you add a minimize button to your dialog, you will need the code below// to draw the icon. For MFC applications using the document/view model,// this is automatically done for you by the framework.void CChatRoomServerDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}}// The system calls this to obtain the cursor to display while the user drags// the minimized window.HCURSOR CChatRoomServerDlg::OnQueryDragIcon()return (HCURSOR) m_hIcon;}void CChatRoomServerDlg::OnButtonStart(){// TODO: Add your control notification handler code herem_IDC_BUTTON_START.EnableWindow(FALSE);//使启动按钮无效ListenSocket.Create(6767);//创建监听套接字端口为6767ListenSocket.Listen();//开始监听m_IDC_BUTTON_STOP.EnableWindow(TRUE);//将停止按钮激活}void CChatRoomServerDlg::OnButtonStop(){// TODO: Add your control notification handler code herem_IDC_BUTTON_STOP.EnableWindow(FALSE);//使停止按钮无效ListenSocket.Close();//关闭监听套接字m_IDC_BUTTON_START.EnableWindow(TRUE);//将启动按钮激活}// ChatRoomServer.h : main header file for the CHATROOMSERVER application//#if !defined(AFX_CHA TROOMSERVER_H__680EC642_E19B_4D55_88DF_2C9E9B1B30FD __INCLUDED_)#defineAFX_CHATROOMSERVER_H__680EC642_E19B_4D55_88DF_2C9E9B1B30FD__INCLUDE D_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#ifndef __AFXWIN_H__#error include 'stdafx.h' before including this file for PCH#endif#include "resource.h" // main symbols/////////////////////////////////////////////////////////////////////////////// CChatRoomServerApp:// See ChatRoomServer.cpp for the implementation of this class//class CChatRoomServerApp : public CWinApp{public:CChatRoomServerApp();// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CChatRoomServerApp)public:virtual BOOL InitInstance();//}}AFX_VIRTUAL// Implementation//{{AFX_MSG(CChatRoomServerApp)// NOTE - the ClassWizard will add and remove member functions here.// DO NOT EDIT what you see in these blocks of generated code !//}}AFX_MSGDECLARE_MESSAGE_MAP()};///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCA TION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif// !defined(AFX_CHATROOMSERVER_H__680EC642_E19B_4D55_88DF_2C9E9B1B30FD__ INCLUDED_)// ChatRoomServerDlg.h : header file//#if !defined(AFX_CHA TROOMSERVERDLG_H__5BE648B6_8A9C_4E90_BF1D_20FE943A5 25F__INCLUDED_)#defineAFX_CHATROOMSERVERDLG_H__5BE648B6_8A9C_4E90_BF1D_20FE943A525F__INCL UDED_#include "ClientSocketList.h" // Added by ClassView#include "ListenSocket.h" // Added by ClassView#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000/////////////////////////////////////////////////////////////////////////////// CChatRoomServerDlg dialogclass CChatRoomServerDlg : public CDialog{// Constructionpublic:CListenSocket ListenSocket;CChatRoomServerDlg(CWnd* pParent = NULL); // standard constructor// Dialog Data//{{AFX_DATA(CChatRoomServerDlg)enum { IDD = IDD_CHATROOMSERVER_DIALOG };CButton m_IDC_BUTTON_STOP;CButton m_IDC_BUTTON_START;//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CChatRoomServerDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support//}}AFX_VIRTUAL// Implementationprotected:HICON m_hIcon;// Generated message map functions//{{AFX_MSG(CChatRoomServerDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnButtonStart();afx_msg void OnButtonStop();//}}AFX_MSGDECLARE_MESSAGE_MAP()};//{{AFX_INSERT_LOCA TION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif// !defined(AFX_CHA TROOMSERVERDLG_H__5BE648B6_8A9C_4E90_BF1D_20FE943A52 5F__INCLUDED_)#if !defined(AFX_CLIENTSOCKET_H__5B707F31_3AD5_4F47_B58E_ECFC99EB60F0__IN CLUDED_)#defineAFX_CLIENTSOCKET_H__5B707F31_3AD5_4F47_B58E_ECFC99EB60F0__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000// ClientSocket.h : header file///////////////////////////////////////////////////////////////////////////////// CClientSocket command targetclass CClientSocketList;class CClientSocket : public CSocket{// Attributespublic:// Operationspublic:CClientSocket(CClientSocketList *);virtual ~CClientSocket();// Overridespublic:CClientSocketList *List;CClientSocket * Front;CClientSocket * Next;// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CClientSocket)public:virtual void OnReceive(int nErrorCode);virtual void OnClose(int nErrorCode);//}}AFX_VIRTUAL// Generated message map functions//{{AFX_MSG(CClientSocket)// NOTE - the ClassWizard will add and remove member functions here.//}}AFX_MSG// Implementationprotected:};///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCA TION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif// !defined(AFX_CLIENTSOCKET_H__5B707F31_3AD5_4F47_B58E_ECFC99EB60F0__INC LUDED_)// ClientSocketList.h: interface for the CClientSocketList class.////////////////////////////////////////////////////////////////////////#if !defined(AFX_CLIENTSOCKETLIST_H__E746355D_FA10_4D12_B544_2FF152C16414__ INCLUDED_)#defineAFX_CLIENTSOCKETLIST_H__E746355D_FA10_4D12_B544_2FF152C16414__INCLUDE D_#include "ClientSocket.h"#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000class CClientSocketList{public:BOOL Sends(CClientSocket *);BOOL Add(CClientSocket *);CClientSocket * Head;CClientSocketList();virtual ~CClientSocketList();};#endif// !defined(AFX_CLIENTSOCKETLIST_H__E746355D_FA10_4D12_B544_2FF152C16414__I NCLUDED_)#if !defined(AFX_LISTENSOCKET_H__5D655304_370E_4680_A556_E417552D24EC__INC LUDED_)#defineAFX_LISTENSOCKET_H__5D655304_370E_4680_A556_E417552D24EC__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000// ListenSocket.h : header file//#include "ClientSocketList.h"/////////////////////////////////////////////////////////////////////////////// CListenSocket command targetclass CListenSocket : public CSocket{// Attributespublic:// Operationspublic:CClientSocketList CCSL;//客户socket列表CListenSocket();virtual ~CListenSocket();// Overridespublic:// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CListenSocket)public:virtual void OnAccept(int nErrorCode); //重载OnAccept函数//}}AFX_VIRTUAL// Generated message map functions//{{AFX_MSG(CListenSocket)// NOTE - the ClassWizard will add and remove member functions here.//}}AFX_MSG// Implementationprotected:};///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCA TION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif// !defined(AFX_LISTENSOCKET_H__5D655304_370E_4680_A556_E417552D24EC__INCL UDED_)// ChatRoomServer.cpp : Defines the class behaviors for the application.//#include "stdafx.h"#include "ChatRoomServer.h"#include "ChatRoomServerDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CChatRoomServerAppBEGIN_MESSAGE_MAP(CChatRoomServerApp, CWinApp)//{{AFX_MSG_MAP(CChatRoomServerApp)// NOTE - the ClassWizard will add and remove mapping macros here.// DO NOT EDIT what you see in these blocks of generated code!//}}AFX_MSGON_COMMAND(ID_HELP, CWinApp::OnHelp)END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CChatRoomServerApp constructionCChatRoomServerApp::CChatRoomServerApp(){// TODO: add construction code here,// Place all significant initialization in InitInstance}/////////////////////////////////////////////////////////////////////////////// The one and only CChatRoomServerApp objectCChatRoomServerApp theApp;/////////////////////////////////////////////////////////////////////////////// CChatRoomServerApp initializationBOOL CChatRoomServerApp::InitInstance(){if (!AfxSocketInit()){AfxMessageBox(IDP_SOCKETS_INIT_FAILED);return FALSE;}AfxEnableControlContainer();// Standard initialization// If you are not using these features and wish to reduce the size// of your final executable, you should remove from the following// the specific initialization routines you do not need.#ifdef _AFXDLLEnable3dControls(); // Call this when using MFC in a shared DLL #elseEnable3dControlsStatic(); // Call this when linking to MFC statically#endifCChatRoomServerDlg dlg;m_pMainWnd = &dlg;int nResponse = dlg.DoModal();if (nResponse == IDOK){// TODO: Place code here to handle when the dialog is// dismissed with OK}else if (nResponse == IDCANCEL){// TODO: Place code here to handle when the dialog is// dismissed with Cancel}// Since the dialog has been closed, return FALSE so that we exit the// application, rather than start the application's message pump.return FALSE;}II 客户端:客户端:// ChatRoomClient.cpp : Defines the class behaviors for the application.//#include "stdafx.h"#include "ChatRoomClient.h"#include "ChatRoomClientDlg.h"#include "ConnectedDlg.h"#include "ClientSocket.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifCClientSocket curSocket;/////////////////////////////////////////////////////////////////////////////// CChatRoomClientAppBEGIN_MESSAGE_MAP(CChatRoomClientApp, CWinApp)//{{AFX_MSG_MAP(CChatRoomClientApp)// NOTE - the ClassWizard will add and remove mapping macros here.// DO NOT EDIT what you see in these blocks of generated code!//}}AFX_MSGON_COMMAND(ID_HELP, CWinApp::OnHelp)END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CChatRoomClientApp constructionCChatRoomClientApp::CChatRoomClientApp(){// TODO: add construction code here,// Place all significant initialization in InitInstance}/////////////////////////////////////////////////////////////////////////////// The one and only CChatRoomClientApp objectCChatRoomClientApp theApp;/////////////////////////////////////////////////////////////////////////////// CChatRoomClientApp initializationBOOL CChatRoomClientApp::InitInstance(){if (!AfxSocketInit()){AfxMessageBox(IDP_SOCKETS_INIT_FAILED);return FALSE;}AfxEnableControlContainer();// Standard initialization// If you are not using these features and wish to reduce the size// of your final executable, you should remove from the following// the specific initialization routines you do not need.#ifdef _AFXDLLEnable3dControls(); // Call this when using MFC in a shared DLL #elseEnable3dControlsStatic(); // Call this when linking to MFC statically#endifCConnectedDlg cdlg(&curSocket);if (cdlg.DoModal()==IDCANCEL) return FALSE;CChatRoomClientDlg dlg(&curSocket);m_pMainWnd = &dlg;curSocket.SetDlg(&dlg);int nResponse = dlg.DoModal();if (nResponse == IDOK){// TODO: Place code here to handle when the dialog is// dismissed with OK}else if (nResponse == IDCANCEL){// TODO: Place code here to handle when the dialog is// dismissed with Cancel}// Since the dialog has been closed, return FALSE so that we exit the// application, rather than start the application's message pump.return FALSE;}// ChatRoomClientDlg.cpp : implementation file//#include "stdafx.h"#include "ChatRoomClient.h"#include "ChatRoomClientDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DATA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CChatRoomClientDlg dialogCChatRoomClientDlg::CChatRoomClientDlg(CClientSocket *tmp,CWnd* pParent /*=NULL*/) : CDialog(CChatRoomClientDlg::IDD, pParent){//{{AFX_DATA_INIT(CChatRoomClientDlg)m_IDC_EDIT_MESSAGE = _T("");//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);myServerSocket=tmp;}void CChatRoomClientDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CChatRoomClientDlg)DDX_Control(pDX, IDC_STATIC_NIKENAME, m_STATIC_NIKENAME_CONTROL);DDX_Control(pDX, IDC_LIST_CHA TBOX, m_IDC_LIST_CHATBOX_CONTROL);DDX_Text(pDX, IDC_EDIT_MESSAGE, m_IDC_EDIT_MESSAGE);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CChatRoomClientDlg, CDialog)//{{AFX_MSG_MAP(CChatRoomClientDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON_SEND, OnButtonSend)//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CChatRoomClientDlg message handlersBOOL CChatRoomClientDlg::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);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// Set the icon for this dialog. The framework does this automatically// when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small iconm_STATIC_NIKENAME_CONTROL.SetWindowText(myServerSocket->NikeName);// TODO: Add extra initialization herereturn TRUE; // return TRUE unless you set the focus to a control}void CChatRoomClientDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}// If you add a minimize button to your dialog, you will need the code below// to draw the icon. For MFC applications using the document/view model,// this is automatically done for you by the framework.void CChatRoomClientDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}}// The system calls this to obtain the cursor to display while the user drags// the minimized window.HCURSOR CChatRoomClientDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}BOOL CChatRoomClientDlg::GetMessage(){char buff[1000];int count;count=myServerSocket->Receive(buff,1000);buff[count]=0;m_IDC_LIST_CHA TBOX_CONTROL.AddString(buff);return true;void CChatRoomClientDlg::OnButtonSend(){// TODO: Add your control notification handler code hereint n;char message[1000];UpdateData(TRUE);m_IDC_EDIT_MESSAGE=myServerSocket->NikeName+": "+m_IDC_EDIT_MESSAGE;n=m_IDC_EDIT_MESSAGE.GetLength();//message=new char(n+1);sprintf(message,"%s",m_IDC_EDIT_MESSAGE.GetBuffer(n));message[n]=0;if (myServerSocket->Send(message,n+1)){m_IDC_EDIT_MESSAGE="";UpdateData(FALSE);}else{AfxMessageBox("网络传输错误!!!");}}// ClientSocket.cpp : implementation file//#include "stdafx.h"#include "ChatRoomClient.h"#include "ClientSocket.h"#include "ChatRoomClientDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CClientSocketCClientSocket::CClientSocket()NikeName="";myDlg=0;}CClientSocket::~CClientSocket(){}BOOL CClientSocket::SetDlg(CChatRoomClientDlg *tmp){myDlg=tmp;return true;}// Do not edit the following lines, which are needed by ClassWizard.#if 0BEGIN_MESSAGE_MAP(CClientSocket, CSocket)//{{AFX_MSG_MAP(CClientSocket)//}}AFX_MSG_MAPEND_MESSAGE_MAP()#endif // 0/////////////////////////////////////////////////////////////////////////////// CClientSocket member functionsvoid CClientSocket::OnReceive(int nErrorCode){// TODO: Add your specialized code here and/or call the base class myDlg->GetMessage();CSocket::OnReceive(nErrorCode);}// ConnectedDlg1.cpp : implementation file//#include "stdafx.h"#include "ChatRoomClient.h"#include "ConnectedDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CConnectedDlg dialogCConnectedDlg::CConnectedDlg(CClientSocket * tmp,CWnd* pParent /*=NULL*/) : CDialog(CConnectedDlg::IDD, pParent){//{{AFX_DATA_INIT(CConnectedDlg)m_IDC_EDIT_ADDRESS = _T("");m_IDC_EDIT_NIKENAME = _T("");//}}AFX_DATA_INITmyServerSocket=tmp;}void CConnectedDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CConnectedDlg)DDX_Text(pDX, IDC_EDIT_ADDRESS, m_IDC_EDIT_ADDRESS);DDX_Text(pDX, IDC_EDIT_NIKENAME, m_IDC_EDIT_NIKENAME);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CConnectedDlg, CDialog)//{{AFX_MSG_MAP(CConnectedDlg)//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CConnectedDlg message handlersvoid CConnectedDlg::OnOK(){// TODO: Add extra validation hereUpdateData(TRUE);char *nikename,*address;int n;if (!myServerSocket->Create()){myServerSocket->Close();AfxMessageBox("网络创建错误!!");return;}n=m_IDC_EDIT_ADDRESS.GetLength();address=new char(n+1);sprintf(address,"%s",m_IDC_EDIT_ADDRESS.GetBuffer(n));address[n]=0;n=m_IDC_EDIT_NIKENAME.GetLength();nikename=new char(n+1);sprintf(nikename,"%s",m_IDC_EDIT_NIKENAME.GetBuffer(n));nikename[n]=0;if (!myServerSocket->Connect(address,6767)){myServerSocket->Close();AfxMessageBox("网络连接错误!请重新检查服务器地址的填写是否正确?");return;}myServerSocket->NikeName=nikename;CDialog::OnOK();}// stdafx.cpp : source file that includes just the standard includes// ChatRoomClient.pch will be the pre-compiled header// stdafx.obj will contain the pre-compiled type information#include "stdafx.h"// ChatRoomClient.h : main header file for the CHATROOMCLIENT application//#if !defined(AFX_CHATROOMCLIENT_H__4503F0DD_CA95_4F24_B6EE_3183B64B095B_ _INCLUDED_)#defineAFX_CHATROOMCLIENT_H__4503F0DD_CA95_4F24_B6EE_3183B64B095B__INCLUDE D_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#ifndef __AFXWIN_H__#error include 'stdafx.h' before including this file for PCH#endif#include "resource.h" // main symbols/////////////////////////////////////////////////////////////////////////////// CChatRoomClientApp:// See ChatRoomClient.cpp for the implementation of this class//class CChatRoomClientApp : public CWinApp{public:CChatRoomClientApp();// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CChatRoomClientApp)public:virtual BOOL InitInstance();//}}AFX_VIRTUAL// Implementation//{{AFX_MSG(CChatRoomClientApp)// NOTE - the ClassWizard will add and remove member functions here.// DO NOT EDIT what you see in these blocks of generated code !//}}AFX_MSGDECLARE_MESSAGE_MAP()};///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCA TION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif// !defined(AFX_CHATROOMCLIENT_H__4503F0DD_CA95_4F24_B6EE_3183B64B095B__I NCLUDED_)// ChatRoomClientDlg.h : header file//#if !defined(AFX_CHATROOMCLIENTDLG_H__4DF07865_B696_4641_82F8_4B32BF39595 9__INCLUDED_)#defineAFX_CHATROOMCLIENTDLG_H__4DF07865_B696_4641_82F8_4B32BF395959__INCLU DED_#include "ClientSocket.h" // Added by ClassView#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000//class ClientSocket;/////////////////////////////////////////////////////////////////////////////// CChatRoomClientDlg dialogclass CChatRoomClientDlg : public CDialog{// Constructionpublic:CClientSocket * myServerSocket;BOOL GetMessage();CChatRoomClientDlg(CClientSocket *,CWnd* pParent = NULL); // standard constructor// Dialog Data//{{AFX_DATA(CChatRoomClientDlg)enum { IDD = IDD_CHATROOMCLIENT_DIALOG };CStatic m_STATIC_NIKENAME_CONTROL;CListBox m_IDC_LIST_CHA TBOX_CONTROL;CString m_IDC_EDIT_MESSAGE;//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CChatRoomClientDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support//}}AFX_VIRTUAL// Implementationprotected:HICON m_hIcon;// Generated message map functions//{{AFX_MSG(CChatRoomClientDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnButtonSend();//}}AFX_MSGDECLARE_MESSAGE_MAP()};//{{AFX_INSERT_LOCA TION}}。
网络聊天室课程设计

网络聊天室课程设计一、课程目标知识目标:1. 学生理解网络聊天室的基本概念,掌握网络交流的基本礼仪和技巧。
2. 学生了解网络聊天室的常用功能,学会使用相关软件或平台进行安全、文明的网络交流。
3. 学生掌握网络信息安全的基本知识,提高防范网络诈骗和不良信息的能力。
技能目标:1. 学生能够运用所学网络交流技巧,与他人进行有效沟通,表达自己的观点和需求。
2. 学生能够运用网络信息安全知识,保护个人隐私和信息安全,避免上当受骗。
3. 学生能够自主查找网络资源,拓展学习视野,提高信息素养。
情感态度价值观目标:1. 学生树立正确的网络道德观念,尊重他人,文明交流,自觉抵制不良信息。
2. 学生增强网络安全意识,遵守网络法律法规,积极维护网络环境和谐稳定。
3. 学生培养团队协作精神,学会在网络聊天室中与他人合作、分享,提升人际沟通能力。
课程性质:本课程为信息技术与网络素养教育相结合的实践课程,旨在帮助学生掌握网络聊天室相关知识,提高网络沟通能力,培养正确的网络道德观念。
学生特点:六年级学生具有一定的网络基础,好奇心强,善于接受新事物,但网络素养和安全意识有待提高。
教学要求:结合学生特点和课程性质,将课程目标分解为具体的学习成果,注重实践操作和案例分析,提高学生的网络素养和安全意识。
在教学过程中,关注学生的个体差异,鼓励学生积极参与,培养自主学习和团队合作能力。
通过课后评估,检验课程目标的达成情况,为后续教学提供依据。
二、教学内容1. 网络聊天室基础知识:- 网络聊天室的定义与功能- 常见的网络聊天软件与平台介绍2. 网络交流礼仪与技巧:- 网络沟通的基本原则- 文明用语与礼貌表达- 网络表情符号的正确使用3. 网络信息安全:- 个人信息保护意识- 网络诈骗类型及防范方法- 遵守网络法律法规,维护网络安全4. 实践操作:- 网络聊天软件的注册与使用- 网络聊天室中的文明交流与团队协作- 案例分析与讨论教材章节关联:本教学内容与教材中“网络素养与信息安全”章节相关,涉及以下内容:1. 网络聊天室基础知识:教材第3章第1节2. 网络交流礼仪与技巧:教材第3章第2节3. 网络信息安全:教材第4章第1节4. 实践操作:教材第3章和第4章的实践案例教学进度安排:1. 网络聊天室基础知识(1课时)2. 网络交流礼仪与技巧(1课时)3. 网络信息安全(1课时)4. 实践操作与案例分析(2课时)三、教学方法1. 讲授法:- 对于网络聊天室基础知识、网络信息安全等内容,采用讲授法进行教学,为学生提供系统的理论指导。
vc++网络聊天室的实现计算机操作系统课程设计说明书(含MFC源程序)

vc++网络聊天室的实现计算机操作系统课程设计说明书(含MFC源程序)————————————————————————————————作者:————————————————————————————————日期:实验报告||实验名称网络聊天室的实现课程名称计算机操作系统||目录【1】设计原理—-—————————-———--——-—-—4 【2】程序流程图———-——————-—-———————-—9 【3】设计步骤—-—-—-———————————————-—10 【4】使用方法说明———--————-——-———————-21 【5】实验结果及分析—-——-—————--————-———24设计原理计算机网络技术发展至今已经大大超越了人们当初的预想,无论是人们日常的工作还是学习,我们都越来越多的依靠到互联网。
各种实时性的聊天娱乐软件也同时诞生,而且为我们的即时通讯带来了众多的方便,比如说大家所熟知的腾讯QQ、微软的MSN、移动的Fetion 等,都是做的比较成功的实时聊天工具。
随着网络的日益普及,各种聊天工具也层出不穷,接下来的课程设计就是针对一个简单的网络聊天程序,利用MFC为开发工具,实现基本的通讯功能。
此程序主要分为两部分:服务器端和客户端。
服务器端用于提供一个网络端口,等待客户端发出请求,登录到此服务端,然后进行网络通讯和消息的转发;客户端可通过服务器端的IP地址发送连接请求,然后登陆聊天室。
在服务器端的成员列表栏中会显示在线的所有人名单,有人退出聊天室,成员列表会自动除名。
服务器端同时也提供了成员之间的私聊功能,此时服务器端作为一个转发站,进行消息的转发。
整个程序的主体使用了CSocket类的方法,实现了网络通讯聊天。
整个程序设计为两个部分:服务器(ChatServer)和客户端(Chat)多人聊天的关键在于要将每个客户端发送过来的消息分发给所有其他客户端,为了解决这个问题,在服务器程序中建立一个套接口链表,用来保存所有与客户端建立了连接的服务端口.下面描述了多人聊天的实现原理:当客户端Client N向对应的服务端口N发送了消息Message,服务端口N将Message 复制给所有套接口列表(USERLIST)中的套接口缓冲区,然后向每个服务端口发送WRITE 消息,使每个服务端口将Message发送给对应的客户端。
计算机网络聊天室课程设计

《计算机网络》课程设计报告设计题目:聊天室同组人姓名:王巍瑾马志超周旭同组人学号:201515151052015151510420151515138专业班级:计科153指导教师:金松林日期:2017年6月12日—16日一、题目意义和需求分析1.题目意义即时通讯或在线聊天是目前Internet上最为流行的通讯方式,用户之间通过文字传输信息。
这是一种可以让使用者在网络上建立私人聊天室的实时通讯服务。
除了简单的文字信息,使用者之间还可以互相发送文件、文档、音乐、视频等文件。
只要与服务器链接,无论对方在天涯海角,双方隔得多远都没有问题。
消息的实时更新,拉近了我们相知的桥梁,文件的相互传输,使同事之间办公更方便快捷。
2.需求分析a.注册当选择注册时,创建一个File文件类,载入“user.txt”,判断用户名是否已经存在,用户名有效后写入“user.txt”。
b.登录去“user.txt”读取用户数据,验证用户名是否存在,验证用户密码是否正确,如果以上验证全部正确,返回客户端信息,提示登陆成功进入聊天界面。
c.聊天所有已登录的用户的名称都会在列表中显示,然后就可以选择其中一个或多个发起聊天。
接收用户聊天信息,当用户发送聊天信息时,服务端将会收到客户端用Socket 传输过来的聊天信息对象,然后将其转换为Message对象,返回聊天信息,然后系统从Message中提取消息类型,再根据类型将消息转化后通过Socket转发到相应的用户。
d.文件传输在聊天的基础上增加了一个文件传输功能。
同事之间办公难免有一些资料的来往,在登录列表中选择一个用户或多个用户发送文件,等对方确认接收后即可建立连接进行文件传输。
二、设计说明聊天室总体分为三个模块,主要包括注册登录,聊天模块,文件传输模块。
系统运行在java环境中,要求java环境为JDK 1.8+;设计中的重点是通过Java中的ServerSocket搭建TCP服务器,通过在客户端创建Socket套接字连接服务器,然后通过ObjectOutputStream来发送Message(数据消息的封装类)对象让服务器接受。
网络聊天室的设计与实现

网络聊天室的设计与实现一、引言二、设计需求1.用户注册和登录功能:用户可以通过注册账号并登录使用聊天室。
2.群聊功能:用户可以进入特定的聊天室,与其他用户进行群聊。
3.私聊功能:用户可以选择与其他用户进行私聊。
4.用户管理功能:管理员可以对用户进行管理,包括禁言、踢出聊天室等操作。
5.聊天记录保存功能:聊天室需要能够保存聊天记录,以便用户可以查看历史消息。
三、系统架构设计聊天室系统主要由服务器端和客户端组成。
1.服务器端架构设计服务器端负责接收和处理客户端发送的请求,并将数据发送给其他客户端。
其主要功能包括用户身份验证、消息转发、聊天记录保存等。
服务器端需要支持多客户端同时连接的功能,因此可以采用多线程或异步IO的方式处理客户端请求。
采用多线程的方式可以为每个客户端分配一个线程负责处理请求,而采用异步IO的方式可以利用事件循环机制来处理多个客户端的请求。
2.客户端架构设计客户端主要负责用户界面和与服务器端的交互。
用户界面可以采用图形界面或命令行界面,用户可以通过界面进行注册、登录、进入聊天室、发送消息等操作。
客户端需要与服务器端建立Socket连接,通过发送请求给服务器端并接收服务器端返回的数据来实现与服务器端的交互。
客户端可以使用多线程或异步IO的方式处理与服务器端的交互,以避免界面卡顿。
1.用户注册和登录功能的实现用户注册和登录功能可以通过数据库来实现。
用户注册时,需要将用户名和密码保存到数据库中;用户登录时,需要通过用户名和密码来验证用户身份,并返回登录结果给客户端。
2.群聊功能的实现群聊功能可以通过服务器端将消息发送给所有连接的客户端来实现。
服务器端维护一个群聊消息队列,当接收到一条群聊消息时,将消息添加到消息队列中,并通知所有客户端有新消息到来。
客户端收到新消息后,将消息显示在聊天界面上。
3.私聊功能的实现私聊功能可以通过服务器端将消息发送给指定的客户端来实现。
服务器端维护一个映射表,将每个用户与其对应的客户端关联起来。
聊天室系统设计报告

聊天室系统设计报告青岛科技大学操作系统课程设计学生班级计算机132班学生学号1308010204学生姓名王永远2016 5 18______年 ___月 ___日设计题目:聊天室系统一、设计目的及要求1.1设计目的通过该聊天室系统,掌握网络编程的概念及基于网络的C/S模式软件系统开发,掌握基于TCP协议的Socket编程,掌握Java的多线程机制。
1.2设计要求:实现多个用户之间类似于QQ的聊天程序,有聊天界面,多用户之间既可以实现群聊,也可以单独聊天。
二、技术背景2.1网络编程就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换。
2.2网络通信(1)IP地址:网络中设备的标识,不易记忆,可用主机名要想让网络中的计算机能够互相通信,必须为每台计算机指定一个标识号,通过这个标识号来指定要接受数据的计算机和识别发送的计算机,在TCP/IP协议中,这个标识号就是IP地址。
(2)端口号:用于标识进程的逻辑地址物理端口网卡口逻辑端口我们指的就是逻辑端口A:每个网络程序都会至少有一个逻辑端口B:用于标识进程的逻辑地址,不同进程的标识C:有效端口:0~65535,其中0~1024系统使用或保留端口。
(3)传输协议:通信的规则,常见的有UDP,TCP UDP:将数据源和目的封装成数据包中,不需要建立连接;每个数据报的大小在限制在64k;因无连接,是不可靠协议;不需要建立连接,速度快。
TCP:建立连接,形成传输数据的通道;在连接中进行大数据量传输;通过三次握手完成连接,是可靠协议;必须建立连接,效率会稍低。
2.3 Socket(1)Socket套接字网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
(2)Socket原理机制A:通信的两端都有Socket。
B:网络通信其实就是Socket间的通信。
C:数据在两个Socket间通过IO传输。
2.4 TCP传输(1)客户端思路A建立客户端的Socket服务,并明确要连接的服务器。
计算机网络课程设计(简单聊天程序的实现)

编号:计算机网络课程设计说明书题目:本地计算机网络信息管理系别:计算机科学与技术专业:计算机科学与技术学生姓名: xxx学号: ***********指导教师: xx2011年 3 月 18 日摘要本机网络信息管理器提供了有关计算机性能的信息,并显示了计算机上主要设备信息;如果连接到网络,那么还可以查看网络状态并迅速了解网络是如何工作的。
它的用户界面提供了设置网络信息的选项,其下还有具体的内容设置,而且这里可以查看到当前系统的CPU使用比率、内存等数据,默认设置下系统每隔两秒钟对数据进行1次自动更新。
目录1.绪论 (01)1.1 IP/TCP协议常识 (08)1.2 Socket的简介 (09)2.规划设计 (11)2.1 课题来源 (11)2.2 需求分析 (11)3.系统分析与设计方案 (12)3.1 聊天系统的总体设计要点 (12)3.2 聊天系统的设计步骤及功能模块划分 (12)3.3 功能模块结构图 (13)4.系统设计环境与测试 (26)4.1 开发环境和工具 (26)4.2 硬件环境 (26)4.3 聊天系统的测试 (26)5.课程设计总结 (28)5.1 课程设计总结 (28)5.2 经验和感想 (28)参考文献 (31)1绪论随着互联网逐步普及,人们的生活和工作也越来越离不开信息网络的支持,而聊天室是人们最常见,最直接的网上交流的方式。
本信息管理系统以网络设置为主,为广大用户提供一个简洁的、方便的网络设置方式,也是使网络设置更简单,更适用于对电脑了解不多的用户。
本文所介绍的网络信息管理系统是基于开放的C#应用程序开发设计的,其主要特性是能动态、实时的完成信息的传递,且具有高效的交互性,更有效的反映本机的网络设置状况,易于维护和更新,其运行所需环境及其工作流程和各个功能控件的工作原理将在本文依次介绍,并且文中提供了部分程序源代码。
1.1 IP/TCP协议常识(1)IP、TCP协议的特点:TCP/IP(Transmission Control Protocol/Internet Protocol)是传输控制协议/网际协议的缩写, TCP/IP是当今网络互联的核心协议。
c网络聊天室课程设计

c 网络聊天室课程设计一、教学目标本课程旨在让学生了解网络聊天室的基本原理和功能,掌握C语言在网络编程中的应用,培养学生具备网络编程的基本能力和解决实际问题的能力。
具体目标如下:1.知识目标:(1)了解网络聊天室的基本概念和原理;(2)掌握C语言在网络编程中的基本方法;(3)理解网络编程中的Socket编程和TCP/IP协议。
2.技能目标:(1)能够使用C语言编写简单的网络聊天室程序;(2)能够分析和解决网络编程中的基本问题;(3)能够运用所学知识,独立完成网络编程项目。
3.情感态度价值观目标:(1)培养学生对网络编程的兴趣和热情;(2)培养学生团队协作和自主学习的能力;(3)培养学生具备良好的网络编程道德和法律法规意识。
二、教学内容本课程的教学内容主要包括以下几个部分:1.网络聊天室的基本概念和原理:介绍网络聊天室的定义、功能和应用场景。
2.C语言在网络编程中的应用:讲解C语言在网络编程中的基本方法,如Socket编程、TCP/IP协议等。
3.网络编程实践:通过案例教学,让学生动手编写网络聊天室程序,培养实际操作能力。
4.项目实践:学生分组完成网络编程项目,提高团队协作和解决实际问题的能力。
三、教学方法为了提高教学效果,本课程将采用以下教学方法:1.讲授法:讲解网络聊天室的基本概念、原理和方法。
2.案例分析法:分析典型网络聊天室程序,让学生了解实际应用。
3.实验法:让学生动手编写网络聊天室程序,培养实际操作能力。
4.讨论法:分组讨论项目实践中的问题,提高团队协作和解决问题的能力。
四、教学资源为了支持教学内容和教学方法的实施,我们将准备以下教学资源:1.教材:《C语言网络编程教程》等。
2.参考书:《网络编程技术手册》、《TCP/IP协议详解》等。
3.多媒体资料:网络聊天室程序示例、教学视频等。
4.实验设备:计算机、网络设备等。
五、教学评估本课程的教学评估将采用多元化的评价方式,全面客观地评价学生的学习成果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告||实验名称网络聊天室的实现课程名称计算机操作系统||目录【1】设计原理———————————————————————4【2】程序流程图——————————————————————9【3】设计步骤———————————————————————10【4】使用方法说明—————————————————————21【5】实验结果及分析————————————————————24设计原理计算机网络技术发展至今已经大大超越了人们当初的预想,无论是人们日常的工作还是学习,我们都越来越多的依靠到互联网。
各种实时性的聊天娱乐软件也同时诞生,而且为我们的即时通讯带来了众多的方便,比如说大家所熟知的腾讯QQ、微软的MSN、移动的Fetion等,都是做的比较成功的实时聊天工具。
随着网络的日益普及,各种聊天工具也层出不穷,接下来的课程设计就是针对一个简单的网络聊天程序,利用MFC为开发工具,实现基本的通讯功能。
此程序主要分为两部分:服务器端和客户端。
服务器端用于提供一个网络端口,等待客户端发出请求,登录到此服务端,然后进行网络通讯和消息的转发;客户端可通过服务器端的IP地址发送连接请求,然后登陆聊天室。
在服务器端的成员列表栏中会显示在线的所有人名单,有人退出聊天室,成员列表会自动除名。
服务器端同时也提供了成员之间的私聊功能,此时服务器端作为一个转发站,进行消息的转发。
整个程序的主体使用了CSocket 类的方法,实现了网络通讯聊天。
整个程序设计为两个部分:服务器(ChatServer)和客户端(Chat)多人聊天的关键在于要将每个客户端发送过来的消息分发给所有其他客户端,为了解决这个问题,在服务器程序中建立一个套接口链表,用来保存所有与客户端建立了连接的服务端口。
下面描述了多人聊天的实现原理:当客户端Client N向对应的服务端口N发送了消息Message,服务端口N将Message 复制给所有套接口列表(USERLIST)中的套接口缓冲区,然后向每个服务端口发送WRITE 消息,使每个服务端口将Message发送给对应的客户端。
这样,所有客户端就都获得了Message消息,实现了多人聊天功能。
BOOL CClientSocketList::Sends(char *buff,int n){CClientSocket *curr=Head;while (curr){curr->Send(buff,n);curr=curr->Next;}return true;}USERLIST表时多人聊天程序的核心,它是一个动态变化的链表,为空表示没有客户端建立了连接,不为空时每个元素就代表有一个客户端与服务器建立了连接。
以下程序是私聊功能的实现:BOOL CClientSocketList::OnlySend(char *buff,int n,int who){CClientSocket *curr=Head;while (curr && who>0){curr=curr->Next;who--;}curr->Send(buff,n);return true;}以下是此程序的效果截图:服务器端的效果截图用户“yq”的登录界面用户“zxl”的登录界面功能描述1、多人会话。
此程序分为服务器端和客户端,当客户端要进入聊天室的时候,就必须通过网络连接到服务端,以实现和其它客户端的通讯功能。
其中最简单的一种通讯方式就是多人会话,运用多线程同时对多个用户的信息进行监听,服务器通过转发消息,让所有人都可以得到消息,实现多人会话。
2、一对一会话。
此程序的服务器端除了能够提供多人会话的功能外,还提供了私人聊天功能,可以实现一对一的聊天。
就是在消息转发的时候,私聊的消息只发给私聊的对象,而其他人看不到此消息,但是此消息会通过服务器端转发,然后再到达目的客户端。
3、个性化的昵称。
为了区别用户,此程序还允许用户可以自定义个性化的昵称。
在用户登录的时候,用户可以为自己设定一个昵称,以便在多人会话的时候作为身份识别。
同时服务器端也会以此昵称作为客户端的登录身份,服务器管理员,同样也显示在其他用户的在线列表栏中。
4、服务器登陆。
服务器端开启之后处于监听状态,多线程工作,接受每一个用户的连接请求。
而客户端只需输入服务器端的IP地址即可,端口在服务器端自动生成。
操作系统关键字:进程间通信;同步互斥;多线程操作设计步骤:本聊天程序实现工具为Visual C++ 6.0 MFC ,主要利用其中用于网络编程的CSocket 类实现网络通讯功能。
主要程序分为两部分:1、服务器端,界面如下图所示:主要代码如下所示:(1)、CChatRoomServerDlg函数用来对服务器端进行初始化void CChatServerDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;dc.DrawIcon(x, y, m_hIcon);}{CDialog::OnPaint();}}HCURSOR CChatServerDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}//开始服务器按钮void CChatServerDlg::OnButtonStart(){m_IDC_BUTTON_START.EnableWindow(FALSE);//让开启按钮失效if (!ListenSocket.Create(6400))//绑定端口{AfxMessageBox("绑定端口失败!");}if (!ListenSocket.Listen())//服务器侦听{AfxMessageBox("侦听失败!");}AfxMessageBox("服务器开启成功!");CString tTmep;tTmep="系统消息:服务器已开启成功!";m_ChatList.AddString(tTmep);m_IDC_BUTTON_STOP.EnableWindow(TRUE);//恢复停止按钮} void CChatServerDlg::OnButtonStop(){m_IDC_BUTTON_STOP.EnableWindow(FALSE);char s[30]="聊天服务器停止工作了!!";SL.Sends(s,30);//广播聊天服务器停止消息CClientSocket *p=SL.Head;while (p){p->Close();SL.Del(p);//释放链表中的套接字p=SL.Head;}ListenSocket.Close();m_USER.ResetContent();//清楚服务器在线用户列表m_IDC_BUTTON_START.EnableWindow(TRUE);}void CChaServerDlg::OnButtonSend()char message[1000];UpdateData(TRUE);if (m_IDC_BUTTON_MESSAGE==""){MessageBox("请输入消息!!","提示",MB_OK);}else{m_IDC_BUTTON_MESSAGE="服务器端说:"+m_IDC_BUTTON_MESSAGE;n=m_IDC_BUTTON_MESSAGE.GetLength();sprintf(message,"%s",m_IDC_BUTTON_MESSAGE.GetBuffer(n));message[n]=0;SL.Sends(message,1000);}m_IDC_BUTTON_MESSAGE="";UpdateData(FALSE);}(2)、CClientSocket函数用于管理用户列表及会话void CClientSocket::OnReceive(int nErrorCode){char buff[1000];char all_user[2000];char name[20];int n;int m;n=this->Receive(buff,1000);buff[n]=0;char Flag[10];for (int i=0;i<8;i++){Flag[i]=buff[i];}Flag[8]=0;CChatRoomServerApp *pApp=(CChatRoomServerApp*)AfxGetApp();CChatRoomServerDlg *pDlg=(CChatRoomServerDlg*)pApp->m_pMainWnd;if (strcmp(Flag,"NEW_USER")==0){CString sTemp;for (i=9;buff[i]!=0;i++){buff[i-9]=buff[i];}buff[i-9]=0;sTemp.Format("%s",buff);pDlg->m_USER.AddString(sTemp);m=pDlg->m_USER.GetCount();strcpy(all_user,"USERLIST");for (i=0;i<m;i++){pDlg->m_USER.GetText(i,name);strcat(all_user,name);strcat(all_user,"|");}strcat(buff,"进入聊天室");List->Sends(all_user,strlen(all_user));} else{if (strcmp(Flag,"CLOSEUSE")==0){CString sTemp;for (i=9;buff[i]!=0;i++){buff[i-9]=buff[i];}buff[i-9]=0;sTemp.Format("%s",buff);//离线用户昵称m=pDlg->m_USER.GetCount();for (i=0;i<m;i++){pDlg->m_USER.GetText(i,name);if (strcmp(name,buff)==0){pDlg->m_USER.DeleteString(i);}//将新的在线用户昵称名单发给所有用户m=pDlg->m_USER.GetCount();strcpy(all_user,"USERLIST");for (i=0;i<m;i++){pDlg->m_USER.GetText(i,name);strcat(all_user,name);strcat(all_user,"|");strcat(buff,"离开聊天室!");List->Sends(all_user,strlen(all_user));List->Del(this);}else if (strcmp(Flag,"PrivChat")==0)//私聊{CString sTemp;for (i=9;buff[i]!='|';i++){buff[i-9]=buff[i];}buff[i-9]=0;sTemp.Format("%s",buff);for (int k=i+1;buff[k]!=0;k++){buff[k-i-1]=buff[k];}buff[k-i-1]=0;m=pDlg->m_USER.GetCount();for (i=0;i<m;i++){pDlg->m_USER.GetText(i,name);if (strcmp(name,sTemp)==0){List->OnlySend(buff,strlen(buff),i);}}}else{List->Sends(buff,n);//将聊天信息群发给所有用户} }CString sTemp;sTemp.Format("收到:%s",buff);pDlg->m_ChatList.AddString(sTemp);pDlg->m_ChatList.SetTopIndex(pDlg->m_ChatList.GetCount()-1);CSocket::OnReceive(nErrorCode);}(3)、一下代码用于设定用户的多人会话与一对一会话BOOL CClientSocketList::Add(CClientSocket *add){CClientSocket *tmp=Head;if (!Head){Head=add;return false;}while (tmp->Next){tmp=tmp->Next;}tmp->Next=add;return true;}//从链表队列中删除SocketBOOL CClientSocketList::Del(CClientSocket *d){CClientSocket *p1=Head;CClientSocket *p2;if (!Head){return false;}if (Head==d){Head=p1->Next;p1->Close();delete p1;return true;}for (;p1->Next!=NULL;p1=p1->Next){if (p1->Next==d){p2=p1->Next;p1->Next=p2->Next;p2->Close();delete p2;return true;}}return false;}//向所有用户发送消息BOOL CClientSocketList::Sends(char *buff,int n){CClientSocket *curr=Head;while (curr){curr->Send(buff,n);curr=curr->Next;}return true;}//仅仅向私聊用户who发送信息BOOL CClientSocketList::OnlySend(char *buff,int n,int who) {CClientSocket *curr=Head;while (curr && who>0){curr=curr->Next;who--;}curr->Send(buff,n);return true;}1、客户端,截图如下所示:主要代码:void CChatDlg::OnConnectButton() //连接聊天室服务器{// TODO: Add your control notification handler code here UpdateData(TRUE);char *nikename;char *address;int n;if (!myServerSocket->Create()){myServerSocket->Close();AfxMessageBox("网络创建错误!!");return;}n=m_IDC_EDIT_ADDRESS.GetLength();address=new char(n+1);sprintf(address,"%s",m_IDC_EDIT_ADDRESS.GetBuffer(n));address[n]=0;n=m_IDC_EDIT_NIKENAME.GetLength();nikename=new char(n+1);sprintf(nikename,"%s",m_IDC_EDIT_NIKENAME.GetBuffer(n));nikename[n]=0;if (!myServerSocket->Connect(address,6767)){myServerSocket->Close();AfxMessageBox("网络连接错误,请检查服务器地址。