在vc++中,有一个CSocket类,可以用来实现服务器端的功能。事实上,对于每一个客户端,服务器端必须有一个Socket对象与之相连,即是说如果有n个客户请求连接,则需要有n个socket对象,有n+1个客户请求连接,就必须有n+1个socket对象。所以,我们需要动态改变socket对象的个数,我们的设计思路如下:
①从CSocket类派生出一个CListenSocket类,并创建一个CListenSocket类的对象,专门用来监听客户端的请求,再从CSocket类派生出一个CClientSocket类,专门用来和客户端保持连接。
②一旦CListenSocket类的对象接收到一个请求,马上创建出一个CClientSocket类的对象,并让这个对象与客户端保持连接,而且我们要创建一个链表,每当增加一个CClientSocket类的对象时,就将它加入到链表中。
③任何一个CClientSocket类的对象的对象收到一个从flash传送过来的信息,马上让所有的CClientSocket类的对象将这个信息传送到客户端,实现信息的转发。
下面,请大家跟着我一步一步来实现:
1.通过AppWizard生成一个基于对话框的应用程序GameSvr,在向导的第二步选择Windows Sockets的支持,其余步骤均采用默认值。
2.给CGameSvrDlg类添加一个变量int i;用来限制连接数,如下:
protected: int i=0;
3.通过ClassWizard生成基于CSocket的新类CListenSocket,用来监听请求。
4.给CListenSocket类声明一个主对话框CGameSvrDlg指针类型的私有成员变量,如下:
protected:
CGameSvrDlg *m_pDlg;
5.给CListenSocket类重载一个构造函数:
CListenSocket::CListenSocket(CGameSvrDlg* pDlg)
{
m_pDlg=pDlg;
} 并且在CListenSocket类的cpp文件开始处增加如下语句:
#include "CGameSvrDlg.h"
6.通过ClassWizard响应CListenSocket类的OnAccept函数,表示有客户端连接,其代码如下:
void CListenSocket::OnAccept(int nErrorCode)
{
CSocket::OnAccept(nErrorCode);
//主对话框处理连接信息
if(m_pDlg){
m_pDlg->ProcessPendingAccept();
}
}
7.通过ClassWizard生成CClientSocket类用来与客户端通信;
8.给CClientSocket类声明一个主对话框CGameSvrDlg指针类型的私有成员变量,如下:
protected: CGameSvrDlg *m_pDlg;
9.给CClientSocket类重载一个构造函数:
CClientSocket::CClientSocket(CGameSvrDlg* pDlg)
{
m_pDlg=pDlg;
} 并且在CClientSocket类的cpp文件开始处增加如下语句:
#include "CGameSvrDlg.h"
10.通过ClassWizard响应CClientSocket类的OnReceive()函数,表示有数据来了,其代码如下:
void CClientSocket::OnReceive(int nErrorCode)
{
CSocket::OnReceive(nErrorCode);
//主对话框处理连接信息
if(m_pDlg){
m_pDlg->ProcessPendingRead(this);
}
11.在主对话框CGameSvrDlg的头文件中增加两个私有成员变量,如下:
CListenSocket* m_pSocket;
CPtrList m_connectionList;
//客户端Socket链表并且在CGameSvrDlg的头文件开始处增加以下代码:
class CListenSocket;
class CClientSocket;
12.给主对话框CGameSvrDlg增加处理客户端连接信息的私有成员函数ProcessPendingAccept(),其定义如下:
void CGameSvrDlg::ProcessPendingAccept()
{
if(i<8){
char s[11];
sprintf(s,"<id>%d</id>",i);
m_pSocket->send(s,strlen(s),0);
CClientSocket *pSocket=new CClientSocket(this);
if(m_pSocket->Accept(*pSocket)){
//将该Socket保存在链表中
m_connectionList.AddTail(pSocket);
}else{
delete pSocket;
}
}else{
char s[16];
s="<err>full</err>";
m_pSocket->send(s,strlen(s),0);
}
i++;
}
13.给主对话框CGameSvrDlg增加更新所有客户端的私有成员函数UpdateClients,其定义如下:
void CGameSvrDlg::UpdateClients(char *buffer,int nBufferSize)
{
for(POSITION pos=m_connectionList.GetHeadPosition();pos!=NULL;)
{
CClientSocket *pSocket=(CClientSocket*)m_connectionList.GetNext(pos);
if(buffer!=NULL)pSocket->send(buffer,nBufferSize,0);
}
}
14.给主对话框CGameSvrDlg增加接收数据的私有成员函数ProcessPendingRead,其定义如下:
void CGameSvrDlg::ProcessPendingRead(CClientSocket *pSocket)
{
char buffer[BUFFER_SIZE];
int nReceived=pSocket->Receive(buffer,BUFFER_SIZE,0);
buffer[nReceived]=0;
//将数据发给每一个用户
UpdateClients(buffer,nReceived);
}
并且在对话框CGameSvrDlg类的头文件开始处定义缓冲区的大小,如下:
#define BUFFER_SIZE 100
15.在主对话框CGameSvrDlg的OnInitialUpdate函数中添加如下代码:
BOOL CGameSvrDlg::OnInitDialog(){
CDialog::OnInitDialog();
//其他代码
//……
m_pSocket=new CListenSocket(this);
if(m_pSocket->Creat(1024)){
if(m_pSocket->Listen())
return TURE;
}else
return FALSE;
return TURE;
}
OK,我们做完全部的工作了,也许你要问,我们的这个游戏能够干什么呢?不错,这个游戏的功能实在太简单,也许它能做的唯一的事情就是……赛跑!但是我写这篇教程的目的是为了抛砖引玉,希望大家能够写出更多更精彩的网络游戏来……
分享到:
相关推荐
本文将详细介绍如何使用VC++6.0这一强大的开发工具来实现客户端与服务器端之间的数据传输。 #### 客户端与服务器端通信的基本原理 客户端/服务器(Client/Server, C/S)模型是一种广泛应用于网络通信中的架构模式。...
【VC++ QQ服务器端源代码】是一套用于学习和研究即时通讯软件开发的宝贵资源,主要基于Microsoft Visual C++(VC++)编程环境。源代码的提供,让我们有机会深入理解QQ服务器背后的架构和工作原理,这对于想要涉足...
本文将深入探讨如何使用VC++实现基于TFTP方式的客户端与服务器端文件传输,并结合提供的压缩包文件进行解析。 首先,TFTP协议本身相当简单,它支持两种操作模式:读(Read)和写(Write)。协议基于UDP(User ...
服务器端程序需要监听特定的端口,等待客户端的连接请求。 在VC++中,我们可以使用Winsock库来实现TCP通信。Winsock是Windows操作系统提供的API,用于实现网络通信。首先,我们需要包含相应的头文件`winsock2.h`,...
本文将深入探讨使用VC++实现客户端服务器通信的基本原理,并通过提供的源码进行详细解析。 首先,客户端-服务器架构是一种分布式计算模型,其中服务器负责处理请求并提供服务,而客户端则发送请求并接收响应。在...
### VC++6.0 实现客户端与服务器端通讯的关键知识点 #### 一、研究背景与目标 在现代医疗卫生系统中,高效的信息交换至关重要。通过利用VC++6.0这一编程工具,研究人员旨在实现客户端与服务器端之间的数据通信,...
在本篇文档中,我们将探讨如何使用VC++来开发一个简单的网络程序,该程序由两部分组成:服务器端与客户端。服务器端负责接收来自客户端的两个整型数字,并执行加法运算后将结果返回给客户端;而客户端则负责发送这两...
3. **TCP Server**:VC_TCP_Server是实现服务器端程序。在TCP中,服务器首先创建一个监听套接字,然后绑定到特定的IP地址和端口号上,开始监听客户端的连接请求。当有连接请求时,服务器会接受连接并创建一个新的套...
本项目以“vc++QQ软件服务器端”为标题,意在展示如何使用古老的Microsoft Visual C++ 6.0(以下简称VC++)开发QQ的服务器端部分。对于熟悉MFC(Microsoft Foundation Classes)框架的开发者,这个项目将是一次宝贵...
这个项目展示了如何使用C++来设计和实现一个能够服务于局域网内客户端请求的服务器端应用。以下是对该知识点的详细说明: 1. **C++编程语言**:C++是一种静态类型的、编译式的、通用的、大小写敏感的、不仅支持过程...
在这个项目中,我们将探讨客户端和服务器端的实现,以及在VC++环境中如何利用MFC来创建这样的通信应用。 **客户端**是聊天程序中与用户交互的部分。在MFC中,通常会使用对话框(Dialog)类作为用户界面,用户可以...
【标题】"VC++实现网络五指棋源码(客户端和服务器)"涉及的主要知识点是使用VC++编程语言,结合Windows Socket API (Winsock) 实现一个基于网络的五指棋游戏。五指棋通常是一种两人对弈的游戏,通过网络连接,玩家...
"VC++实现sip协议"这一主题意味着我们要在VC++环境中构建一个SIP客户端或服务器端应用,以便利用SIP进行网络通信。下面我们将详细探讨如何在VC++中实现SIP协议的相关知识点: 1. **SIP协议基础**:理解SIP的基本...
服务器端流程: 1、创建套接字(socket)。 2、将套接字绑定到一个本地地址和端口上(bind)。 3、将套接字设为监听模式,准备接收客户请求(listen)。 4、等待客户请求到来;当请求到来后,接受连接请求,返回一...
在本文中,我们将深入探讨如何使用VC++实现一个FTP服务器端的程序,以及在这个过程中涉及的关键知识点。 首先,VC++(Visual C++)是微软开发的一款集成开发环境,支持C++编程语言。它提供了一个强大的编译器、调试...
简单的VC++ Ftp服务器端及客户端案例 。
《网络聊天室VC++:构建客户端与服务器端的多线程通信系统》 在IT行业中,网络聊天室是实现即时通讯的重要应用场景,它允许多个用户通过互联网进行实时交流。本项目利用VC++(Visual C++)开发了一款支持多客户端...
《网络五子棋程序的VC++实现:深入解析与扩展》 网络五子棋程序的实现,是一项将计算机科学与游戏娱乐相结合的实践项目。在本文中,我们将深入探讨如何利用VC++编程语言,结合Socket通信技术,构建一个功能完善的...
本文将深入探讨如何使用VC++实现一个基于TCP协议的QQ聊天应用。首先,我们要理解TCP(传输控制协议)是一种面向连接、可靠的、基于字节流的传输层通信协议,它确保了数据的有序、无损传输。 在标题“VC++实现QQ聊天...