游戏服务器端通信框架(C++与Socket)

  这是一个小型多个对战的游戏服务器端代码,经过修改。

文件一:stdafx.h

//-------------------------------------------------------------------------
//stdafx.h中的函数为全局共享
//
//版权所有 DreamShip
//
//-------------------------------------------------------------------------

#ifndef _STDAFX_
#define _STDAFX_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream.h>
#include <winsock2.h>
#include<time.h>

#include "DSGameServer.h"

#include "DSObject.h"


//-------------------------------------------------------------------
// 字符解码调用函数
// 在一串字符中寻找ds_Search中后的数据
// 有浮点型 整形 字符型 
//  
//
//------------------------------------------------------------------
float DS_ReturnFloat(char *ds_Dest,char ds_Search) ;
int   DS_ReturnInt(char *ds_Dest,char ds_Search) ;
int   DS_ReturnString(char *ds_Dest,char ds_Search,char *buf ) ;
int   DS_ReturnCharPosition( char *ds_Dest,char ds_Search );
//检测当前耗时
void DS_PrintTime( long time );
void DS_GetCurrentTime( char timeBuf[] );
void DS_PrintCurrentTime( char *ds_Msg );

#endif

文件二:stdafx.cpp

//----------------------------------------------------------------------------------
//stdafx.cpp用于全局函数的定义
// 
//
//----------------------------------------------------------------------------------

#include "stdafx.h"

//-------------------------------------------------------------------
// 字符解码调用函数
// 在一串字符中寻找ds_Search中后的数据
// 有浮点型 整形 字符型 
//  
//
//------------------------------------------------------------------
float DS_ReturnFloat(char *ds_Dest,char ds_Search)
{
	long time = timeGetTime();
	int i=0;
    
	while( ds_Dest[i] != '\0' )
	{
		
		if( ds_Dest[i] == ds_Search )
		{
			
			int j = 0;
			i++;
            char buf[50]; 
			while( ds_Dest[i] != '*' )
			{
		    	if( ds_Dest[i] =='\0' )
					return -100.0f ;
				buf[j]=ds_Dest[i] ;
				i++ ;
			    j++ ;
			}
			buf[j]='\0';
		
	       	if( buf[0] >= '0' && buf[0] <= '9' )
				return (float)atof(buf);
			else
				return -10000.0f;
		
		}

		i++ ;
	}
	printf("查找不成功所需时间:%d\n",timeGetTime()-time);
	return -10000.0f ;
}

//-------------------------------------------------------------------
// 字符解码调用函数
// 在一串字符中寻找ds_Search中后的数据
// 有浮点型 整形 字符型 
//  
//
//------------------------------------------------------------------
int DS_ReturnInt(char *ds_Dest,char ds_Search)
{
	long time = timeGetTime();
	int i=0;

	while( ds_Dest[i] != '\0' )
	{
		
		if( ds_Dest[i] == ds_Search )
		{
			
			int j = 0;
			i++;
            char buf[50]; 
			while( ds_Dest[i] != '*' )
			{
			
				if( ds_Dest[i] =='\0' )
					return -100 ;

				buf[j]=ds_Dest[i] ;
				i++ ;
				j++ ;
				
			}
			buf[j]='\0';
		
			if( buf[0] >= '0' && buf[0] <= '9' )
			    return atoi(buf);
			else
				return -10000;
		}

		i++ ;
	}
	printf("查找不成功所需时间:%d\n",timeGetTime()-time);
	return -10000;
}

