|
查看: 2797|回复: 16
|
Game(Socket) Server Framework
[复制链接]
|
|
|
请问谁有比较方便简洁的开源Game Server Framework可介绍?
支持
- data queuing
- 架构 C/C++ / Java / PHP / VB.net (其中之一)
- multi-servers
- event based |
|
|
|
|
|
|
|
|
|
|
发表于 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 咯。。 |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 29-8-2008 01:46 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 也是如此。 |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 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
|
显示全部楼层
|
|
|
|
|
|
|
|
|
|
发表于 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 一个
  |
|
|
|
|
|
|
|
|
|
|
发表于 29-10-2008 11:51 AM
|
显示全部楼层
我也最近在 学习这些东西。。 原来除了 select 还有好多其他 alternatives 呢。。
有
select
pselect
poll
ppoll
epoll |
|
|
|
|
|
|
|
|
| |
本周最热论坛帖子
|