建立Socket Policy服务器 
(金庆的专栏) 
Flash和Unity3D游戏服务器需要开启一个Socket Policy服务器。 
详细说明见:Setting up a socket policy file server 
http://www.adobe.com/devnet/flashplayer/articles/socket_policy_files.html 
协议如下: 
Flash或U3D播放器向Socket Policy服务器发送请求: 
“<policy-file-request/>\0”, 
服务器返回一个xml文本,其中有包含<cross-domain-policy>配置。 
Adobe提供了Perl和Python代码。Unity3D提供了CSharp代码。 
cs代码用于Windows. Linux上准备使用Python代码。 
在以上网页下载:flashpolicyd_v0.6.zip。 
其中有3个版本:init服务,xinetd服务,独立应用。只需一种即可。 
按应用的性质,请求量极小,所以最适合应用xinetd. 
只需运行其中的install.sh就会安装。 
还需手工在/ect/services中添加服务名flashpolicy和端口843. 
运行以下指令可以测试一下,输出应该是配置文件的内容。 
python -c 'print "<policy-file-request/>%c" % 0' | nc 127.0.0.1 843 
其实以上测试指令在尾部多了个'\n', 不是标准的测试。 
在in.flashpolicyd.py中多了个strip()去除这个'\n'. 
实际用U3D测试时,因为没有'\n'结尾,所以in.flashpolicyd.py无法正常工作。 
需要将35行readline()如下更改: 
        request = sys.stdin.readline().strip() 
改为 
        request = sys.stdin.readline(len('<policy-file-request/>\0')).strip() 
这样就不需要eol就可以读取了。 
查看其他两个版本的代码没有这个错误,但是有另一个错误, 
即有可能只读一半的请求造成判断出错。 
还有一个问题是因为服务是由nobody运行的,环境变量不同, 
将in.flashpolicyd.py头部的 
#!/usr/bin/env python 
明确为 
#!/usr/local/sbin/python 
可避免调用低版本的python而报错。 










