您的位置:首页 > 其它

Silverlight MMORPG WebGame游戏设计(二)--通讯协议之惑

2010-04-07 23:09 771 查看
晚上看到我在silverlight webGame上的导师"深蓝色右手"拿到启动安全策略文件提供服务

internal void StartupPolicyServer()
{
string policyFile = Path.Combine(Application.StartupPath, "clientaccesspolicy.xml");//读取安全策略文件的内容放入policyBuffer byte[]中

using (FileStream fs = new FileStream(policyFile, FileMode.Open, FileAccess.Read))
{
policyBuffer = new byte[fs.Length];
fs.Read(policyBuffer, 0, policyBuffer.Length);
}
try
{
listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listener.Bind(new IPEndPoint(IPAddress.Any, 943));//监听943端口
listener.Listen(100);
listener.BeginAccept(new AsyncCallback(OnClientConnect), null);//当客户端访问943端口时回调OnClientConnect方法
}
catch
{
}
}

//客户端访问943端口时

private readonly string policyRequestString = "<policy-file-request/>";

private void OnClientConnect(IAsyncResult result)
{

....

requestBuffer = new byte[policyRequestString.Length];

client.BeginReceive(requestBuffer, 0, policyRequestString.Length, SocketFlags.None, new AsyncCallback(OnReceive), client);//接收"<policy-file-request/>"内容长度的byte[]请求。

}

//服务端开始接收客户端的数据

private void OnReceive(IAsyncResult result)
{
Socket client = result.AsyncState as Socket;
try
{
received += client.EndReceive(result);//累加接收的字节数目,为了判断是否接收完
if (received < policyRequestString.Length) //如果"<policy-file-request/>"内容长度的byte[]没有接收完继续接收
{
client.BeginReceive(requestBuffer, received, policyRequestString.Length - received, SocketFlags.None, new AsyncCallback(OnReceive), client);
return;
}
string request = System.Text.Encoding.UTF8.GetString(requestBuffer, 0, received);
if (StringComparer.InvariantCultureIgnoreCase.Compare(request, policyRequestString) != 0) //如果客户端在943端口发送的不是"<policy-file-request/>"内容的数据,也就是说请求的不是安全策略文件,就退出函数
{
client.Close();
return;
}
client.BeginSend(policyBuffer, 0, policyBuffer.Length, SocketFlags.None, new AsyncCallback(OnSend), client);//否则就把安全策略文件的byte[]内容发送给客户端
}

catch (SocketException)
{
client.Close();
}
}

④客户端接收到了安全策略文件就能继续在 4502-4534端口之间和服务端进行继续的通讯了,如果服务端没能发送安全策略文件的内容给客户端,则SL客户端会报一个“安全策略”的异常。

由于文章篇幅已经比较长了,到此我们SL客户端和服务端的通讯可以进行,那么服务端和客户端的通讯内容如何约定呢?我们这样把游戏里的各种面向对象的数据以难以肉眼判读的byte[]字节发送到服务端呢?这就想我们把一纸洋洋洒洒的文章用粉碎机弄成纸屑,如果没有高强的法力,我们很难把纸屑还原成纸张.

下一篇文件,我们会探讨下服务端和客户端如何组织通讯内容。Silverlight MMORG WebGame游戏设计(三)-----Server和Client的暗号

上一篇文章:Silverlight MMORG WebGame游戏设计(一)-----一个游戏爱好者的webGame之路
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