佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 2793|回复: 16

Game(Socket) Server Framework

[复制链接]
发表于 28-8-2008 03:19 AM | 显示全部楼层 |阅读模式
请问谁有比较方便简洁的开源Game Server Framework可介绍?
支持
- data queuing
- 架构 C/C++ / Java / PHP / VB.net (其中之一)
- multi-servers
- event based
回复

使用道具 举报


ADVERTISEMENT

发表于 28-8-2008 09:15 AM | 显示全部楼层
回复

使用道具 举报

发表于 28-8-2008 09:54 AM | 显示全部楼层
如果你的要求只是免費的話
raknet其實是不錯的
回复

使用道具 举报

发表于 28-8-2008 03:41 PM | 显示全部楼层
这么巧,我也刚搞完一个需要用到winsock 的project。但却没用到什么framework
回复

使用道具 举报

 楼主| 发表于 28-8-2008 05:12 PM | 显示全部楼层
原帖由 tensaix2j 于 28-8-2008 03:41 PM 发表
这么巧,我也刚搞完一个需要用到winsock 的project。但却没用到什么framework


什么project?
我写着一个javascript based web game还在考虑是否使用Socket, standard AJAX or COMET
现在我要试用socket的frameworks,比较看看哪个方便。
再不然我应该会自己写.
回复

使用道具 举报

发表于 28-8-2008 08:11 PM | 显示全部楼层
原帖由 megablue 于 28-8-2008 05:12 PM 发表


什么project?
我写着一个javascript based web game还在考虑是否使用Socket, standard AJAX or COMET
现在我要试用socket的frameworks,比较看看哪个方便。
再不然我应该会自己写.



公事,不方便透露。 但跟game 没关系的。只是一个data stream agent。
在做什么game ? 说来听听。 commercial purpose 的吗?

在web browser 上,要做到有 socket client 这些功能,
我想 flash 也是不错的选择。 AS3.0 有binary socket, 早版的也有 xmlsocket。而且也是event based 的。
如果用browser 本身的 那个 xhr as socket client 的话,我也没什么研究 到底 怎么 keep connection alive。。。

至于socket server, 我觉得用 framework 或许会比较方便, 但有时觉得好像没用到那么多东西,却要安装那么多东西。。
自己写的话, 如果是用 interpreted script 就很简单,因为是 event based 的,可能会比较慢,  
但 用 c/c++  的话, 就要 自己 spawn thread 处理 各种asynchronous event 咯。。
回复

使用道具 举报

Follow Us
 楼主| 发表于 29-8-2008 01:46 AM | 显示全部楼层
原帖由 tensaix2j 于 28-8-2008 08:11 PM 发表



公事,不方便透露。 但跟game 没关系的。只是一个data stream agent。
在做什么game ? 说来听听。 commercial purpose 的吗?

在web browser 上,要做到有 socket client 这些功能,
我想 flash 也是不 ...


哦,没关系随口问问而已.
棋类的游戏. 写来赚取一点零钱算是商业用途吧.
对对...用framework感觉很heavy...但是为了省时省工....所以....
其实还未想清楚....很矛盾下.
写socket server不管有没有用framework在开发上都会比直接用standard ajax / Comet 更费时费力
socket server 却是反应最快... Comet 也是有相当程度的反应性但吃的server resource 会很高....
还有其实还未决定要用到event based 你觉得需要吗?

如果用C/C++我想也不会用到spawn threads. 会效仿PvPGN的写法, 使用single thread synchronous non-blocking I/O.

[ 本帖最后由 megablue 于 29-8-2008 01:56 AM 编辑 ]
回复

使用道具 举报

发表于 29-8-2008 09:17 AM | 显示全部楼层
没研究过 怎么做 non blocking read()  ,可以分享一下吗?

我的了解是, 通常send()可以马上return 因为不管有没有人去read。。
可是 read()的话, 系统不知 什么时候data 会来,所以不能马上return。。
除非 incoming data  invoke 一个 event, 然后, 在 event handler 那里 在 read()
也就是一般  scripting 里用的 event model. vb 也是如此。
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 31-8-2008 06:45 AM | 显示全部楼层

回复 8# tensaix2j 的帖子

原帖由 tensaix2j 于 29-8-2008 09:17 AM 发表
我的了解是, 通常send()可以马上return 因为不管有没有人去read。。
可是 read()的话, 系统不知 什么时候data 会来,所以不能马上return。。
除非 incoming data  invoke 一个 event, 然后, 在 event handler 那里 在 read()


通常不会让(timeout 都不会放 0)select马上return
至少要放 1mili second(注解select只能用sec 和micro sec) 以上
不然CPU 会被loop完全被占据

select 会通知你data 来了吗

来了之后就用buffer把不完整的data陆陆续续地收集起来
等data完整后再提出转成event...剩下不完整的部分就留在buffer里等待下一个完整的event

通常non-blocking 都会配合select()一起用

首先建立一组socks list
把所有的accept"ed" 的connections 都用FD_SET()放进那个list 里
select 会告诉你哪个socket 可以read / send / error
通常我们只需要检查read (我也不知道检查send / error 有什么用因为我所遇到的情况只要是可以read自然就可以send 以及没有error)

这是基本non-blocking socket的架构
怎样create socket我就skip 掉不讲了

setnonblocking(socket);

while(1)
{
checkNewConnection();
updateSocksList();
readsocks = select(socket,&sockslist, (fd_set *) 0, (fd_set *) 0, &timeout);
if(readsocks > 0)
//read data from sockets
//do something with the data
//you can send data as well in this stage
else if (readsocket == 0)
//no data to read
//you can send data as well in this stage
//continue the loop
else
//socket error
//get the error code
//translate the error
//exit the loop
}