//-------------------------------------------------------------------
// 字符解码调用函数
// 在一串字符中寻找ds_Search中后的数据
// 有浮点型 整形 字符型 
//  
//
//------------------------------------------------------------------
int DS_ReturnString(char *ds_Dest,char ds_Search,char *buf )
{
	long time = timeGetTime();
    int i=0;

	while( ds_Dest[i] != '\0' )
	{
		
		if( ds_Dest[i] == ds_Search )
		{
			
			int j = 0;
			i++;
            
			while( ds_Dest[i] != '*' )
			{
			
				if( ds_Dest[i] =='\0' )
					return -1 ;
				buf[j]=ds_Dest[i] ;
				i++ ;
				j++ ;
				
			}
			buf[j]='\0';
			return 1;
		}

		i++ ;
		
	}
	printf("查找不成功所需时间:%d\n",timeGetTime()-time);
	return 0;
}
//---------------------------------------------------------------------------
//用于获取当前字符的位置
//
//
//----------------------------------------------------------------------------
int DS_ReturnCharPosition(char *ds_Dest,char ds_Search)
{
    long time = timeGetTime();
    int i=0;

	while( ds_Dest[i] != '\0' )
	{
		
		if( ds_Dest[i] == ds_Search )
		   return i ;
		i++ ;
		
	}
	printf("查找不成功所需时间:%d\n",timeGetTime()-time);
	return -1;
}
//---------------------------------------------------------------------------
//用于测试当前耗时
//
//
//----------------------------------------------------------------------------
void DS_PrintTime( long time )
{
  printf( " 程序耗时:%d \n " , timeGetTime()-time );
}
//-------------------------------------------------
//获得当前时间
//
//
//------------------------------------------------------
void DS_GetCurrentTime(char timeBuf[])
{
    struct tm *p;
	long ltime;
	time(&ltime);
	p=localtime(&ltime);
	strftime(timeBuf,25,"%a %d %b %Y %H:%M:%S",p);
}
//---------------------------------------------------
//打印当前时间
//
//
//------------------------------------------
void DS_PrintCurrentTime( char *ds_Msg )
{
	char buf[29];
	struct tm *p;
	long ltime;
//	_strtime(buf);
//	printf("当前时间为:\t\t\t\t%s\n", buf);
//	_strdate(buf);
//	printf("当前日期为:\t\t\t\t%s\n", buf); 
	time(&ltime);
	p=localtime(&ltime);
	strftime(buf,29,"%a %d %b %Y %H:%M:%S GMT",p);
	printf("%s时间:%s\n",ds_Msg,buf);

}


文件三:DSObject.h

//-------------------------------------------------------------
//DSObject.h
// 用于对系统的调度
//
//---------------------------------------------------------------

#ifndef _DSOBJECT_
#define _DSOBJECT_

//DSENEMY 指当前为敌人 DSBULLET 指当前类型为子弹
//DSPLAYER 指当前类型为自已 DSHEAD 指当前类型为头结点 
enum OBJECT_TYPE { DSENEMY,DSBULLET,DSPLAYER,DSHEAD,DSNULL};
enum NETOBJECT_TYPE{ DSRED,DSBLUE,DSNETOTHERS,DSNETHEAD,DSNETNULL};

struct D3DXVECTOR3 
{
	float x ;
	float y ;
	float z ;
};

class DSObject
{
public :
	DSObject( OBJECT_TYPE ds_Type );
	DSObject();

	~DSObject();

   virtual HRESULT  DS_InitObject();//用于对象的初始化
   virtual void     DS_FrameMove( );//用于计算 
   virtual void     DS_RenderScene();//用于渲染
   virtual void     DS_CleanUp();//清空处理

   //用于网络对象的帧刷新
   virtual HRESULT  DS_NetFrameMove();
   //用于该对象的显示
   virtual void   DS_NetRenderScene();
   
   
public:
	DSObject        *ds_Previous; //前驱结点
	DSObject        *ds_Next;   //后继寻点

	OBJECT_TYPE     ds_Type;  //对象的类型
	bool            ds_Active;//是否处于存活状态
	int             ds_Health;//目前的生命值
	
	int             ds_ID ;//对象的ID号
	NETOBJECT_TYPE  ds_NetType ;//其网络类型
    char            ds_Username[20]; //客户机姓名

	float           ds_Radius;//碰撞半径
	D3DXVECTOR3     ds_CurrentPos;//当前位置 
	int             ds_Score ;//记录当前的战绩
};

