minecraft我的世界,服务器总是连接断开

2024-07-19 01:42:40作者:饭克斯

这个上面说的很清楚的。。。

在AdobeFlashPlayer升级到9.0.124后,由于安全策略更改,原来Socket或XmlSocket的应用里的http方式加载安全策略的手段不能继续使用。更改如下:

1,首先检测目标服务器的843端口是否提供安全策略

2,如果1没有检测到策略,则检测actionscript是否使用了Security.loadPolicyFile(xmlsocket://)手段提供安全策略,如果还没检测到,则使用第3步检测

3,检测目标服务器目标端口是否提供安全策略。

在说具体处理方式前,我先描述一下FlashPlayer的验证过程。在Flex程序发出Socket或XmlSocket(以下统称为Socket)请求前,FlashPlayer会先判断是否为本地调用,如果不是。即用一个Socket去链接到你的服务端,三次握手成功后一方面发出字符串“\0“另一方面监听返回的安全策略。安全策略接收成功后,FlashPlayer就断开验证的Socket,然后再运行程序本身的Socket。在整个SWF运行期间,无论你请求多少次,只要域相同,FlashPlayer就只验证一次。这里有两个重点:

第一个是验证的Socket和程序的Socket是两个Socket。所以你在本地测试时,服务端监听到N个Socket请求,但布置到服务端后,服务端会监听到N+1个请求。

第二是验证的Socket发送“\0“请求和接收你的策略文件是没有先后关系的,所以你没必要接收完“\0“后才发策略文件。我的做法是只要监听到请求,就把策略字符串发过去。

在Java中,我处理的方法是独立启动一个843端口的服务专门监听授权请求,这样客户端响应速度很快,代码片段如下:

Stringxml=\0;

Socketsocket=serverSocket.accept();

BufferedReaderbr=newBufferedReader(newInputStreamReader(socket

.getInputStream(),UTF-8));

PrintWriterpw=newPrintWriter(socket.getOutputStream());

char[]by=newchar[22];

br.read(by,0,22);

Strings=newString(by);

System.out.println(s=+s);

if(s.equals()){

System.out.println(接收policy-file-request);

pw.print(xml);

pw.flush();

br.close();

pw.close();

socket.close();

}

另外一定要注意xml字符串后面的”\0”,因为FlashPlayer是用他来做分隔符的,如果你不加上,客户端验证socket可能就一直等待。另外授权接收的socket一定要断开。

展开全文

相关攻略