服务器是现在网络游戏一个必不可少的部分。例如手机游戏<动友大富翁>、<斗地主>等,这都需要依赖于服务器。下面是一个游戏登录、注册界面,图10-1是游戏登录界面,图10-2是游戏注册界面。

图10-1

图10-2

10.1 概念

Web服务器是网络最重要的服务器,是直接服务于用户的服务器,通俗的讲,Web服务器传送(serves)页面使浏览器可以浏览,然而应用程序服务器提供的是客户端应用程序可以调用(call)的方法(methods)。确切一点,你可以说:Web服务器专门处理HTTP请求(request),但是应用程序服务器是通过很多协议来为应用程序提供(serves)商业逻辑(business logic)。

JSON(JavaScriptObject Notation) 是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。

SQL(Structured Query Language)结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。

10.2 游戏登录、注册例程实现

下面通过游戏登录、注册的例程,解释如何使用MC工具进行数据库连接。

10.2.1 服务器搭建

1.        准备工作

以下配置的环境都是在window 7下。

首先要到准备一下软件,需要安装软件是MicrosoftVisual Studio 2008、Microsoft SQL Server 2008。

Microsoft SQLServer 20088企业版下载: http://www.microsoft.com/zh-cn/SQLServer/default.aspx

MicrosoftVisual Studio 2008企业版下载: http://www.microsoft.com/visualstudio/zh-cn

务必要把软件安装成功,否则后面的工作无法进行。如有问题可以参考如下网址资料:

http://hi.baidu.com/goodyishao/item/3453c0c69d61e26ff6c95d08

http://blog.sina.com.cn/s/blog_7028ff940100l3i7.html

IIS安装

1)  进入Win7的<控制面板>,选择左侧的<打开或关闭Windows功能>。

2)  现在出现了安装Windows功能的选项菜单,注意选择的项目,我们需要手动选择需  要的功能,下面这张图片把需要安装的服务都已经选择了,大家可以按照图10-3片勾选功能。

图10-3

3)  安装完成后,再次进入<控制面板>,选择<管理工具>,双击<Internet(IIS)管理器>选项,进入IIS设置。

4)  现在进入到IIS7控制面板。

5)  选择 Default Web Site,并双击 ASP 的选项。

6)  IIS7中<ASP 父路径>是没有启用的,要<开启父路径>,选择True,选定父路径选项。

7)  配置IIS7的站点。 单击右边的<高级设置>选项,可以设置网站的目录。

8)  点击右侧的<绑定>,设置网站的<端口>。

9)  点击<默认文档>, 设置网站的默认文档。

2.        创建服务器

服务器是用C#的Web来创建的服务器,项目名字WebService,如下图10-4所示:

图10-4

在服务器中创建DataBaseHelper类来操作数据库数据,比如上面注册用户,那意味着要在数据库中插入数据,而在GsoapBLLServiceJson类中提供一个接口DC_Registernfo用来注册用户。在登陆时要查询数据库中是否有这个用户,还要判断密码是否正确,GsoapBLLServiceJson类也提供一个DC_Login接口来处理。具体实现步骤如下代码如下所示:

1、创建DataBaseHelper用来连接数据库,断开数据库和更新数据、删除数据、添加数据等。如下所示:

usingSystem;

usingSystem.Data;

usingSystem.Data.SqlClient;

usingSystem.Configuration;

namespace GsoapDAL

