我怎么去做一个插座的政策文件服务器。它所要做的是听取关于港口843string"<policy-file-request />"随后通过a NULL byte然后返回XML string(这是座的政策文件)。

我没有编码的这种事情之前,我不知道从哪里开始。我是创造它的windows服务?任何提示或链接是值得欢迎的。

背景:

联系网络服务从闪光灯我使用的'as3httpclient图书馆,而不是URLRequest/URLLoader.这是因为它让我能够发送的定制标题与获得请求。该图书馆采用低级别插座,以做的东西。

当闪使用的低级别插座连接到一个服务器,它看起来一座政策文件,这需要提供了一个插座的政策文件服务器。

插座的政策文件的文章,从Adobe

有帮助吗?

解决方案

一些事情要知道的用你所提议的架构:

试图发送HTTP请求在座

主要是你需要知道,即使可以聊天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;
        }
    }

这就是所有重要细节,我认为。我写了这个一段时间以前...该接收方法看起来像它可以做一个返工,但应该足以让你开始。

其他提示

创建一个倾听的座。

当连接打开,执行一个接收和等待预期的串。在收到发送文件的内容,然后关闭座。

这个包裹在一个服务(运行一个低的特权帐户)。

大部分工作是完成了 系统。网。插座。插座 类,文件中包含的一样,API非常类似于BSD socket API整体(主要有一个1:1映从BSD API向插座(或帮助的类型)方法),因此任何背景应该是很容易翻译。

我不得不对这项任务与这两个Java和C#他们都相当类似的。

你可以看看 java政策文件.

有些问题可以看到这个回答: https://stackoverflow.com/a/12854204/1343667

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top