java 实现魔兽搜索器 魔兽对战平台

主要UDP包:
收索包:
内容:F7 2F 10 00 50 58 33 57 15 00 00 00 00 00 00 00
功能:向主机提出收索信息。问别人“你建什么主机?”
在打开魔兽进入局域网的时候,会向当前网段(255.255.255.255)广播这个包。只要条件符合,收到这个包的主机都会返回一个地图信息给他(他:这个收索包的IP端口)
主机包:
内容:F7 32 10 00 00 00 00 00 01 00 00 00 00 00 00 00
功能:告诉别人:“我建主机了,要不要看看。”
建立主机的时候开始,向当前网段广播这个包,每5秒钟一次。收到这包的客户机会发送搜索包。
地图包:
内容: 
F7 30 8C 00 50 58 33 57  14 00 00 00 01 00 00 00 
39 69 C2 00 E5 BD 93 E5  9C B0 E5 B1 80 E5 9F 9F 
E7 BD 91 E5 86 85 E7 9A  84 E6 B8 B8 E6 88 8F 20  
28 76 73 00 00 01 03 49  07 01 01 77 01 B9 79 01  
99 D5 B9 31 4D CB 61 71  73 5D 45 6F 77 19 6F 6D  
6F 61 65 5D 45 2B 6F 75  41 21 41 6D 6D 2B 73 75 
61 73 73 21 77 B1 37 2F  37 31 63 2F 77 23 33 79  
01 77 73 01 01 00 0A 00  00 00 01 00 00 00 01 00
00 00 0A 00 00 00 1B 00  00 00 E0 17             
功能:“这就是我所建的图,你好好看。”
主机收到搜索包之后就把这个包返回给他,包括所有有用信息。
 

魔兽的工作流程

魔兽进入局域网的时候会广播一个搜索包,只发送一次。只发送当前网段(255.255.255.255),所以我们的魔兽只能看到本寝室,或者少数几个寝室的几个主机。

建立了了主机的魔兽收到之后就会发送一个包给他,这个包就是地图信息,包括地图信息,主机名,加入了多少人,剩下多少位置,还有一个重要的数据就是游戏的端口。一般魔兽的端口是6112.

建立主机的魔兽会向本地发送一个包,“我建立主机了”

搜到这条消息的魔兽会发送一个搜索包给主机。

主机就发送 地图信息。

收到之后就解析地图,这时候大家就看到了有人建主了                   点击加入· ~  建立tcp连接 一直到推出主机的游戏

ps: 一场游戏下来,和主机发送的包 大概25MB(半小时) 主机收发的包就是 9*25 MB/30 min ;//按照dota计算 一个主+9个客户端的10人游戏。 这样粗略的估计主机的网速要求就是 9*25*1024/30*60=128>100 kb/s 加上一点点别的程序所要的通讯包。要想不卡,主机的网速需要保证这个数吧。


关键技术

1,监听主机(建立了魔兽地图的机器)的地图信息。
     
      有两种方法能获得地图信息,一种是抓包,把所有的和6112端口有关的包都抓过来分析。(个人觉得这样电脑的负担太大了)。现在的多数搜索器都是这样实现的。
      但是Java要实现抓包不是很容易。c++能实现这个功能,可以考虑用c++编译一个dll。Java调用。或者用开源项目。搜搜就能找到。
     
      我用的方法是建立一个线程。每5秒钟发送一个包收索本机是否建立主机。如果自己建立了主机,则会返回一个地图信息包。收到之后告诉其他ip“我建主了”;
      这样客户端就不需要一直发送搜索包了。
      找到了主机,一切都好办了。
 2,告诉别人我建主机了
      如何告诉别人我建立了主机。很简单,建立了主机的魔兽会每5秒钟发送一个包给当前网段,告诉别人我建主机了。
      我们只要把这个包发送到其他ip的6112端口就ok了。就是告诉别人“我建主了”,收到的人就会发送一个包:“看看什么图”,然后主机就会回复一个包,没错这就    是地图信息!
     
 3,解析地图
      不解析地图不会对游戏产生任何影响。因为魔兽接受地图包,自己解析,它很明白这图是什么。但是解析地图,你可以知道主机建立的这个地图是什么,主机叫什么    名字,有几个人加入,有几个电脑。还有几个空位置。主机是什么版本。这些很有用的信息在软件上显示出来时很有用的!
      关于UDP包的解说有好多的文章。大家可以去google上搜索一下,关键字 魔兽 UDP
      我这里就几点补充。

这个是网上的:

02 00 00 00:游戏总共允许玩家。
01 00 00 00:未知,似乎是电脑数。
01 00 00 00:未知,似乎是玩家数。
01 00 00 00:剩余空位。
08 00 00 00:未知。似乎是定值。

E0 17=0x17E0=6112,游戏端口。


02 00 00 00:游戏总共允许玩家。
01 00 00 00:未知,这似乎是定值。
01 00 00 00:已知,这就是是玩家数。
01 00 00 00:已知,除电脑外的所有空位。
08 00 00 00:未知。不断变化着……。

E0 17=0x17E0=6112,游戏端口。

// 这个数是这样计算的:除电脑外的所有位置,包括已经有人的位置,例如总数是10个,加了3个电脑,则这个数就是7,不关那7个位置是否有无人。

这里把地图的解析代码贴出来。

完整的程序代码在开源 http://code.google.com/p/warpuber

欢迎加入 开发

猜你喜欢

转载自blog.csdn.net/xinrui5577/article/details/4560590
今日推荐