{

public class DataBaseHelper

{

#region 属性

/// <summary>

/// 连接字符串

/// </summary>

privatestring connectString;

/// <summary>

/// 连接数据库对象

/// </summary>

privateSqlConnection connection;

/// <summary>

/// 控制数据访问对象

/// </summary>

privateSqlCommand command;

/// <summary>

/// 控制适配器

/// </summary>

privateSqlDataAdapter dataAdapter;

#endregion

#region 构造方法

publicDataBaseHelper()

{

//获取连接字符串。

this.connectString= ConfigurationManager.ConnectionStrings["ConnectionStrings"].ConnectionString;

}

#endregion

#region 方法

#region 打开连接

privatevoid Open()

{

this.connection= new SqlConnection(this.connectString);

if(ConnectionState.Open != this.connection.State)

{

this.connection.Open();

}

}

#endregion

#region 关闭连接

privatevoid Close()

{

if(ConnectionState.Closed != this.connection.State)

{

this.connection.Close();

this.connection.Dispose();

}

}

#endregion

#region 查询多行数据

/// <summary>

/// 执行筛选操作

/// </summary>

/// <paramname="sql">筛选的SQL语句</param>

/// <paramname="param">语句中所相关的参数</param>

/// <returns>DataTable类型数据集</returns>

public DataTable Select(stringsql, SqlParameter[] param)

{

//实例化一个控制访问对象,和连接对象,并初始化连接字符串

this.command= new SqlCommand();

this.connection= new SqlConnection(this.connectString);

this.command.Connection= this.connection;

//如果参数不为空,则给控制访问对象添加参数

if(param != null)

{

this.command.CommandText= sql;

}

//初始化sql语句,实例化适配器和数据集

foreach(SqlParameter p inparam)

{

this.command.Parameters.Add(p);

}

this.dataAdapter= new SqlDataAdapter(this.command);

DataTabledt = new DataTable();

//执行语句,如果错误,抛出异常。

try

{

this.dataAdapter.Fill(dt);

}

catch(Exception ex)

{

thrownew Exception(ex.Message);

}

finally

{

this.command.Dispose();

this.dataAdapter.Dispose();

}

returndt;

}

#endregion

#region 查询一行数据

/// <summary>

/// 执行一条SQL语句,返回一个对象,该对象为语句的第一行第一列。

/// </summary>

/// <paramname="sql">>筛选的sql语句</param>

/// <paramname="param">sql语句的相关参数</param>

/// <returns>返回一个对象</returns>

public object SelectOne(stringsql, SqlParameter[] param)

{

//实例化一个控制语句和初始化SQL语句

this.command= new SqlCommand();

this.command.CommandText= sql;

//为控制语句添加参数

foreach(SqlParameter p inparam)

{

this.command.Parameters.Add(p);

}

//打开连接,使控制访问对象获取当前连接

this.Open();

this.command.Connection= this.connection;

//初始化一个对象,此将做返回。

objecto = null;

//执行sql语句,如果发现异常抛出。

try

{

o = this.command.ExecuteScalar();

}

catch(Exception ex)

{

thrownew Exception(ex.Message);

}

finally

{

this.Close();

this.command.Dispose();

}

returno;

}

#endregion

#region 更新数据、删除数据、添加数据

/// <summary>

/// 执行非查询语句

/// </summary>

/// <param name="sql">sql</param>

/// <paramname="param">sql的相关参数</param>

/// <returns>返回影响行数</returns>

public int UDIManager(stringsql, SqlParameter[] param)

{

//实例化一个控制语句和初始化SQL语句

this.command= new SqlCommand();

this.command.CommandText= sql;

//为控制语句添加参数

foreach(SqlParameter p inparam)

{

this.command.Parameters.Add(p);

}

//打开连接,使控制访问对象获取当前连接

inte = -1;

this.Open();

this.command.Connection= this.connection;

//执行sql语句,如果发现异常抛出。

try

{

e = this.command.ExecuteNonQuery();

}

catch(Exception ex)

{

throw new Exception(ex.Message);

}

finally//关闭联机,销毁控制访问对象。

{

this.Close();

this.command.Dispose();

}

returne;

}

/// <summary>

/// 执行非查询语句(重载UDIManager)

/// </summary>

/// <paramname="sql">SQL语句</param>

/// <paramname="param">参数</param>

/// <paramname="id">标识,判断是否返回ID</param>

/// <returns>返回ID</returns>

public int UDIManager(stringsql, SqlParameter[] param, bool id)

{

//实例化一个控制语句和初始化SQL语句

this.command= new SqlCommand();

this.command.CommandText= sql + " SELECT @@IDENTITY";

//为控制语句添加参数

foreach(SqlParameter p inparam)

{

this.command.Parameters.Add(p);

}

//打开连接,使控制访问对象获取当前连接,初始化影响行数(e=-1).

inte = -1;

this.Open();

this.command.Connection= this.connection;

//执行sql语句,如果发现异常抛出。

try

{

e = Convert.ToInt32(this.command.ExecuteScalar());

}

catch(Exception ex)

{

thrownew Exception(ex.Message);

}

finally//关闭联机,销毁控制访问对象。

{

this.Close();

this.command.Dispose();

}

returne;//返回结果

}

#endregion

#endregion

#region 存储过程

// 用指定的参数值列表为存储过程参数赋值。

privatevoid AssignParameterValues(SqlCommand sqlCommand, paramsobject[] paraValues)

{

if(paraValues != null)

{

if((sqlCommand.Parameters.Count - 1) != paraValues.Length)

{

thrownew ArgumentNullException("The number of parameters does not match number ofvalues for stored procedure.");

}

for(int i = 0; i < paraValues.Length; i++)

{

sqlCommand.Parameters[i +1].Value = (paraValues == null) ? DBNull.Value : paraValues;

                }

            }

        }

