日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【通信协议及编码】实验3:MFC框架下聊天室客户机与服务器程序

發布時間:2024/1/18 编程问答 66 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【通信协议及编码】实验3:MFC框架下聊天室客户机与服务器程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、實驗目的
  • 二、實驗環境
  • 三、實驗內容


一、實驗目的

  • 掌握MFC套接字編程方法
  • 借助VS2016的MFC應用程序向導創建程序框架;
  • 從CSocket類派生用戶自定義的套接字類;
  • 通過CArchive類、CSocketFile類、CSocket類實現網絡數據交換。
  • 二、實驗環境

  • 操作系統:WINDOWS 7及以上
  • 開發工具:Microsoft VisualBasic6.0
  • 實驗設備:PC
  • 三、實驗內容

    ??MFC框架下設計一個聊天室服務器和多個聊天室客戶機,實現多客戶機并發的群聊功能,在服務器端需要用鏈表動態管理與客戶機連接的套接字,實時更新服務器和客戶機群的界面顯示,其基本功能如下:
    ??1.要求服務器能與多個客戶機建立連接,同時為多個客戶機服務。

    ??2.服務器相當于聊天室大廳,它發布所有客戶機的發言,并將客戶機發言轉發給其他客戶機,從而間接實現客戶機之間的通信。

    ??3.服務器動態統計進入聊天室的客戶機數目,當有新客戶機加入或退出時,試試更新在線客戶數量。

    客戶機
    Client.h:

    // Client.h : PROJECT_NAME 應用程序的主頭文件 #pragma once #ifndef __AFXWIN_H__ #error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件" #endif #include "resource.h" // 主符號 class CClientApp : public CWinApp { public:CClientApp(); public:virtual BOOL InitInstance();DECLARE_MESSAGE_MAP() }; extern CClientApp theApp;

    Client.cpp:

    // Client.cpp : 定義應用程序的類行為。 //#include "stdafx.h" #include "Client.h" #include "ClientDlg.h"#ifdef _DEBUG #define new DEBUG_NEW #endif// CClientAppBEGIN_MESSAGE_MAP(CClientApp, CWinApp)ON_COMMAND(ID_HELP, &CWinApp::OnHelp) END_MESSAGE_MAP()// CClientApp 構造CClientApp::CClientApp() {// 支持重新啟動管理器m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;// TODO: 在此處添加構造代碼,// 將所有重要的初始化放置在 InitInstance 中 }// 唯一的一個 CClientApp 對象CClientApp theApp;// CClientApp 初始化BOOL CClientApp::InitInstance() {// 如果一個運行在 Windows XP 上的應用程序清單指定要// 使用 ComCtl32.dll 版本 6 或更高版本來啟用可視化方式,//則需要 InitCommonControlsEx()。否則,將無法創建窗口。INITCOMMONCONTROLSEX InitCtrls;InitCtrls.dwSize = sizeof(InitCtrls);// 將它設置為包括所有要在應用程序中使用的// 公共控件類。InitCtrls.dwICC = ICC_WIN95_CLASSES;InitCommonControlsEx(&InitCtrls);CWinApp::InitInstance();if (!AfxSocketInit()){AfxMessageBox(IDP_SOCKETS_INIT_FAILED);return FALSE;}AfxEnableControlContainer();// 創建 shell 管理器,以防對話框包含// 任何 shell 樹視圖控件或 shell 列表視圖控件。CShellManager *pShellManager = new CShellManager;// 激活“Windows Native”視覺管理器,以便在 MFC 控件中啟用主題CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));// 標準初始化// 如果未使用這些功能并希望減小// 最終可執行文件的大小,則應移除下列// 不需要的特定初始化例程// 更改用于存儲設置的注冊表項// TODO: 應適當修改該字符串,// 例如修改為公司或組織名SetRegistryKey(_T("應用程序向導生成的本地應用程序"));CClientDlg dlg;m_pMainWnd = &dlg;INT_PTR nResponse = dlg.DoModal();if (nResponse == IDOK){// TODO: 在此放置處理何時用// “確定”來關閉對話框的代碼}else if (nResponse == IDCANCEL){// TODO: 在此放置處理何時用// “取消”來關閉對話框的代碼}else if (nResponse == -1){TRACE(traceAppMsg, 0, "警告: 對話框創建失敗,應用程序將意外終止。\n");TRACE(traceAppMsg, 0, "警告: 如果您在對話框上使用 MFC 控件,則無法 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS。\n");}// 刪除上面創建的 shell 管理器。if (pShellManager != NULL){delete pShellManager;}// 由于對話框已關閉,所以將返回 FALSE 以便退出應用程序,// 而不是啟動應用程序的消息泵。return FALSE; }

    ClientDlg.h:

    // ClientDlg.h : 頭文件 //#pragma once #include "ClientSocket.h" //手動添加包含語句// CClientDlg 對話框 class CClientDlg : public CDialogEx { public:CClientDlg(CWnd* pParent = NULL); // 標準構造函數// 對話框數據enum { IDD = IDD_CLIENT_DIALOG }; protected:virtual void DoDataExchange(CDataExchange* pDX); protected:HICON m_hIcon;// 生成的消息映射函數virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP() public://以下代碼通過類向導添加CString m_strServerName;int m_nServerPort;CString m_strSpeaking;CString m_strUserName;CListBox m_listCRoom;afx_msg void OnClickedButtonLogin();afx_msg void OnClickedButtonLogout();afx_msg void OnClickedButtonSpeak();afx_msg void OnDestroy();CClientSocket* m_pSocket;CSocketFile* m_pFile;CArchive* m_pArchiveIn;CArchive* m_pArchiveOut;void onReceive(void);void ReceiveMessage(void);void SendMyMessage(CString& strMessage,BOOL bClosed); };

    ClientDlg.cpp:

    // ClientDlg.cpp : 實現文件 //#include "stdafx.h" #include "Client.h" #include "ClientDlg.h" #include "afxdialogex.h" #include "ClientSocket.h"//手動添加包含語句 #include "Message.h"// 用于應用程序“關于”菜單項的 CAboutDlg 對話框 class CAboutDlg : public CDialogEx { public:CAboutDlg();// 對話框數據enum { IDD = IDD_ABOUTBOX }; protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 protected:DECLARE_MESSAGE_MAP() };CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) {}void CAboutDlg::DoDataExchange(CDataExchange* pDX) {CDialogEx::DoDataExchange(pDX); }BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP()// CClientDlg 對話框 CClientDlg::CClientDlg(CWnd* pParent /*=NULL*/): CDialogEx(CClientDlg::IDD, pParent) {m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);//類向導自動添加的初始化代碼m_strServerName = _T("");m_nServerPort = 0;m_strSpeaking = _T("");m_strUserName = _T("");//手動添加的初始化代碼m_pSocket=NULL;m_pFile=NULL;m_pArchiveIn=NULL;m_pArchiveOut=NULL; }void CClientDlg::DoDataExchange(CDataExchange* pDX) {CDialogEx::DoDataExchange(pDX);DDX_Text(pDX, IDC_EDIT_SERVERNAME, m_strServerName);DDX_Text(pDX, IDC_EDIT_SERVERPORT, m_nServerPort);DDV_MinMaxInt(pDX, m_nServerPort, 1024, 49151);DDX_Text(pDX, IDC_EDIT_SPEAKING, m_strSpeaking);DDX_Text(pDX, IDC_EDIT_USERNAME, m_strUserName);DDX_Control(pDX, IDC_LIST_CROOM, m_listCRoom); }BEGIN_MESSAGE_MAP(CClientDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON_LOGIN, &CClientDlg::OnClickedButtonLogin)ON_BN_CLICKED(IDC_BUTTON_LOGOUT, &CClientDlg::OnClickedButtonLogout)ON_BN_CLICKED(IDC_BUTTON_SPEAK, &CClientDlg::OnClickedButtonSpeak)ON_WM_DESTROY() END_MESSAGE_MAP()// CClientDlg 消息處理程序 BOOL CClientDlg::OnInitDialog() {CDialogEx::OnInitDialog();// 將“關于...”菜單項添加到系統菜單中。// IDM_ABOUTBOX 必須在系統命令范圍內。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 設置此對話框的圖標。當應用程序主窗口不是對話框時,框架將自動執行此操作SetIcon(m_hIcon, TRUE); // 設置大圖標SetIcon(m_hIcon, FALSE); // 設置小圖標// TODO: 在此添加額外的初始化代碼//手動添加如下初始化代碼:m_strUserName=_T("I024Ha");m_strServerName=_T("localhost");m_nServerPort=8888;UpdateData(FALSE);//更新對應控件數據GetDlgItem(IDC_EDIT_SPEAKING)->EnableWindow(FALSE);GetDlgItem(IDC_BUTTON_LOGOUT)->EnableWindow(FALSE);GetDlgItem(IDC_BUTTON_SPEAK)->EnableWindow(FALSE);return TRUE; // 除非將焦點設置到控件,否則返回 TRUE }void CClientDlg::OnSysCommand(UINT nID, LPARAM lParam) {if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID, lParam);} }// 如果向對話框添加最小化按鈕,則需要下面的代碼 // 來繪制該圖標。對于使用文檔/視圖模型的 MFC 應用程序, // 這將由框架自動完成。 void CClientDlg::OnPaint() {if (IsIconic()){CPaintDC dc(this); // 用于繪制的設備上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<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);}else{CDialogEx::OnPaint();} }//當用戶拖動最小化窗口時系統調用此函數取得光標顯示。 HCURSOR CClientDlg::OnQueryDragIcon() {return static_cast<HCURSOR>(m_hIcon); } //以下所有函數的框架由類向導生成,其實現代碼需要手動添加 void CClientDlg::OnClickedButtonLogin() {// TODO: 在此添加控件通知處理程序代碼m_pSocket=new CClientSocket(this);//創建套接字if (!m_pSocket->Create()){//錯誤處理delete m_pSocket;m_pSocket=NULL;AfxMessageBox(_T("創建連接服務器的套接字錯誤,登錄失敗!"));return;}if (!m_pSocket->Connect(m_strServerName,m_nServerPort)){//錯誤處理delete m_pSocket;m_pSocket=NULL;AfxMessageBox(_T("連接服務器錯誤,登錄失敗!"));return;}m_pFile=new CSocketFile(m_pSocket);m_pArchiveIn=new CArchive(m_pFile,CArchive::load);m_pArchiveOut=new CArchive(m_pFile,CArchive::store);//向服務器發送消息,表明新客戶進入聊天室UpdateData(TRUE);//更新控件成員變量CString strTemp;strTemp=m_strUserName+_T(":昂首挺胸進入聊天室!!!");SendMyMessage(strTemp,FALSE);GetDlgItem(IDC_EDIT_SPEAKING)->EnableWindow(TRUE);GetDlgItem(IDC_BUTTON_LOGOUT)->EnableWindow(TRUE);GetDlgItem(IDC_BUTTON_SPEAK)->EnableWindow(TRUE);GetDlgItem(IDC_EDIT_USERNAME)->EnableWindow(FALSE);GetDlgItem(IDC_EDIT_SERVERNAME)->EnableWindow(FALSE);GetDlgItem(IDC_EDIT_SERVERPORT)->EnableWindow(FALSE);GetDlgItem(IDC_BUTTON_LOGIN)->EnableWindow(FALSE);} //單擊退出按鈕的響應函數 void CClientDlg::OnClickedButtonLogout() {// TODO: 在此添加控件通知處理程序代碼CString strTemp;strTemp=m_strUserName+_T(":大步流星離開聊天室......");SendMyMessage(strTemp,TRUE);//刪除對象,釋放空間delete m_pArchiveIn;delete m_pArchiveOut;delete m_pFile;delete m_pSocket;m_pArchiveIn=NULL;m_pArchiveOut=NULL;m_pFile=NULL;m_pSocket=NULL;//清除聊天室內容while (m_listCRoom.GetCount()!=0) m_listCRoom.DeleteString(0);GetDlgItem(IDC_EDIT_SPEAKING)->EnableWindow(FALSE);GetDlgItem(IDC_BUTTON_LOGOUT)->EnableWindow(FALSE);GetDlgItem(IDC_BUTTON_SPEAK)->EnableWindow(FALSE);GetDlgItem(IDC_EDIT_USERNAME)->EnableWindow(TRUE);GetDlgItem(IDC_EDIT_SERVERNAME)->EnableWindow(TRUE);GetDlgItem(IDC_EDIT_SERVERPORT)->EnableWindow(TRUE);GetDlgItem(IDC_BUTTON_LOGIN)->EnableWindow(TRUE); }//單擊發言按鈕的響應函數 void CClientDlg::OnClickedButtonSpeak() {// TODO: 在此添加控件通知處理程序代碼UpdateData(TRUE);//更新控件成員變量,取回用戶輸入的數據if (!m_strSpeaking.IsEmpty()) //發言輸入框不空{SendMyMessage(m_strUserName+"大聲說:"+m_strSpeaking,FALSE);m_strSpeaking=_T("");UpdateData(FALSE);//更新用戶界面,發言框清空} } //關閉客戶機時的善后處理函數 void CClientDlg::OnDestroy() {CDialogEx::OnDestroy();// TODO: 在此處添加消息處理程序代碼if ((m_pSocket!=NULL) && (m_pFile!=NULL) && (m_pArchiveOut!=NULL)){CMessage msg;CString strTemp;strTemp=_T("廣而告之:")+m_strUserName+_T("所在客戶機已關閉");msg.m_strMessage=strTemp;msg.m_bClosed=TRUE;msg.Serialize(*m_pArchiveOut);m_pArchiveOut->Flush();//刪除對象,釋放空間delete m_pArchiveIn;delete m_pArchiveOut;delete m_pFile;m_pArchiveIn=NULL;m_pArchiveOut=NULL;m_pFile=NULL;if (m_pSocket!=NULL){BYTE buffer[100];m_pSocket->ShutDown();while (m_pSocket->Receive(buffer,100)>0);}delete m_pSocket;m_pSocket=NULL;} } //當套接字收到FD_READ消息時,它的OnReceive函數調用此函數 void CClientDlg::onReceive(void) {do {ReceiveMessage();//接收消息if (m_pSocket==NULL) return;}while(!m_pArchiveIn->IsBufferEmpty()); } //接收消息處理函數 void CClientDlg::ReceiveMessage(void) {CMessage msg;TRY {msg.Serialize(*m_pArchiveIn);//接收m_listCRoom.AddString(msg.m_strMessage);//顯示在大廳}CATCH(CFileException, e) { CString strTemp;strTemp=_T("與服務器連接已斷開,連接關閉!");m_listCRoom.AddString(strTemp);msg.m_bClosed=TRUE;m_pArchiveOut->Abort();delete m_pArchiveIn;delete m_pArchiveOut;delete m_pFile;delete m_pSocket;m_pArchiveIn=NULL;m_pArchiveOut=NULL;m_pFile=NULL;m_pSocket=NULL;}END_CATCH }//發送消息的處理函數 void CClientDlg::SendMyMessage(CString& strMessage,BOOL bClosed) {if (m_pArchiveOut!=NULL) {CMessage msg;msg.m_strMessage=strMessage;msg.m_bClosed=bClosed;msg.Serialize(*m_pArchiveOut);m_pArchiveOut->Flush();} }

    ClientSocket.h:

    #pragma once class CClientDlg; //對話框類聲明,手動添加 class CClientSocket : public CSocket { public:CClientSocket(CClientDlg* pDlg);//為構造函數添加入口參數,手動添加virtual ~CClientSocket();//下面兩行由類向導生成CClientDlg* m_pDlg;//成員變量virtual void OnReceive(int nErrorCode); };

    ClientSocket.cpp:

    // ClientSocket.cpp : 實現文件 #include "stdafx.h" #include "Client.h" #include "ClientSocket.h" #include "ClientDlg.h" //手動添加的包含語句 CClientSocket::CClientSocket(CClientDlg* pDlg) {m_pDlg=pDlg; } CClientSocket::~CClientSocket() {m_pDlg=NULL; } // CClientSocket 成員函數 //事件處理函數,當客戶端套接字收到FD_READ消息時,執行此函數 void CClientSocket::OnReceive(int nErrorCode) {// TODO: 在此添加專用代碼和/或調用基類CSocket::OnReceive(nErrorCode);//調用CClientDlg類的相應函數處理if (nErrorCode==0) m_pDlg->onReceive(); }

    Message.h:

    // CMessage定義 #pragma once class CMessage : public CObject { public:CMessage();virtual ~CMessage();CString m_strMessage;BOOL m_bClosed;virtual void Serialize(CArchive& ar); };

    Message.cpp:

    // Message.cpp : 實現文件 #include "stdafx.h" #include "Client.h" #include "Message.h" CMessage::CMessage() {m_strMessage = _T("");m_bClosed=FALSE; } CMessage::~CMessage() {} // CMessage 成員函數 void CMessage::Serialize(CArchive& ar) {if (ar.IsStoring()){ // 發送數據ar<<(WORD)m_bClosed;ar<<m_strMessage;}else{ // 接收數據WORD wd;ar>>wd;m_bClosed=(BOOL)wd;ar>>m_strMessage;} }

    服務器
    CClientSocket.h:

    // CClientSocket定義 #pragma once class CServerDlg; class CMessage;class CClientSocket : public CSocket { public:CClientSocket(CServerDlg* pDlg);//為構造函數增加入口參數virtual ~CClientSocket();//重載回調函數,套接字收到數據時,自動調用此函數virtual void OnReceive(int nErrorCode);CServerDlg* m_pDlg;//定義指向主對話框類的指針CSocketFile* m_pFile; //定義指向CSocketFile對象的指針CArchive* m_pArchiveIn;//定義指向輸入CArchive對象的指針CArchive* m_pArchiveOut;//定義指向輸出CArchive對象的指針void SendMessage(CMessage* pMsg);//發送消息void ReceiveMessage(CMessage* pMsg);//接收消息void Init(void);//初始化 };

    ClientSocket.cpp:

    // ClientSocket.cpp : 實現文件 #include "stdafx.h" #include "Server.h" #include "ClientSocket.h" #include "ServerDlg.h" //手動添加包含語句 #include "Message.h" //手動添加包含語句 // CClientSocket CClientSocket::CClientSocket(CServerDlg* pDlg)//增加入口參數,手動添加 { //初始化成員變量,手動添加m_pDlg=pDlg;m_pFile=NULL;m_pArchiveIn=NULL;m_pArchiveOut=NULL; } CClientSocket::~CClientSocket() {//置空或釋放成員變量,手動添加m_pDlg=NULL;if (m_pFile!=NULL) delete m_pFile;if (m_pArchiveIn!=NULL) delete m_pArchiveIn;if (m_pArchiveOut!=NULL) delete m_pArchiveOut;m_pFile=NULL;m_pArchiveIn=NULL;m_pArchiveOut=NULL; } // CClientSocket 成員函數 //套接字收到數據時,自動調用此函數 void CClientSocket::OnReceive(int nErrorCode) {// TODO: 在此添加專用代碼和/或調用基類CSocket::OnReceive(nErrorCode);m_pDlg->onReceive(this);//調用主對話框中的處理函數,手動添加 } void CClientSocket::Init(void) { //手動添加初始化代碼m_pFile=new CSocketFile(this,TRUE);m_pArchiveIn=new CArchive(m_pFile,CArchive::load);m_pArchiveOut=new CArchive(m_pFile,CArchive::store); } //發送消息 void CClientSocket::SendMessage(CMessage* pMsg) {//手動添加if (m_pArchiveOut!=NULL){pMsg->Serialize(*m_pArchiveOut);m_pArchiveOut->Flush();} } //接收消息 void CClientSocket::ReceiveMessage(CMessage* pMsg) {pMsg->Serialize(*m_pArchiveIn); }

    Message.h:

    // CMessage定義 #pragma once class CMessage : public CObject { public:CMessage();virtual ~CMessage();CString m_strMessage;//字符串消息BOOL m_bClosed;//是否關閉virtual void Serialize(CArchive& ar);//重載基類序列化函數 };

    Message.cpp:

    // Message.cpp : 實現文件 #include "stdafx.h" #include "Server.h" #include "Message.h"CMessage::CMessage() {m_strMessage = _T("");//類向導自動添加m_bClosed=FALSE;//手動添加 } CMessage::~CMessage() {}// CMessage 成員函數 //類向導自動添加 void CMessage::Serialize(CArchive& ar) {if (ar.IsStoring()){ // 發送數據代碼,手動添加ar<<(WORD)m_bClosed;ar<<m_strMessage;}else{ // 接收數據代碼,手動添加WORD wd;ar>>wd;m_bClosed=(BOOL)wd;ar>>m_strMessage;} }

    Server.h:

    // Server.h : PROJECT_NAME 應用程序的主頭文件 #pragma once #ifndef __AFXWIN_H__ #error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件" #endif#include "resource.h" // 主符號 // CServerApp: // 有關此類的實現,請參閱 Server.cpp // class CServerApp : public CWinApp { public:CServerApp();// 重寫 public:virtual BOOL InitInstance();// 實現DECLARE_MESSAGE_MAP() }; extern CServerApp theApp;

    Server.cpp:

    // Server.cpp : 定義應用程序的類行為。 #include "stdafx.h" #include "Server.h" #include "ServerDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CServerApp BEGIN_MESSAGE_MAP(CServerApp, CWinApp)ON_COMMAND(ID_HELP, &CWinApp::OnHelp) END_MESSAGE_MAP() // CServerApp 構造 CServerApp::CServerApp() {// 支持重新啟動管理器m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;// TODO: 在此處添加構造代碼,// 將所有重要的初始化放置在 InitInstance 中 } // 唯一的一個 CServerApp 對象 CServerApp theApp; // CServerApp 初始化 BOOL CServerApp::InitInstance() {INITCOMMONCONTROLSEX InitCtrls;InitCtrls.dwSize = sizeof(InitCtrls);// 將它設置為包括所有要在應用程序中使用的// 公共控件類。InitCtrls.dwICC = ICC_WIN95_CLASSES;InitCommonControlsEx(&InitCtrls);CWinApp::InitInstance();if (!AfxSocketInit()){AfxMessageBox(IDP_SOCKETS_INIT_FAILED);return FALSE;}AfxEnableControlContainer();// 創建 shell 管理器,以防對話框包含// 任何 shell 樹視圖控件或 shell 列表視圖控件。CShellManager *pShellManager = new CShellManager;SetRegistryKey(_T("應用程序向導生成的本地應用程序"));CServerDlg dlg;m_pMainWnd = &dlg;INT_PTR nResponse = dlg.DoModal();if (nResponse == IDOK){// TODO: 在此放置處理何時用// “確定”來關閉對話框的代碼}else if (nResponse == IDCANCEL){// TODO: 在此放置處理何時用// “取消”來關閉對話框的代碼}// 刪除上面創建的 shell 管理器。if (pShellManager != NULL){delete pShellManager;}// 由于對話框已關閉,所以將返回 FALSE 以便退出應用程序,// 而不是啟動應用程序的消息泵。return FALSE; }

    ServerDlg.h:

    // ServerDlg.h : 頭文件 #pragma once #include "ServerSocket.h" #include "ClientSocket.h" class CMessage; // CServerDlg 對話框 class CServerDlg : public CDialogEx { public:CServerDlg(CWnd* pParent = NULL); // 標準構造函數// 對話框數據enum { IDD = IDD_SERVER_DIALOG }; protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 protected:HICON m_hIcon;// 生成的消息映射函數virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()//以下代碼通過類向導手動添加 public:int m_nServerPort;CListBox m_listSroom;CStatic m_staOnline;afx_msg void OnClickedButtonStart();afx_msg void OnClickedButtonStop();CServerSocket* m_pServerSocket;//偵聽套接字指針變量CPtrList m_ClientsList; //在線客戶機鏈表void onAccept(void);//處理客戶機連接請求,從CServerSocket類的OnAccept函數轉到此處執行void onReceive(CClientSocket* pSocket);//獲取客戶機發送的數據,從CClientSocket類的OnReceive函數轉到此處執行void sendToClients(CMessage* pMsg);//服務器向所有客戶機轉發消息 };

    ServerDlg.cpp:

    // ServerDlg.cpp : 實現文件 #include "stdafx.h" #include "Server.h" #include "ServerDlg.h" #include "afxdialogex.h" #include "Message.h" //手動添加包含語句 // 用于應用程序“關于”菜單項的 CAboutDlg 對話框 class CAboutDlg : public CDialogEx { public:CAboutDlg();// 對話框數據enum { IDD = IDD_ABOUTBOX }; protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 protected:DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) {} void CAboutDlg::DoDataExchange(CDataExchange* pDX) {CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP() // CServerDlg 對話框 CServerDlg::CServerDlg(CWnd* pParent /*=NULL*/): CDialogEx(CServerDlg::IDD, pParent) {m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);m_nServerPort = 0;//類向導添加的成員變量初始化代碼m_pServerSocket=NULL;//手動添加 } void CServerDlg::DoDataExchange(CDataExchange* pDX) {CDialogEx::DoDataExchange(pDX);DDX_Text(pDX, IDC_EDIT_SERVERPORT, m_nServerPort);DDV_MinMaxInt(pDX, m_nServerPort, 1024, 49151);DDX_Control(pDX, IDC_LIST_SROOM, m_listSroom);DDX_Control(pDX, IDC_STATIC_ONLINE, m_staOnline); } BEGIN_MESSAGE_MAP(CServerDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON_START, &CServerDlg::OnClickedButtonStart)ON_BN_CLICKED(IDC_BUTTON_STOP, &CServerDlg::OnClickedButtonStop) END_MESSAGE_MAP() // CServerDlg 消息處理程序 BOOL CServerDlg::OnInitDialog() {CDialogEx::OnInitDialog();// 將“關于...”菜單項添加到系統菜單中。// IDM_ABOUTBOX 必須在系統命令范圍內。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 設置此對話框的圖標。當應用程序主窗口不是對話框時,框架將自動執行此操作SetIcon(m_hIcon, TRUE); // 設置大圖標SetIcon(m_hIcon, FALSE); // 設置小圖標// TODO: 在此添加額外的初始化代碼m_nServerPort=8888;UpdateData(FALSE);//用成員變量值更新界面GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE);return TRUE; // 除非將焦點設置到控件,否則返回TRUE } void CServerDlg::OnSysCommand(UINT nID, LPARAM lParam) {if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID, lParam);} } void CServerDlg::OnPaint() {if (IsIconic()){CPaintDC dc(this); // 用于繪制的設備上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<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);}else{CDialogEx::OnPaint();} } //當用戶拖動最小化窗口時系統調用此函數取得光標顯示。 HCURSOR CServerDlg::OnQueryDragIcon() {return static_cast<HCURSOR>(m_hIcon); } //單擊啟動服務器按鈕的事件處理函數 void CServerDlg::OnClickedButtonStart() {// TODO: 在此添加控件通知處理程序代碼UpdateData(TRUE);//獲得用戶輸入給成員變量//創建服務器套接字對象,用于在指定端口偵聽m_pServerSocket=new CServerSocket(this);if (!m_pServerSocket->Create(m_nServerPort)){//錯誤處理delete m_pServerSocket;m_pServerSocket=NULL;AfxMessageBox(LPCTSTR("創建服務器偵聽套接字出現錯誤!"));return;}//啟動服務器偵聽套接字,可以隨時接收來自客戶機的請求if (!m_pServerSocket->Listen()){//錯誤處理delete m_pServerSocket;m_pServerSocket=NULL;AfxMessageBox(LPCTSTR("啟動服務器偵聽套接字出現錯誤!"));return;}GetDlgItem(IDC_EDIT_SERVERPORT)->EnableWindow(FALSE);GetDlgItem(IDC_BUTTON_START)->EnableWindow(FALSE);GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(TRUE); } //單擊停止服務器按鈕的事件處理函數 void CServerDlg::OnClickedButtonStop() {// TODO: 在此添加控件通知處理程序代碼CMessage msg;msg.m_strMessage="服務器已停止偵聽服務!";delete m_pServerSocket;//釋放服務器偵聽套接字m_pServerSocket=NULL;//清除客戶機鏈接列表while(!m_ClientsList.IsEmpty()){//向每一個客戶機發送"服務器已停止偵聽服務!"這個消息并從列表中刪除鏈接,釋放資源CClientSocket* pSocket=(CClientSocket*)m_ClientsList.RemoveHead();pSocket->SendMessage(&msg);delete pSocket;}//清除服務器聊天室大廳while(m_listSroom.GetCount()!=0)m_listSroom.DeleteString(0);GetDlgItem(IDC_EDIT_SERVERPORT)->EnableWindow(TRUE);GetDlgItem(IDC_BUTTON_START)->EnableWindow(TRUE);GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE); } //服務器處理來自客戶機的連接請求并在服務器端維護一個鏈接列表 void CServerDlg::onAccept(void) {//創建服務器端連接客戶機的套接字CClientSocket* pSocket=new CClientSocket(this);if (m_pServerSocket->Accept(*pSocket)){//建立客戶機連接,加入客戶機鏈接列表pSocket->Init();m_ClientsList.AddTail(pSocket);//更新在線人數CString strTemp;strTemp.Format(_T("當前在線人數:%d"),m_ClientsList.GetCount());m_staOnline.SetWindowTextW(strTemp);}else{delete pSocket;pSocket=NULL;} } //服務器處理來自客戶機的消息 void CServerDlg::onReceive(CClientSocket* pSocket) {static CMessage msg;do {pSocket->ReceiveMessage(&msg);//接收消息m_listSroom.AddString(msg.m_strMessage);//加入服務器列表框sendToClients(&msg);//轉發給所有客戶機//如果客戶機關閉,從鏈接列表刪除服務器端與之會話的鏈接套接字if (msg.m_bClosed){//pSocket->Close();POSITION pos,temp;for(pos=m_ClientsList.GetHeadPosition();pos!=NULL;){temp=pos;CClientSocket* pTempSocket=(CClientSocket*)m_ClientsList.GetNext(pos);if (pTempSocket==pSocket){m_ClientsList.RemoveAt(temp);CString strTemp;//更新在線人數strTemp.Format(_T("當前在線人數:%d"),m_ClientsList.GetCount());m_staOnline.SetWindowTextW(strTemp);break;}//end if}//end fordelete pSocket;pSocket=NULL;break;}//end if}while(!((pSocket->m_pArchiveIn)->IsBufferEmpty())); } //服務器向所有客戶機轉發來自某一客戶機的消息 void CServerDlg::sendToClients(CMessage* pMsg) {for (POSITION pos=m_ClientsList.GetHeadPosition();pos!=NULL;){CClientSocket* pSocket1=(CClientSocket*)m_ClientsList.GetNext(pos);pSocket1->SendMessage(pMsg);} }

    ServerSocket.h:

    // CServerSocket定義 #pragma once class CServerDlg; //聲明服務器對話框類 class CServerSocket : public CSocket { public:CServerSocket(CServerDlg* pDlg);//添加入口參數virtual ~CServerSocket();//回調函數,套接字收到連接請求時,自動調用此函數virtual void OnAccept(int nErrorCode);CServerDlg* m_pDlg; //指向服務器對話框類的指針 };

    ServerSocket.cpp:

    // ServerSocket.cpp : 實現文件 #include "stdafx.h" #include "Server.h" #include "ServerSocket.h" #include "ServerDlg.h" //手動添加 CServerSocket::CServerSocket(CServerDlg* pDlg) {m_pDlg=pDlg;//初始化成員變量 } CServerSocket::~CServerSocket() {m_pDlg=NULL; }// CServerSocket 成員函數 void CServerSocket::OnAccept(int nErrorCode) {// TODO: 在此添加專用代碼和/或調用基類CSocket::OnAccept(nErrorCode);m_pDlg->onAccept();//調用主對話框中的處理函數 }

    運行結果截圖:
    服務器:

    客戶機:

    聊天室:


    總結

    以上是生活随笔為你收集整理的【通信协议及编码】实验3:MFC框架下聊天室客户机与服务器程序的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    中文字幕在线观看亚洲 | 欧洲精品二区 | 久久a久久 | 天天性天天草 | 亚洲黄色软件 | 亚洲精品播放 | 国产精品福利午夜在线观看 | 国产一线二线三线性视频 | 国产精品久久久久久久久久ktv | 狠狠操狠狠干2017 | 在线观看视频福利 | 黄色软件视频网站 | 亚洲精品99久久久久中文字幕 | 国产成人精品久久二区二区 | 欧美精品乱码99久久影院 | 综合网伊人 | 午夜黄色大片 | 国产精品美女久久久久久久 | 欧美日韩在线播放一区 | 欧美色图88 | 中文视频一区二区 | 九九免费视频 | 午夜国产福利在线观看 | 欧美一级小视频 | 久久九九视频 | 在线看一级片 | 久久久久久国产精品美女 | 在线观看国产v片 | 亚洲免费在线播放视频 | 国产精品久久久久久高潮 | 精久久久久 | 在线观看黄色免费视频 | 成人小视频在线 | 日韩激情在线视频 | 中文字幕丝袜美腿 | 天天爱天天爽 | 久久免费电影网 | 久久综合偷偷噜噜噜色 | 91黄色在线视频 | 免费午夜在线视频 | 91观看视频 | 最近日本中文字幕a | 一区二区三区日韩视频在线观看 | 婷婷综合影院 | 成年人在线免费看片 | 视频99爱 | 一区在线观看 | 91香蕉视频色版 | www91在线观看 | 五月天综合网站 | 亚洲狠狠丁香婷婷综合久久久 | 91精品区| www.天天综合 | av在线播放一区二区三区 | 久久国产精品免费一区 | 免费观看黄色12片一级视频 | 免费性网站 | 成人黄色毛片 | 99精品免费久久久久久久久日本 | 在线视频第一页 | 中文字幕综合在线 | 久二影院 | 天天综合网入口 | 久久国产香蕉视频 | 97超碰免费在线观看 | 亚洲国产伊人 | a视频免费在线观看 | 国产成人三级在线 | 色在线中文字幕 | 精品国产乱码久久久久久1区2匹 | 九九视频精品免费 | 国产精品一区二区在线观看免费 | 狠狠操狠狠干天天操 | 免费h在线观看 | a成人v在线 | 欧美性极品xxxx娇小 | 超级碰碰碰碰 | 亚洲一区美女视频在线观看免费 | 五月婷在线播放 | 在线免费观看国产 | 久久影视一区 | av电影免费 | 亚洲清纯国产 | 一级一片免费视频 | 亚洲精品永久免费视频 | 在线电影 你懂得 | bbbbb女女女女女bbbbb国产 | 亚洲国产视频直播 | 中文字幕 国产视频 | 欧美成人猛片 | 九九在线精品视频 | 欧美日韩aaaa | 日韩av高潮 | 人人舔人人干 | 狠狠狠干狠狠 | 国产午夜亚洲精品 | 久久再线视频 | 欧美日韩a视频 | a黄色片在线观看 | 激情偷乱人伦小说视频在线观看 | 在线免费观看视频一区二区三区 | 久久精品在线 | 最近中文字幕大全中文字幕免费 | 激情五月婷婷激情 | 欧美日韩在线视频免费 | 久久视频一区二区 | 成人a视频片观看免费 | 97视频入口免费观看 | 亚洲色综合 | 日韩av伦理片 | 欧美91精品国产自产 | 毛片.com| 视频国产一区二区三区 | 狠狠色伊人亚洲综合网站色 | 一区二区国产精品 | 日日爱999 | 激情在线免费视频 | 免费网站黄 | 成人免费网站在线观看 | 国产精品美女在线观看 | 日韩在线高清免费视频 | 99热亚洲精品 | 中文字幕免 | 黄色免费av | 欧美天堂视频在线 | 91丨九色丨高潮丰满 | 国产精品一区免费在线观看 | 91九色最新 | 亚洲激情p| 久久99精品久久只有精品 | 国内99视频 | 国产高清不卡在线 | 中文字幕在线观看免费高清电影 | 日韩在线理论 | 精品久久久久久亚洲综合网 | 国产亚洲激情视频在线 | 欧美综合国产 | 色天天 | 亚洲国产日本 | 综合久久一本 | 国产精品久久久久999 | 亚洲最新av网站 | 久久a国产 | 亚洲一区二区三区91 | 精品福利在线观看 | 日本黄色免费大片 | 久久精品在线 | 午夜的福利 | 在线看一级片 | 人人爽人人做 | 国产成人精品av在线观 | 在线观看免费中文字幕 | 免费成人黄色av | 亚洲最快最全在线视频 | 日韩av免费大片 | 久久成人国产精品 | 就操操久久 | 日韩艹 | 狠狠操综合 | 日韩欧美在线不卡 | 99精品欧美一区二区三区黑人哦 | 在线观看视频黄色 | 国产精品国产毛片 | 蜜臀久久99精品久久久酒店新书 | 国产91电影在线观看 | 狠狠狠色丁香综合久久天下网 | 中文字幕 婷婷 | 免费a级大片 | 天天干夜夜爽 | 国产在线一区二区 | 亚洲精品欧美成人 | 天天操天天射天天插 | 婷婷六月丁香激情 | 国产我不卡 | 黄色在线看网站 | 日韩高清无线码2023 | 日日夜夜精品免费 | 97在线观看视频免费 | 天天射天天做 | 成人黄色电影在线播放 | 国产亚洲精品久久久久动 | 日本中文字幕在线观看 | 免费久久久久久 | 免费a网址 | 国产精品久久久久久久久久久久久久 | 国产手机在线播放 | 欧美在线91| 国产毛片久久 | 国产一区在线播放 | 国产精品一区二区三区免费看 | 在线综合色 | 久碰视频在线观看 | 狠狠色狠狠综合久久 | 国产精品自产拍在线观看蜜 | 亚洲人人爱| 免费在线激情电影 | av中文字幕在线看 | 久久一区二区三区超碰国产精品 | 久久久综合九色合综国产精品 | 久久久久久久久久久国产精品 | 亚洲精品91天天久久人人 | 亚洲精选在线观看 | 亚洲欧洲日韩 | 天堂av免费在线 | 中文字幕有码在线 | 久久精品三 | 久久人人精品 | 欧美日韩p片 | 91久久一区二区 | 二区视频在线观看 | www.天天成人国产电影 | 久久久精品国产一区二区电影四季 | 婷婷久久五月 | 91视频a| www成人av | 免费视频二区 | 97香蕉超级碰碰久久免费软件 | 99精品视频观看 | 蜜臀久久99精品久久久无需会员 | av先锋中文字幕 | 国产毛片aaa | 久久九九国产精品 | 六月丁香久久 | 日本黄色免费在线观看 | 成x99人av在线www | 婷婷午夜激情 | 江苏妇搡bbbb搡bbbb | 久久狠狠一本精品综合网 | 亚洲精品456在线播放第一页 | 欧美日韩裸体免费视频 | 97碰碰视频 | 欧美一区在线观看视频 | 欧美性高跟鞋xxxxhd | 国产精品久久久久影院 | 日本韩国中文字幕 | 欧美精品乱码久久久久久 | 久久69av| 中国美女一级看片 | 国产一区高清在线 | 黄色av网站在线观看 | 青青视频一区 | 9999国产精品| av先锋中文字幕 | 久久av高清 | 国产中文字幕在线播放 | 五月天综合网站 | 九九免费在线视频 | 免费看三级黄色片 | 欧美一区二区三区在线视频观看 | 日本久久综合网 | 激情综合网天天干 | 狠狠干2018| 久久与婷婷 | 综合网伊人 | 婷婷99 | 日韩精品第1页 | 99久久99视频只有精品 | 日本黄色免费看 | 91精品成人 | 亚洲涩涩网 | 高清av免费看 | 日韩精品极品视频 | 午夜影院一级片 | 国产精品久久久久永久免费看 | 日韩在线电影一区 | 青青河边草免费观看 | 国产精品久久精品国产 | 免费观看91视频大全 | 黄色网在线免费观看 | 射射射av | 国产视频中文字幕 | 日韩精品一区二区三区第95 | 久久国产精品系列 | 麻豆国产网站 | 国产精品无 | 97香蕉超级碰碰久久免费软件 | 天天干夜夜爽 | 日韩午夜高清 | 欧美极品一区二区三区 | 国产精品视频久久 | 国产高清视频免费最新在线 | 欧美黄色软件 | 久久久久久久久久免费 | 999久久久国产精品 高清av免费观看 | 国产视频精品免费播放 | 一级免费av | 午夜色场 | 最近2019中文免费高清视频观看www99 | 午夜体验区 | 伊人久久电影网 | 久久久久久久99精品免费观看 | 精品视频专区 | 免费不卡中文字幕视频 | 色吊丝在线永久观看最新版本 | 国产专区精品 | 亚洲黄色区 | 日本在线视频一区二区三区 | 国产在线1区 | 日韩欧美视频一区二区 | 97超碰伊人 | 日韩av成人在线观看 | 欧美中文字幕第一页 | 国产成人免费在线观看 | 国产在线观看xxx | 美女视频久久黄 | 久久久久国产一区二区三区四区 | 欧美日韩一区二区三区不卡 | 久久精品久久久精品美女 | 国产中文字幕一区二区三区 | 在线观影网站 | 激情丁香久久 | 欧美一区二区精美视频 | 91麻豆精品国产91久久久久久久久 | 91九色最新地址 | 97品白浆高清久久久久久 | 六月色婷婷 | 天堂va在线高清一区 | 粉嫩av一区二区三区免费 | 黄色91免费观看 | 久操伊人| 欧美午夜精品久久久久久浪潮 | 国产高清久久久久 | 久久国产乱 | 国产精品久久久久久久久久久久久久 | 国产韩国精品一区二区三区 | 成人精品一区二区三区电影免费 | 91视频这里只有精品 | 久久久久久久久久久久国产精品 | 国产精品手机在线观看 | 国产黄在线免费观看 | 97视频人人免费看 | 91最新网址在线观看 | 一级一级一片免费 | 久久久久欠精品国产毛片国产毛生 | 免费在线观看a v | www.国产视频 | 免费看的黄网站 | 久草在线免费资源 | 人人狠狠综合久久亚洲婷 | 久草网免费 | 国产999在线| 久久尤物电影视频在线观看 | 中文字幕在线不卡国产视频 | 欧美成人黄色 | 91精品在线观看视频 | 香蕉视频18 | 国产不卡在线视频 | 在线观看国产永久免费视频 | 精品一区中文字幕 | 五月婷婷六月综合 | 国产一二区免费视频 | 狠狠干天天操 | 成人四虎 | 国产精品对白一区二区三区 | 久草在线官网 | 日b视频在线观看网址 | 国色天香永久免费 | 国产永久免费高清在线观看视频 | 国产亚洲精品日韩在线tv黄 | av东方在线 | 麻豆传媒视频在线免费观看 | 久久久久成人精品免费播放动漫 | 免费看黄20分钟 | 久久97视频 | 亚洲精品国偷拍自产在线观看蜜桃 | 操操操人人 | 在线视频一二区 | 日日爽天天 | 四虎在线视频 | 久久精品欧美日韩精品 | 国产精品乱码一区二三区 | 国产精品片 | 五月婷婷六月丁香激情 | 国产精品久久久久久久久久久杏吧 | 激情av资源 | 中文av资源站 | www日韩在线观看 | 免费在线观看成人 | 久久视频在线观看中文字幕 | 免费色网 | 亚洲在线视频网站 | 中文字幕精品三级久久久 | 国产高清视频在线观看 | 国产视频 亚洲视频 | 婷婷六月网 | 国产永久免费观看 | 青春草国产视频 | 97成人精品区在线播放 | 黄色一级大片在线免费看国产一 | 91亚洲精品久久久中文字幕 | 成人在线观看免费视频 | 四虎欧美 | 国产福利专区 | 亚洲丝袜一区 | 国产午夜在线 | 91精选在线观看 | 国产韩国精品一区二区三区 | 日韩国产精品久久久久久亚洲 | 免费看久久久 | 日本久久电影网 | 国产免费一区二区三区网站免费 | 人人插超碰 | 六月丁香久久 | 欧美小视频在线观看 | 亚洲最大av网站 | 看片在线亚洲 | 国产91在线观 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 亚洲激色| 国产短视频在线播放 | 手机av资源 | 青青视频一区 | 精品国产诱惑 | 五月婷婷激情 | 国产高清av免费在线观看 | 欧美精品免费一区二区 | 超碰av在线 | av福利电影 | 99精品视频精品精品视频 | 亚洲电影黄色 | 中文字幕亚洲在线观看 | 丁香六月婷婷开心婷婷网 | 99在线免费观看视频 | 天天干天天上 | 婷婷丁香狠狠爱 | 国产特级毛片aaaaaa毛片 | 国产成人精品亚洲 | 国产日韩在线一区 | 婷婷久久国产 | 亚洲男男gⅴgay双龙 | 91丨九色丨国产在线 | 看片网站黄色 | 日韩中文在线字幕 | 久草色在线观看 | 久久黄色免费 | a久久久久久 | 亚洲一区精品人人爽人人躁 | 亚洲精品国产免费 | 婷婷在线免费视频 | 日韩国产在线观看 | 91av在线视频播放 | 国产在线观看 | 又黄又爽又湿又无遮挡的在线视频 | 九九精品在线观看 | 天天干天天干天天干 | 欧美日韩精品在线 | 国产亚洲一区二区三区 | 999久久国精品免费观看网站 | 丁香5月婷婷 | 中文字幕在线观看免费观看 | 精品在线不卡 | 九九九热精品免费视频观看网站 | 91久久国产露脸精品国产闺蜜 | 午夜精品成人一区二区三区 | 男女激情片在线观看 | 色播六月天 | 成人aaa毛片 | 国产精品国产亚洲精品看不卡15 | 日韩精品中文字幕在线播放 | 久久久久一区二区三区 | 国产精品字幕 | 色狠狠综合 | 天天综合区 | 成人网页在线免费观看 | 国内精品久久久久久久影视麻豆 | 国产午夜视频在线观看 | 91免费视频国产 | 黄网站免费大全入口 | 开心激情网五月天 | 亚洲精品久久久久中文字幕m男 | 天天鲁天天干天天射 | 国产成人精品久久亚洲高清不卡 | 国产精品video爽爽爽爽 | 久久久久综合 | 天天色棕合合合合合合 | 九色视频自拍 | av色网站| 午夜电影 电影 | 天天操天天爱天天爽 | 久久免费视屏 | 福利视频精品 | 五月婷婷综合激情 | 欧美性生活免费 | 亚洲最新在线视频 | 国产一卡久久电影永久 | 中文字幕在线视频一区二区 | 美女在线免费观看视频 | 日韩动态视频 | 激情视频在线高清看 | 国产视频在线播放 | 欧美成a人片在线观看久 | 天堂va欧美va亚洲va老司机 | 久久久久久久久久久久av | 99精品福利| 日韩在线观看中文 | 视频在线观看国产 | 精品久久久久久综合 | 国产黄色精品在线 | 激情欧美一区二区三区免费看 | 久久综合色婷婷 | 亚洲婷婷综合色高清在线 | 久草热久草视频 | 精品视频资源站 | 精品国产乱码久久久久久三级人 | 国产精品久久久久影院 | 成人a在线观看 | 在线欧美国产 | 色婷婷激情四射 | 中文在线字幕免费观 | 欧美精品二 | av在线播放免费 | 亚洲人视频在线 | 天天干天天操人体 | 国产精品日韩高清 | 国产精品久久一区二区无卡 | 亚洲理论片在线观看 | 黄色a在线观看 | 一级黄色电影网站 | 国模精品一区二区三区 | 久草视频在线免费 | 黄影院| 国产精品成人在线 | 粉嫩aⅴ一区二区三区 | 91黄色在线看 | 97在线影视 | 日韩精品久久久 | 人人添人人澡 | 日韩免费看视频 | 日韩视频一二三区 | 99久久婷婷 | 91香蕉视频好色先生 | 亚洲电影免费 | 国产精品免费久久久久久 | 夜夜躁日日躁狠狠久久av | 午夜久久久久 | 九九久久影院 | 99精品国产免费久久久久久下载 | 亚洲精品黄色片 | 狠狠狠色丁香婷婷综合久久五月 | 国产三级午夜理伦三级 | 亚洲va欧美va人人爽春色影视 | 日韩欧美在线高清 | 日本久热 | 免费特级黄毛片 | 99视频精品免费观看, | 色夜视频 | 欧美日韩成人一区 | 日日干天天爽 | 激情六月婷婷久久 | 日韩av中文在线 | www欧美色 | 久久综合久久综合九色 | 欧美一级淫片videoshd | 天天操天天透 | 日韩二区三区 | 91视频链接 | 亚洲精品久久久久58 | 天天干天天操天天干 | 中文字幕xxxx| 久久精品视频5 | 99久久精品无免国产免费 | 四虎国产永久在线精品 | 亚洲国产精品久久 | 国产黄色免费观看 | 亚洲免费精彩视频 | 日韩乱色精品一区二区 | 最新久久免费视频 | 国产亚洲综合在线 | 麻花豆传媒mv在线观看网站 | 久久久久成人免费 | 精品欧美一区二区精品久久 | 国产91免费观看 | 日韩在线不卡视频 | 最新国产在线视频 | 免费观看www小视频的软件 | 亚洲国产精品久久久 | 久久久久久久久久电影 | 夜夜躁日日躁狠狠久久av | 天天爱天天色 | 在线免费观看国产 | 亚洲成av人片 | 色多多在线观看 | av国产在线观看 | 在线观看小视频 | 久久激情婷婷 | 国产亚洲一区二区三区 | 三级黄色片在线观看 | 国产视频1区2区 | 黄污网站在线 | 99久久精品无码一区二区毛片 | 日日噜噜噜噜夜夜爽亚洲精品 | 一区二区视 | 麻豆影视在线免费观看 | 国产精品99久久久久久人免费 | 91精品欧美一区二区三区 | 亚洲精品中文字幕视频 | 97精品国产97久久久久久免费 | 亚洲 欧美 成人 | 天堂va在线观看 | 久久观看最新视频 | 欧美午夜一区二区福利视频 | wwwwwww黄| 国产精品美女久久久久久久 | 午夜久久美女 | 精品毛片一区二区免费看 | 成人91视频 | 精品久久久久久亚洲综合网站 | 天天射天天 | 国产拍揄自揄精品视频麻豆 | 中文字幕亚洲精品日韩 | 97人人模人人爽人人喊网 | 9ⅰ精品久久久久久久久中文字幕 | 在线涩涩 | 久久精品婷婷 | 91精品国产欧美一区二区 | 婷婷深爱| 久久美女免费视频 | 欧美一级电影在线观看 | 亚洲视频资源在线 | 国产一级电影网 | 一本一道波多野毛片中文在线 | 人人澡人人澡人人 | 久久国产午夜精品理论片最新版本 | 91av资源在线 | 在线视频日韩精品 | 狠狠色丁香久久婷婷综合_中 | 免费黄色av. | 国产18精品乱码免费看 | 2019中文字幕第一页 | 国产麻豆视频免费观看 | 一本色道久久精品 | 欧美精品在线观看一区 | 日韩色一区二区三区 | 精品国产一区二区三区免费 | 91伊人| 超碰在线公开免费 | 久久久久久久久久久久久国产精品 | 日韩一二三区不卡 | 五月天综合网站 | 日韩av电影手机在线观看 | 亚洲黄色激情小说 | 波多野结衣综合网 | 91av在线播放| 欧美analxxxx| 免费日韩精品 | 国产亚洲综合性久久久影院 | 日本中文字幕网 | 亚洲国产三级 | 国产精品嫩草69影院 | 麻豆精品视频在线 | 久久久久久久久久久久亚洲 | 91精品国产三级a在线观看 | 草久久久久久 | 日本高清中文字幕有码在线 | 久久高清av| 久久久精品欧美 | 欧美日在线观看 | 韩日精品在线 | 国产精品久久久久9999吃药 | 99精品在线视频播放 | 日韩av电影一区 | 伊人伊成久久人综合网小说 | 美女免费黄视频网站 | 999久久a精品合区久久久 | 深夜福利视频一区二区 | 国产高清无av久久 | 一本色道久久综合亚洲二区三区 | 视频二区在线 | 精品视频免费播放 | 91高清在线看 | 亚洲精品乱码久久久久久蜜桃动漫 | 国产美女精彩久久 | 日韩在线看片 | 久久久 激情 | 精品国产一区二区三区久久久久久 | 久久亚洲视频 | 国产精品96久久久久久吹潮 | 黄色一区三区 | 国产精久久久 | 成人毛片一区二区三区 | 国产a免费 | avlulu久久精品 | av线上看 | 在线观看日本高清mv视频 | 成人免费观看在线视频 | 91在线视频免费播放 | 国产视频2区 | avove黑丝| 久久久亚洲麻豆日韩精品一区三区 | 久久成人国产精品免费软件 | 久久久久久久久久久免费视频 | 国产亲近乱来精品 | 国产一卡久久电影永久 | 在线观看免费一级片 | 午夜体验区| 亚洲天堂网在线观看视频 | 国产精品成人自产拍在线观看 | 天天操夜夜爱 | 日韩视频在线观看免费 | 亚洲禁18久人片 | 丁香五月缴情综合网 | 国产一区二区精品91 | 免费黄色av片 | 国产亚洲久久 | 久久视频精品在线观看 | 久草综合在线观看 | 亚洲国产美女久久久久 | 日免费视频 | 国产91学生粉嫩喷水 | 91久久精品日日躁夜夜躁国产 | 97超碰免费在线观看 | 国产成人精品女人久久久 | 激情五月av | 欧美午夜a | 黄网站色| 在线观看www. | 中文字幕在线观看不卡 | 欧美大片在线观看一区 | 久久久蜜桃 | 天天插天天狠天天透 | 人人草在线视频 | 日韩成人免费电影 | 欧美日韩不卡在线 | 97在线视频免费看 | 成年人免费看的视频 | 日韩视频三区 | 色综合网 | 日韩免费福利 | 国产呻吟在线 | 久久伊人八月婷婷综合激情 | 伊人宗合网 | 日日爽视频 | 国产精品福利在线观看 | 福利视频一区二区 | 国产精品自产拍在线观看桃花 | 四虎在线观看 | 日韩免费中文 | 亚洲美女视频在线 | 亚洲片在线观看 | 在线观看视频亚洲 | 黄在线免费观看 | 国产久草在线 | 91在线观看视频网站 | 日韩免费观看av | 在线观看免费中文字幕 | 色播五月激情综合网 | 成年人视频在线观看免费 | 在线 国产 亚洲 欧美 | 日韩一级片网址 | 亚洲欧美日韩国产一区二区 | 久久黄网站| 亚洲人成人天堂h久久 | 久久久不卡影院 | 激情视频免费在线观看 | 国产免费人成xvideos视频 | 国产成人黄色 | 亚洲v欧美v国产v在线观看 | 91大神视频网站 | av专区在线 | 国产91影院 | 亚洲成人午夜在线 | 亚洲日日夜夜 | 国产五月天婷婷 | 国产特黄色片 | 99久久婷婷国产精品综合 | 日韩一区二区三区高清在线观看 | 亚洲精品视频在线观看网站 | 国产在线综合视频 | 国产成人精品午夜在线播放 | 天天天干天天射天天天操 | 天堂入口网站 | 91精品办公室少妇高潮对白 | 日韩在线在线 | 日日干夜夜骑 | 久久精品女人毛片国产 | 国产精品久久精品国产 | 日韩精品播放 | 精品国产欧美 | 成人欧美在线 | 国产精品 国产精品 | 亚洲综合成人在线 | 香蕉视频久久久 | 亚洲妇女av| 日韩在线视频看看 | 国产精品电影在线 | 午夜av免费 | 亚洲日本欧美 | 精品国产一区二区三区四 | 欧美午夜理伦三级在线观看 | 亚洲天堂网在线播放 | 亚洲激情小视频 | av动图| 天天激情综合网 | 久久久久久久亚洲精品 | 九九九热精品免费视频观看 | 99热在线看 | 青青河边草免费直播 | 亚洲精品国偷拍自产在线观看 | 字幕网av | 国产一区二区成人 | 国产精品色在线 | 国产精品99久久久精品免费观看 | 免费网站v | 九九国产视频 | 最近中文字幕国语免费av | 国产精品一码二码三码在线 | 97超碰成人在线 | 亚洲精品天天 | 亚洲人成影院在线 | 免费看黄在线网站 | 亚洲成av人片一区二区梦乃 | 亚洲成人网av | 国产精品美女999 | 天天射天天色天天干 | 91一区啪爱嗯打偷拍欧美 | 国产亚洲欧美日韩高清 | 中文av日韩 | 91精品啪在线观看国产81旧版 | 色资源在线观看 | 精品国产一二三 | 在线观看免费高清视频大全追剧 | 岛国精品一区二区 | 69视频国产| 欧美在线观看视频一区二区三区 | 久久视频在线观看中文字幕 | 国产精品国产三级国产aⅴ9色 | 亚洲精品字幕在线 | 成人黄色电影免费观看 | 国产精品一区电影 | 99999精品| 精品国产欧美一区二区 | 国产亚洲精品久久久久久网站 | 人人澡超碰碰97碰碰碰软件 | 碰碰影院 | 99久久久久成人国产免费 | 婷婷亚洲激情 | 蜜臀久久99精品久久久无需会员 | 五月色综合| 久久影院亚洲 | 亚洲国产日韩精品 | 久久精选视频 | 亚洲视频网站在线观看 | 国色综合| 亚洲 成人 欧美 | 黄色亚洲精品 | 婷婷亚洲综合五月天小说 | 手机版av在线| 岛国大片免费视频 | 国产91在线免费视频 | 精品一区二区视频 | 久久久久久视频 | 99热精品国产一区二区在线观看 | 久久久香蕉视频 | 美女视频免费精品 | 成人性生交大片免费观看网站 | 97日日| 99热精品国产 | 91免费看片黄 | 国产精品女人久久久 | 国产麻豆精品在线观看 | 中文字幕电影高清在线观看 | 免费a视频| 成人免费在线网 | 96国产在线 | 国产99久久99热这里精品5 | 波多野结衣视频一区 | 精品久久久久国产免费第一页 | 久久午夜电影院 | 日韩毛片精品 | 黄色亚洲在线 | 五月婷婷丁香综合 | 久久只有精品 | 在线成人欧美 | 免费看色的网站 | 人人爽人人澡人人添人人人人 | 日日操夜夜操狠狠操 | 日韩欧美一区二区三区免费观看 | 一本一本久久a久久精品综合小说 | 亚洲黄网站| 特级黄色视频毛片 | 国产无吗一区二区三区在线欢 | 久久综合色天天久久综合图片 | 久久一级片 | 欧美一区二区三区在线观看 | 九九热在线观看 | 男女全黄一级一级高潮免费看 | 樱空桃av | 久久综合之合合综合久久 | 最近最新mv字幕免费观看 | 成人午夜剧场在线观看 | 97超级碰| 久久国产91| 国产91精品久久久久 | 中文字幕在线观看网站 | 免费看的黄色的网站 | 久久久18 | 美女视频免费一区二区 | 国产一级做a爱片久久毛片a | 成人app在线播放 | 色哟哟国产精品 | 一级黄色免费网站 | 欧美精品黑人性xxxx | 久久av福利 | www.av在线播放 | 色网站在线免费观看 | 91久久久久久久 | 中国一级片在线 | 亚洲黄在线观看 | 久久九九久久精品 | 91久久爱热色涩涩 | www成人精品 | 日韩欧美xxxx| adc在线观看 | 久久无码av一区二区三区电影网 | 五月婷婷综合激情 | 中文字幕乱码日本亚洲一区二区 | 福利一区二区在线 | 视频国产在线观看18 | 成人免费在线播放视频 | 又紧又大又爽精品一区二区 | 在线99热 | 国产精品av免费在线观看 | 国产成人高清 | 欧美日韩不卡在线视频 | 五月天综合在线 | 亚洲国产精品va在线 | 亚洲精品国偷自产在线99热 | 91麻豆精品91久久久久同性 | 日日摸日日爽 | 国产手机在线精品 | 午夜久久久久久久久久影院 | 日本精品一区二区三区在线播放视频 | 91刺激视频| 91天堂影院 | 99久久精品免费 | 日韩在线观看视频一区二区三区 | 亚洲精品 在线视频 | 久久精品久久精品久久 | 欧美福利网址 | 天天操比 | 日韩av男人的天堂 | 国产亚洲精品久 | 午夜视频一区二区 | 免费电影一区二区三区 | 亚洲精品欧美视频 | 久久久久久久久久久高潮一区二区 | a色视频| 六月激情网 | 99re久久精品国产 | 精品国产精品久久一区免费式 | 欧美乱码精品一区 | 六月丁香激情网 | 欧美精品首页 | 人人澡人人干 | 丰满少妇在线观看 | av中文字幕网站 | 久久字幕网 | 日韩在线观看网站 | 久久美女精品 | 五月色综合 | 成人午夜影院 | 伊人影院在线观看 | 最新日韩视频 | 欧美色图88 | av一区二区三区在线播放 | 91精品国产欧美一区二区成人 | 日韩精品免费在线 | 91综合色| 日韩高清免费在线 | 午夜精品一区二区三区免费 | 亚洲三级毛片 | 亚洲人人精品 | 国产精品久久久久久久电影 | 超碰在线国产 | 成人福利在线 | 亚洲aⅴ久久精品 | 国模一区二区三区四区 | 高清一区二区 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 91在线免费观看国产 | 日韩av福利在线 | 久草视频播放 | 91在线免费看片 | 五月天综合色激情 | 国产精品一区二区三区电影 | 手机成人在线 | 国产黄色在线网站 | 中文字幕精品www乱入免费视频 | 国产精品久久久一区二区 | a在线观看免费视频 | 99国产视频在线 | 99视频国产精品 | 一级片视频在线 | 在线观看视频黄色 | 国产精品观看在线亚洲人成网 | 国产真实在线 | 又爽又黄又无遮挡网站动态图 | 久草精品在线播放 |