如何在C#中创建套接字策略文件服务器。它所要做的就是在端口843上侦听字符串“< policy-file-request />”后跟一个NULL字节,然后返回一个XML字符串(即套接字策略文件)。
我之前没有编过这种东西,也不确定从哪里开始。我是否在Windows服务中创建它?欢迎任何提示或链接。
背景:
要从flash联系Web服务,我使用'as3httpclient'库而不是URLRequest / URLLoader。这是因为它使我能够使用GET请求发送自定义标头。这个库使用低级套接字来完成它的工作。
当flash使用低级套接字连接到服务器时,它会查找套接字策略文件 - 这需要由套接字策略文件服务器提供。
答案 0 :(得分:8)
使用建议的架构需要注意的一些事项:
Trying to send an HTTP request over sockets
原则上,您需要注意即使您可以使用套接字在较低级别聊天http,但是存在大量以这种方式进行通信的情况。如果用户在其浏览器中启用了代理服务器,则主要会发生这些故障,因为在通过套接字连接时没有有效的方法可以发现并随后使用代理。
要创建策略服务器,您可以使用TcpListener类。您将开始按如下方式收听:
var tcpListener = new TcpListener(IPAddress.Any, 843 );
tcpListener.start();
tcpListener.BeginAcceptTcpClient(new AsyncCallback(NewClientHandler), null);
NewClientHandler方法的格式为:
private void NewClientHandler(IAsyncResult ar)
{
TcpClient tcpClient = tcpListener.EndAcceptTcpClient(ar);
...
此时您可能希望将tcpClient对象提供给您自己创建的类,以处理来自套接字的数据的验证。我打算把它叫做RemoteClient。
在RemoteClient中,您将拥有以下内容:
var buffer=new byte[BUFFER_SIZE];
tcpClient.GetStream().BeginRead(buffer, 0, buffer.Length, Receive, null);
和接收方法:
private void Receive(IAsyncResult ar)
{
int bytesRead;
try
{
bytesRead = tcpClient.GetStream().EndRead(ar);
}
catch (Exception e)
{
//something bad happened. Cleanup required
return;
}
if (bytesRead != 0)
{
char[] charBuffer = utf8Encoding.GetChars(buffer, 0, bytesRead);
try
{
tcpClient.GetStream().BeginRead(buffer, 0, buffer.Length, Receive, null);
}
catch (Exception e)
{
//something bad happened. Cleanup required
}
}
else
{
//socket closed, I think?
return;
}
}
和一些发送方法:
public void Send(XmlDocument doc)
{
Send(doc.OuterXml);
}
private void Send(String str)
{
Byte[] sendBuf = utf8Encoding.GetBytes(str);
Send(sendBuf);
}
private void Send(Byte[] sendBuf)
{
try
{
tcpClient.GetStream().Write(sendBuf, 0, sendBuf.Length);
tcpClient.GetStream().WriteByte(0);
tcpClient.GetStream().WriteByte(13); //very important to terminate XmlSocket data in this way, otherwise Flash can't read it.
}
catch (Exception e)
{
//something bad happened. cleanup?
return;
}
}
这就是我认为的所有重要细节。我前段时间写过这篇文章......接收方法看起来可以做返工,但它应该足以让你开始。
答案 1 :(得分:1)
创建一个侦听套接字。
打开连接时,执行接收并等待预期的字符串。收到后发送文件内容然后关闭套接字。
将此包装在服务中(作为低权限帐户运行)。
大部分工作都是使用System.Net.Sockets.Socket类完成的,文档包含一个示例,API总体上与BSD套接字API非常相似(主要是从BSD API到Socket的1:1映射(或帮助输入)方法)所以任何背景都应该很容易翻译。
答案 2 :(得分:0)
我不得不用Java和C#来完成这项任务,它们非常相似。
您可以查看java policy file。
有些问题可以在这个答案中看到:https://stackoverflow.com/a/12854204/1343667