#endif


文件四:DSObject.cpp

//-------------------------------------------------------------
//DSObject.cpp
// 用于对系统的调度
// 是DSEnemy DSPlayer DSBullet 的父类
//--------------------------------
  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
一个服务器对多个客户端的MFC Socket编程示例(实现简单的即时通讯功能) 环境:Windows XP SP3、 VC++ 6.0、 Windows 2003 SDK 使用步骤: 1、下载解压之后,使用VC++ 6.0打开两个工程:一个是SocketServer和一个ClientSocket工程。 2、首先运行服务器端工程,选默认的端口1008 3、然后运行客户端工程,选默认的端口1008和默认的服务器地址 4、再运行多个客户端进程 5、如果一切正常,可以每个客户端的消息发送,我们可以在服务端和各个客户端同步看到消息 实现一个服务器对多个客户端的关键是,在服务端的使用集合CPtrList类用保存客户端的socket对象,思想与Java中的编程思想一样,只不过Java中会使用多线程技术,在Vector集合保存客户端的socket对象 ,而MFC框架提供了CSocket类,它是一个异步通信的类,所以看上去代码比较Java的多线程代码简单的实现了一个对多的即时通讯功能。另外,MFC提供了CSocketFile类和CArchive类与CSocket类实现了C++网络通讯编程功能。 本示例注释非常详细,所有的辅助类都放一个util目录中,然后在工程中分了一个目录来管理这些辅助类,使用代码非常清晰。手动书写部分的代码是按Java的规范书写,当然其它代码由IDE生成的,所以是MS的风格,所以当你看代码时,只要是使用“骆驮命名法”的方法都是本人书写的功能性代码。 参看的思路:在服务端要从回调方法onAccept读起;而客户端代码主要从OnSendButton方法读起,即可理解整个代码的意思。 阅读对象:具有Java的Socket编程经验的人员,并且希望能够书写出比Java效率更高的即时通讯程序的人员
### 回答1: Qt是一个跨平台的GUI库,其中包含网络通信方面的工具类,例如Qt网络模块提供了许多用于网络编程的类和函数。在Qt网络模块中,可以使用QTcpSocket类和QUdpSocket类来实现TCP和UDP协议的网络通信C++是一种面向对象的编程语言,可以用于开发各种类型的应用程序。Qt网络模块提供的类和函数是使用C++编写的。 Socket是一种网络编程的概念,它是一组用于网络通信的API。基于Socket编程,可以实现不同主机之间的通信,比如客户端和服务器之间的通信。 综上所述,Qt C++中的Socket编程是指使用Qt网络模块提供的QTcpSocket类和QUdpSocket类来实现TCP和UDP协议的网络通信。通过Socket编程,可以实现客户端和服务器之间的通信,以及不同主机之间的数据传输。使用Qt C++进行Socket编程,可以实现跨平台的网络通信,包括Windows、Linux等操作系统平台。 ### 回答2: Qt是一款跨平台的GUI应用程序开发框架,能够快速开发高质量的界面应用程序。而C语言是一种通用、高效的编程语言,二者结合使用可以开发出高效、可靠的应用程序。 Socket(套接字)是一种通信协议,用于在不同的计算机之间进行通信。在Qt中,可以使用Qt网络模块来实现套接字通信。Qt网络模块提供了一个QTCPSocket类,它允许应用程序像创建文件描述符一样创建套接字,并使用类似I/O的方式来发送和接收数据。 通过使用QTCPSocket类,我们可以轻松地实现TCP/IP协议的通信,如实现客户端和服务器之间的通信。在客户端中,我们可以使用QTCPSocket类创建一个套接字对象,并连接到服务器;而在服务器端,我们可以使用QTCPServer类监听客户端的连接请求,并在收到连接请求后创建一个QTCPSocket对象实现双向通信。 总之,Qt C Socket提供了一种方便、快捷的方式来实现套接字通信,适用于需要进行网络通信的各种应用程序开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值