        // 创建用于执行存储过程的 SqlCommand。

privateSqlCommand CreateSqlCommand(SqlConnection connection, stringstoreProcedureName)

{

SqlCommandcommand = new SqlCommand(storeProcedureName,connection);

command.CommandType = CommandType.StoredProcedure;

returncommand;

}

/// <summary>

/// 从在 System.Data.SqlClient.SqlCommand 中指定的存储过程中检索参数信息并填充指定的

/// System.Data.SqlClient.SqlCommand 对象的System.Data.SqlClient.SqlCommand.Parameters 集  合。

/// </summary>

/// <paramname="sqlCommand">将从其中导出参数信息的存储过程的 System.Data.SqlClient.SqlCommand 对象。</param>

internalvoid DeriveParameters(SqlCommandsqlCommand)

{

try

{

sqlCommand.Connection.Open();

SqlCommandBuilder.DeriveParameters(sqlCommand);

sqlCommand.Connection.Close();

}

catch(Exception ex)

{

if(sqlCommand.Connection != null)

{

sqlCommand.Connection.Close();

}

thrownew Exception(ex.Message);

}

}

/// <summary>

/// 执行操作类(Insert/Delete/Update)存储过程。

/// </summary>

/// <paramname="storeProcedureName">存储过程的名称</param>

/// <paramname="param">传递给存储过程的参数值列表。</param>

/// <returns>受影响的行数。</returns>

        public int ExecuteNonQuery(stringstoreProcedureName, params object[] paraValues)

