为什么一般的网络游戏客户端不直接发送Sql语句到服务端?

iorsafeqq22 2010-10-20 09:55:34
如客户端发送命令,在服务端的某张表中插入一个新的记录。
书上定义了如下数据结构:
表名+字段名+字段值的形式,具体如下:
Table+colum1+data1+colum2+data2的形式

书上说这样做的好处是:服务端对数据库的操作可以抽象化,但我不明白。

反而我觉得直接发送一条完整的sql语句比上面的更好,原因如下:
服务端接收到sql语句后,直接调用execute()方法,操作数据库,
而对于自己定义的格式,还要解析成对应的sql语句,
浪费服务端程序的处理时间,服务端程序应该力求函数处理的高效,

如果大家认为自定义格式好,能说出它比直接发送sql语句要好的理由吗?请具体点。
对于解析成Sql语句的时间,大家是不是认为时间太短可以忽略呢?
...全文
263 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
手机写程序 2010-11-03
  • 打赏
  • 举报
回复
补充下,数据库有连接数的限制.
awjx 2010-11-01
  • 打赏
  • 举报
回复
第一是安全问题
第二是设计问题,即客户端还要关心服务器的数据库结构?你的头脑里有“接口”的概念吗?
  • 打赏
  • 举报
回复
把数据服务器暴露给客户安全。
nodeserver 2010-10-26
  • 打赏
  • 举报
回复
随便找个网络游戏Server端看一下就知道了。往往他们的客户端发送数据到server的时候,会由server端进行监听。然后转发给数据库服务器上的一个server。再返回!
如果直接传输sql串。如果加密算法被破解。那。。。。我无敌了!!!
傻X 2010-10-22
  • 打赏
  • 举报
回复
1.直接发SQL太容易被破解,(SQL语句格式就那几个种)
2.数据量太大,用自定义的协议可以节省不少发送资源。
weixiaohua 2010-10-22
  • 打赏
  • 举报
回复
我想主要是安全方面考虑吧.
直接发送SQL语句对于服务器来说还要解析SQL语句做安全方面的判断,与其这样还不如直接
发送个消息号,告诉服务器需要做什么操作,然后服务器组合需要的SQL语句就可以了.
hslinux 2010-10-22
  • 打赏
  • 举报
回复
术业有专攻,游戏客户端就要有游戏客户端的样子,只负责数据收集和服务器端反馈回来的数据进行显示、操作即可,其他的逻辑处理就交由服务器处理就好。
如果是自己写的客户端服务器,想怎么样折腾都行。。。。。。

------至于:
把SQL发过去?安全吗?直接就被人家破解了。
------
如果真的觉得客户端组合SQL语句比较爽,还是可以那样做的,数据破解就破解呗,,实际操作的时候总是需要采取一些措施进行数据校验数据保护的。
LuciferStar 2010-10-22
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 liyan 的回复:]
商用数据服务,优先考虑的不是效率,是安全。
至于资源,总是冗余的,咱不差钱,缺啥,可以再买!
[/Quote]

赞同!为啥银行、医保的终端交易会很慢,就是这个原因。
Sou2012 2010-10-22
  • 打赏
  • 举报
回复
1. 一个SQL怎么也得几十个字符吧? 而发一个简单的协议可能只有2字节就够了。
节省带宽又安全。

2. 把SQL发过去?安全吗?直接就被人家破解了。

liyan 2010-10-21
  • 打赏
  • 举报
回复
商用数据服务,优先考虑的不是效率,是安全。
至于资源,总是冗余的,咱不差钱,缺啥,可以再买!
liyan 2010-10-21
  • 打赏
  • 举报
回复
楼主!!!!!!!
首先更正一点!
所有的商用客户端服务器程序中,数据收发,都是加密或自字义格式的,不可能是标准SQL的。
至于你说的游戏服务器!嘿嘿!
通常游戏服务器不太选用SQL作为数据服务器,即使是你最常见到的传奇类的服务器,也是用的DBE体系,这是BORLAND公司的东西。通常搭配是,DELPHI的调度器,和游戏服务器,DEB的数据服务。当然,DEB是支持SQL语句的。但它绝不可能允许你在客户直接执行服务器的SQL指令的。这点至关重要。

再一点!作为商用系统的游戏服务器,绝不可能允许你在客户端执行相关的数据脚本的。
即使由你提交,也是服务端过滤转换之后执行的,也就是说,你直接执行的,不一定是SQL,即使数据服务器是SQL的。

最现实的观点是,你得盼着,某些服务器体系,数据服务器是SQL,并且,端口是打开的,并且,你有权限,并且,你知道他的端口,并且,你能猜出他的表名,数据字段的名字,等等。倒不是没有可能,试试吧。估计十年八年,能找到一个这样的服务器的。

liyan 2010-10-21
  • 打赏
  • 举报
回复
一半
另一个原因你仔细看
lijianli9 2010-10-21
  • 打赏
  • 举报
回复
如果这样的话,服务端就变的很被动了,
iorsafeqq22 2010-10-21
  • 打赏
  • 举报
回复
就是说为了安全,不直接发送sql串,
还有就是发送的内容要加密转换,可以这样理解吗?
iorsafeqq22 2010-10-21
  • 打赏
  • 举报
回复
谢谢各位的回答
m_tornado 2010-10-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 luciferstar 的回复:]

被抓包,就,哈哈。。。
[/Quote]

恩,被破解了就惨了,加密做的不好hook发送后把buf修改了就~
LuciferStar 2010-10-20
  • 打赏
  • 举报
回复
被抓包,就,哈哈。。。
mayudong1 2010-10-20
  • 打赏
  • 举报
回复
至少使用自定义的格式可以少传输一点东西
你也可以定义一个协议就用来发送sql语句,没人说这样不行
iorsafeqq22 2010-10-20
  • 打赏
  • 举报
回复
发送数据包的格式是:
包数据长度+数据

如果直接是发送sql语句,服务端接先读取包数据长度,再根据长度,读取sql语句,接收直接执行sql语句。

而如果发送Table+colum1+data1格式的非sql语句,那么,在接受到数据后,多了解析sql语句这一步,

我感觉这一步是多余的,发送时特意不发送sql语句,到了服务端再组合成sql语句,
那还不如直接发送sql语句来的简单省事。
iorsafeqq22 2010-10-20
  • 打赏
  • 举报
回复
打错了是
发送到服务端
加载更多回复(2)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