照这样说....基本上什么都可以是event了
以我的棋游戏...暂时想到Events的就有...
onTimeout
onActionReceive
onEndGame
onInit

[ 本帖最后由 megablue 于 31-8-2008 07:08 AM 编辑 ]
回复

使用道具 举报

发表于 31-8-2008 11:00 AM | 显示全部楼层
原来是用select , 又学到东西了。。

这几年来都一直在 写 script, 所有event loop都已有现成的

不过, 还有个 问题。。
checkNewConnection() 也是non blocking 的吗?
我记得 用thread 的做法 是 其中一个 thread 是负责 listen to incoming connection, 但是 blocking wait的。。
for(;;){
   s = listen();  //block 住等
         // spawn thread to handle socket
}

[ 本帖最后由 tensaix2j 于 31-8-2008 11:01 AM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 31-8-2008 10:11 PM | 显示全部楼层
原帖由 tensaix2j 于 31-8-2008 11:00 AM 发表
原来是用select , 又学到东西了。。

这几年来都一直在 写 script, 所有event loop都已有现成的

不过, 还有个 问题。。
checkNewConnection() 也是non blocking 的吗?
我记得 用thread 的做法 是 其中 ...


是的. 你的"listening" socket (通常是指你第一个做出来的socket) set 去non-blocking后checkNewConnection() 里的accept()就不会block了(同样可以设定timeout)

其实我对multi-threads的认识很浅.之前有试过做multithread 的blocking read.
做到一塌糊涂.结果还是用自己比较熟悉的non-blocking read.
我的做法是每一次blocking accept一个connection 就开一个新的thread来进行blocking read
结果后来想到...如果有5000千个connections 岂不是有5000个threads
这样的话performance应该大打折扣

non-blocking就可做到不用同时等待5000connections但 non-blocking在进行处理 read data 时还要注意一点就是...
尽量把里边的process做到最精简快速...因为是single thread如果处理花费的时间太久,就会严重影响所有的connections的速度.
这也是我一直做到不够好的地方. 重写了event loop好几次还是不能达到超级顺畅的效果,时不时会有”停顿“效应.
最大的可能性是我在选择开发语言时做了错误的选择...我用了PHP。本来只是为了写个prototype来做实验怎知道,写写下把大部分功能都完完整整的做了出来...由于code太多了也懒得port去C++了(借口).

[ 本帖最后由 megablue 于 31-8-2008 10:33 PM 编辑 ]
回复

使用道具 举报

发表于 1-9-2008 09:20 PM | 显示全部楼层
说的有道理,不过,仔细想想。。

5000 个connection, 可能有4000个client 同时送来data。。
那么, 一个cycle 只处理一个的话,
最后那个第4000 个人必须等  4000× 2 × 0.001 假设 checknewconnection跟 read的timeout是0.001秒,
也就是差不多八秒 在加上那些 non blocking 的 instruction 的execution time

假设,single core的电脑,mt 的 情况 也就是 time slice 的话, 每个人所平分的时间应该不到一秒。。。
但这是 没考虑 thread 去 thread 的 overhead 。。。



不晓得php, 但我用 tcl 几乎event loop都不用亲自写。。只是写 event handler 而已。 不过,如果真的要处理 5000个connection,还是用 compiled 的比较好吧。。。scripting 好像慢了点。。。

[ 本帖最后由 tensaix2j 于 1-9-2008 09:27 PM 编辑 ]
回复

使用道具 举报

发表于 2-9-2008 10:56 AM | 显示全部楼层

回复 11# megablue 的帖子

對於這個問題的話
你可能可以試試用thread pool的design來implement
你有一個固定數目的thread pool
然後每個connection都是一個task
讓thread pool里的thread分別處理那些connection
當一個connection正在blocking時
那個thread可以馬上換去處理別個task
這樣子的話當你有很多connection時你就不需要spawn一大堆的thread了

這個其實是一個java的threading feature來的
我也不是很清楚它是怎麼implement的
回复

使用道具 举报

发表于 2-9-2008 04:48 PM | 显示全部楼层
checkNewConnection 的 socket 是可以放在 sockslist 里的;
否则假如没有 incoming packet 而 timeout 又很高的话,
accept 的反应会很慢。
回复

使用道具 举报

 楼主| 发表于 2-9-2008 08:36 PM | 显示全部楼层
原帖由 iquit 于 2-9-2008 04:48 PM 发表
checkNewConnection 的 socket 是可以放在 sockslist 里的;
否则假如没有 incoming packet 而 timeout 又很高的话,
accept 的反应会很慢。


我怎么没有想到
回复

使用道具 举报

发表于 16-9-2008 10:41 AM | 显示全部楼层
原帖由 iquit 于 2-9-2008 04:48 PM 发表
checkNewConnection 的 socket 是可以放在 sockslist 里的;
否则假如没有 incoming packet 而 timeout 又很高的话,
accept 的反应会很慢。


说的是。 我也是算错了。。忘了是没东西时才会timeout。有东西时就马上。。 


我想,有空时也尝试implement 一个
 
回复

使用道具 举报


ADVERTISEMENT

发表于 29-10-2008 11:51 AM | 显示全部楼层
我也最近在 学习这些东西。。 原来除了 select 还有好多其他 alternatives 呢。。


select
pselect
poll
ppoll
epoll
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 22-12-2025 11:14 AM , Processed in 0.141497 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表