【问题标题】:C# Socket Policy File Server for low-level AS3.0 socket connections?用于低级 AS3.0 套接字连接的 C# 套接字策略文件服务器?
【发布时间】:2010-11-27 10:37:20
【问题描述】:

如何在 C# 中制作套接字策略文件服务器。它所要做的就是在端口 843 上侦听字符串“”,后跟一个 NULL 字节,然后返回一个 XML 字符串(这是套接字策略文件)。

我以前没有编写过这种代码,不确定从哪里开始。我是否在 Windows 服务中创建它?欢迎任何提示或链接。

背景:

要从 Flash 联系 Web 服务,我使用的是“as3httpclient”库而不是 URLRequest/URLLoader。这是因为它使我能够使用 GET 请求发送自定义标头。这个库使用低级套接字来完成它的工作。

当 flash 使用低级套接字连接到服务器时,它会查找套接字策略文件 - 这需要由套接字策略文件服务器提供服务。

Socket Policy File Article from Adobe

【问题讨论】:

  • 挖掘我的实现...
  • 至于监听“”,我认为检查包含单个节点 的 Xml 会更好,因为这是规范实际所说的。
  • 糟糕。看起来你说的是真的,但它被吞噬了。已修改您的帖子。

标签: c# flash actionscript-3 policy


【解决方案1】:

使用您建议的架构需要注意的一些事项:

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;
        }
    }

这就是我认为的所有重要细节。这是我前段时间写的... Receive 方法看起来可以通过返工来完成,但它应该足以让您开始。

【讨论】:

  • 要明确一点——SO问题的链接是关于附加一个额外的/r/n。这与您在下一段中提到的代理问题没有任何关系,是吗?需要注意两个不同的问题?
  • 正确。代理问题不同。
  • 代理问题是我们的杀手锏——我将把网络服务改为 POST 并使用标准的 URLRequest/URL 加载器——我相信我们可以通过这种方式添加标头。
  • 没错。由于主机浏览器的限制,您可以将标头添加到 POST,但不能添加到 GET(尽管文档很少)。当我意识到基于套接字的 HTTP 的无用性时,我想我已经达到了与您相同的程度。
【解决方案2】:

创建一个监听套接字。

打开连接后,执行接收并等待预期的字符串。收到后发送文件内容,然后关闭套接字。

将此包装在服务中(作为低权限帐户运行)。

大部分工作是使用System.Net.Sockets.Socket 类完成的,文档包含一个示例,API 总体上与 BSD 套接字 API 非常相似(主要是从 BSD API 到 Socket 的 1:1 映射(或帮助type) 方法) 所以任何背景都应该很容易翻译。

【讨论】:

  • +1 用于在服务中作为低权限帐户建议运行。谢谢。
【解决方案3】:

我必须同时使用 Java 和 C# 来完成这项任务,它们非常相似。

你可以看看java policy file

一些问题可以在这个答案中看到:https://stackoverflow.com/a/12854204/1343667

【讨论】:

    猜你喜欢
    • 2010-11-11
    • 2013-04-05
    • 2012-05-19
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 2016-07-20
    • 2011-06-08
    相关资源
    最近更新 更多