        {

using(SqlConnection connection = new SqlConnection(this.connectString))

{

SqlCommandcommand = this.CreateSqlCommand(connection,storeProcedureName);

try

{

this.DeriveParameters(command);

this.AssignParameterValues(command,paraValues);

connection.Open();

intaffectedRowsCount = command.ExecuteNonQuery();

returnaffectedRowsCount;

}

catch(Exception ex)

{

thrownew Exception(ex.Message);

}

}

}

/// <summary>

/// 执行存储过程,返回 System.Data.DataTable。

/// </summary>

/// <paramname="storeProcedureName">存储过程的名称</param>

/// <paramname="param">传递给存储过程的参数值列表。</param>

/// <returns>包含查询结果的 System.Data.DataTable。</returns>

public DataTable ExecuteDataTable(string storeProcedureName, params object[] paraValues)

{

using(SqlConnection connection = new SqlConnection(this.connectString))//创建连接对象

{

SqlCommandcommand = this.CreateSqlCommand(connection,storeProcedureName);  // 创建用于执行存储过程的 SqlCommand。

try

{

this.DeriveParameters(command);//打开数据库

this.AssignParameterValues(command,paraValues);//为存储过程赋参数值

SqlDataAdapteradapter = new SqlDataAdapter(command);创建DataAdapter数据适配器实例

DataTabledataTable = new DataTable();

adapter.Fill(dataTable);

returndataTable;

}

catch(Exception ex)

{

thrownew Exception(ex.Message);

}

}

}

/// <summary>

/// 执行存储过程,返回 System.Data.DataSet。

/// </summary>

/// <paramname="storeProcedureName">存储过程的名称</param>

/// <paramname="param">传递给存储过程的参数值列表。</param>

/// <returns>包含查询结果的 System.Data.DataSet。</returns>

public DataSet ExecuteDataSet(stringstoreProcedureName, params object[] paraValues)

{

using(SqlConnection connection = new SqlConnection(this.connectString))

{

SqlCommandcommand = this.CreateSqlCommand(connection,storeProcedureName);

try

{

this.DeriveParameters(command);

this.AssignParameterValues(command,paraValues);

SqlDataAdapteradapter = new SqlDataAdapter(command);

DataSetdataSet = new DataSet();

adapter.Fill(dataSet);

returndataSet;

}

catch(Exception ex)

{

thrownew Exception(ex.Message);

}

}

}

/// <summary>

/// 执行存储过程,填充指定的 System.Data.DataTable。

/// </summary>

/// <paramname="storeProcedureName">存储过程的名称</param>

/// <paramname="dataTable">用于填充查询结果的 System.Data.DataTable。</param>

/// <paramname="param">传递给存储过程的参数值列表。</param>

public void ExecuteFillDataTable(stringstoreProcedureName, DataTable dataTable, params object[]paraValues)

{

using(SqlConnection connection = new SqlConnection(this.connectString))

{

SqlCommandcommand = this.CreateSqlCommand(connection,storeProcedureName);

try

{

this.DeriveParameters(command);

this.AssignParameterValues(command,paraValues);

connection.Open();

SqlDataAdapteradapter = new SqlDataAdapter(command);

adapter.Fill(dataTable);

}

catch(Exception ex)

{

thrownew Exception(ex.Message);

}

}

}

/// <summary>

/// 执行存储过程返回 System.Data.SqlClient.SqlDataReader,

/// 在 System.Data.SqlClient.SqlDataReader 对象关闭时,数据库连接自动关闭。

/// </summary>

/// <paramname="storeProcedureName">存储过程的名称</param>

/// <paramname="param">传递给存储过程的参数值列表。</param>

/// <returns>包含查询结果的 System.Data.SqlClient.SqlDataReader 对象。</returns>

public SqlDataReader ExecuteDataReader(string storeProcedureName, paramsobject[] paraValues)

{

using(SqlConnection connection = new SqlConnection(this.connectString))

{

SqlCommandcommand = this.CreateSqlCommand(connection,storeProcedureName);

try

{

this.DeriveParameters(command);

this.AssignParameterValues(command,paraValues);

connection.Open();

returncommand.ExecuteReader(CommandBehavior.CloseConnection);

}

catch(Exception ex)

{

thrownew Exception(ex.Message);

}

}

}

/// <summary>

/// 执行查询,并返回查询所返回的结果集中第一行的第一列。忽略其他列或行。

/// </summary>

/// <paramname="storeProcedureName">存储过程的名称</param>

/// <paramname="param">传递给存储过程的参数值列表。</param>

/// <returns>结果集中第一行的第一列或空引用(如果结果集为空)。</returns>

public object ExecuteScalar(stringstoreProcedureName, params object[] paraValues)

{

using(SqlConnection connection = new SqlConnection(this.connectString))

{

SqlCommandcommand = this.CreateSqlCommand(connection,storeProcedureName);

try

{

this.DeriveParameters(command);

this.AssignParameterValues(command,paraValues);

connection.Open();

returncommand.ExecuteScalar();

}

catch(Exception ex)

{

thrownew Exception(ex.Message);

}

}

}

#endregion

}

}

2、创建类StateMethods来转换格式,代码如下:

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

usingSystem.Text.RegularExpressions;

namespaceGsoapDTL

{

public class StateMethods

{

#region 从C语言中移植的sscanf函数

public static unsafe bool sscanf(stringstr, string format, paramsvoid*[] args)

{

try

{

AnalyzeResultanalyze = sscanfAnalyze(format);

Regexregex = new Regex(analyze.OutString);

Matchm = regex.Match(str);

if(m.Success == false) returnfalse;

for(int i = 0; i < analyze.formats.Length; i++)

{

stringblock = m.Groups[(i + 1).ToString()].Value;

switch(analyze.formats)

{

case 'c':

*((char*)args) = block[0];

break;

case 'd':

*((int*)args)= int.Parse(block);

break;

case 'x':

*((int*)args) = int.Parse(block,System.Globalization.NumberStyles.HexNumber);

break;

case's':

*((char**)args) = (char*)System.Runtime.InteropServices.Marshal.StringToCoTaskMemUni(block);

break;

case 'f':

*((float*)args) = float.Parse(block);

break;

}

}

returntrue;

}

catch

{

returnfalse;

}

}

static AnalyzeResult sscanfAnalyze(string format)

{

List<char> key = new List<char>();

key.Add('\\');

key.Add('^');

key.Add('[');

key.Add(']');

key.Add('(');

key.Add(')');

key.Add('{');

key.Add('}');

key.Add('.');

key.Add('*');

key.Add('?');

key.Add('|');

key.Add('+');

key.Add('$');

AnalyzeResultresult = new AnalyzeResult();

StringBuildersb = new StringBuilder();

List<char> fmt = new List<char>();

inti, n;

charnow;

for(i = 0, n = format.Length; i < n; i++)

{

now = format;

if(key.Contains(now)) //剔除关键字

{

sb.Append('\\');

sb.Append(now);

}

elseif (now == '%')//转义

{

now = format[++i];

switch(now)

{

case '%':

sb.Append(now);

break;

case 'c':

sb.Append(@"(.)");

fmt.Add(now);

break;

case 'd':

sb.Append(@"([+-]?\d+)");

fmt.Add(now);

break;

case 'x':

sb.Append(@"(0x[0-9a-fA-F]+)");

fmt.Add(now);

break;

case 's':

sb.Append(@"(\S+)");

fmt.Add(now);

break;

case 'f':

sb.Append(@"([+-]?\d+(?<null>\.\d+)?)");

fmt.Add(now);

break;

default:

throw new Exception("未识别的转义字符: %" +now);

}

}

else

{

sb.Append(now);

}

}

result.OutString = sb.ToString();

result.formats = fmt.ToArray();

returnresult;

}

struct AnalyzeResult

{

publicstring OutString;

publicchar[] formats;

}

#endregion

}

}

3、创建GsoapBLLServiceJson类来定义接口函数:

namespaceGsoapBLL

{

public class GsoapBLLServiceJson

{

public string CallGsoapServiceJson(stringparameters, string format, string serverName,)

{

switch(serverName)

{

case "DC_RegisterInfo":// 用户注册

returnDC_RegisterInfo(parameters, format);

case"DC_Login":    // 用户登陆

returnDC_Login(parameters, format);

}

}

#region 用户信息注册

public unsafe stringDC_RegisterInfo(string parameters, string format)

{

stringjsonString = string.Empty;

char*cName;

char*cPassword;

char*cPhoneNo;

StateMethods.sscanf(parameters,format, &cName, &cPassword, &cPhoneNo);

stringname = new string(cName);

stringpassword = new string(cPassword);

stringphoneNo = new string(cPhoneNo);

SqlParameter[] p= new SqlParameter[]

{

newSqlParameter("@name,@passwor,@phoneNo", name ,password,phoneNo);

};

stringsql = @"INSERT INTO USER_INFO (USER_NAME, USER_PASSWORD, SEX, USER_LEVEL_TYPE, WEALTH1, CELL_PHONE_NUMBER)

VALUES (@Name, @Password, 'M', 1, 0, @PhoneNo) ";

//执行插入语句

int count =helper.UDIManager(sql, p);

//成功返回1.失败返回2

if (count> 0)

{

response =1;

}

else

response = 2;

stringjsonString= new string(response);

returnjsonString;

returnjsonString;

}

}

#region 用户登陆

public unsafe string DC_Login(stringparameters, string format)

{

stringjsonString = string.Empty;

char*cLoginName;

char*cPassword;

StateMethods.sscanf(parameters,format, &cLoginName, &cPassword,);

stringLoginName= new string(cLoginName);

stringpassword = new string(cPassword);

SqlParameter[] p= new SqlParameter[]

{

newSqlParameter("@LoginNamee,@passwor",LoginName,passwor);

};

stringsql = @"SELECT * FROM USER_INFO

WHEREDONGYOU_CODE = @LoginNamee AND USER_PASSWORD = @Password )

//执行登陆语句

int count =helper.UDIManager(sql, p);

//成功返回1.失败返回2

if (count> 0)

{

response =1;

}

else

response= 2;

stringjsonString= new string(response);

returnjsonString;

}

}

转载于:https://www.cnblogs.com/mcgame/archive/2013/05/16/3081921.html

MC新手入门(五十)------服务器连接 一相关推荐

  1. 新手入门机器学习十大算法

    新手入门机器学习十大算法 2018年9月17日 磐石 TensorFlowNews, 机器学习 0 在机器学习的世界中,有一种被称为"无免费午餐"的定理. 它意在说明没有哪种算法能 ...

  2. 第五人格服务器维修是什么意思,第五人格镜像什么意思,第五人格服务器连接失败怎么办...

    游戏介绍:<第五人格>是由网易开发的非对称性对抗竞技类(Asymmetrical Battle Arena)游戏. 玩家将扮演侦探奥尔菲斯,在收到一封神秘的委托信后,进入恶名昭著的庄园调查 ...

  3. 罗马音平假名中文可复制_日语零基础入门五十音,日语零基础五十音图表

    日语零基础入门五十音,日语入门的最基本要求就是记住五十音图,但是这个记住不仅是你能背下来或是默写下来.而是你需对号入座! 下面是一张五十音图表. 即每个假名单独拿出来你要立马反应出来怎么读.其重要性甚 ...

  4. 第五人格为什么服务器正在维修中,第五人格服务器连接不上怎么办 服务器更新后无法进入原因...

    第五人格服务器连接不上怎么办 服务器更新后无法进入原因以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 第五人格服务器连接 ...

  5. MC新手入门(三十)------ 逻辑运算符和表达式

    游戏设计中提供了三种逻辑运算符: 1)&& 与运算 2)|| 或运算        3) !非运算 游戏设计中我们常常要用到上面的逻辑运算,例如:当在双人游戏中都要实现两人同时存活才能 ...

  6. MC新手入门(二十八)------ 顺序结构程序

    顺序结构是三种基本结构中最简单的一种结构.程序执行的顺序:按自上向下的顺序依次执行.如下流程图所示: 图5-2-1 游戏设计中提供了多种简单语句,可以组成各种不同形式的顺序结构. 如下所示: 图5-2 ...

  7. MC新手入门(十三)------ 添加游戏角色

    我们使用之前介绍的游戏开发工具MC来添加游戏角色.下面我们添加两个角色,一个为动态图片的角色,一个为静态图片的角色.如图4-1-1-1: 图4-1-1-1(左静右动) 首先,准备两组图片放在MC的根目 ...

  8. sqlserver 新手入门(链接服务器,初始化操作,创建用户,数据库)

    初始化 在刚安装好sqlserver组件后,需要对相关服务进行设置: 打开sqlserver配置管理器: tcp/ip设置为启用 启动服务,点击你想要的运行的实例,右键,启动 打开sql server ...

  9. 新手入门阿里云服务器操作指南(图文教程)

    最近阿里云活动很多小伙伴买了服务器却不知道怎么用,因此做一个简易的操作指南. 阿里云根据个人需要选合适的云服务器,选好cpu.内存.带宽,地域,这四个是主要的.其他可以默认选择. 一.控制台 控制台可 ...

最新文章

  1. 怎么通过ip连接oracle,Oracle 无法通过IP连接问题
  2. [蓝桥杯2016初赛]平方怪圈-数论,模拟
  3. Linux下XPath对xml解析
  4. 【ELK】之Kibana使用
  5. Dockerfile 中 配置安装 php 扩展
  6. 一个页面上多个form表单的用json数据格式提交到后台
  7. Python基础练习题,含答案解析
  8. 外贸收款(解析重点)——上海赢支付wintopay
  9. math_(函数数列)极限的含义误区和符号梳理/邻域去心邻域邻域半径
  10. 【fpga里Verilog语言的小知识点】
  11. 茅指数成分股投资收益可视化
  12. 【Java】JVM内存回收
  13. 【Unity3D实战】RPG黑暗之光Scene1:创建开始场景
  14. 关于php内部编码与mysql字符差异问题的研究
  15. Linux游戏 0 A.D安装及汉化
  16. 易优cms 模板制作教程
  17. keil .sct 文件的理解
  18. 数据劫持-发布订阅模式
  19. android l camera no panorama,camera预览是闪退的有关问题
  20. 学习英文-学以致用【场景:找朋友】

热门文章

  1. 《windows中GSX的管理》之四——cmware-cmd实例
  2. [分享]2007年创业给我们的提示
  3. python学习手册笔记——22.模块代码编写基础
  4. C++回顾day01---C++对C的增强
  5. SSH 用 top 命令查看 CPU 使用率
  6. 获取php数组的键名和值
  7. 位置信息网 http://www.LocationInfo.net
  8. C#中的参数传递(转)
  9. Feedburner关于Feed的思考
  10. c++ 浮点比较和浮点运算