python中的Excel RTD和服务器

2024-09-29 23:19:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望实现一个excelrtd服务器,它向服务器发送请求并检索信息。作为一个例子,这个想法如下:

用户将键入类似于=GetDuration(“US912828D804”)的内容,其中参数是ISIN代码,并将接收绑定的持续时间。在后面,excel会向python服务器发出一个请求-在另一台机器上运行,所有的计算都在这里完成。在

到目前为止,我已经按照他们的例子,尝试使用Excel DNA来设置Excel RTD服务器:

using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Threading;
using System.Net.Sockets;
using System.Text;
using ExcelDna.Integration.Rtd;

namespace RTDExcel
{
    [ComVisible(true)]                   // Required since the default template puts [assembly:ComVisible(false)] in the AssemblyInfo.cs
    [ProgId(RtdExcelServer_Test.ServerProgId)]     //  If ProgId is not specified, change the XlCall.RTD call in the wrapper to use namespace + type name (the default ProgId)
    public class RtdExcelServer_Test : ExcelRtdServer
    {
        public const string ServerProgId = "Test_Server_1";
        List<Topic> _topics = new List<Topic>();
        ServerClient serverClient = new ServerClient();
        Timer timer;
        int i = 0;
        public void TimeServer()
        {
            timer = new Timer(Callback);
        }

        protected override bool ServerStart()
        {                        
            serverClient.ConnectToServer();
            TimeServer();
            return true;
        }
        protected override void ServerTerminate()
        {
            serverClient.CloseConnectionToServer();
            timer.Dispose();
            timer = null;
        }

        protected override object ConnectData(Topic topic, IList<string> topicInfo, ref bool newValues)
        {            
            _topics.Add(topic);
            timer.Change(10000, 10000);
            return serverClient.AskServer("Hello");            
        }

        protected override void DisconnectData(Topic topic)
        {
            _topics.Remove(topic);
            timer.Change(-1, -1);
        }

        private void Callback(object o)
        {            
            foreach (Topic topic in _topics)
            {
                i += 1;
                topic.UpdateValue(serverClient.AskServer("Hello"));
            }            
        }
    }
}
public class ServerClient
{
    TcpClient clientSocket = new TcpClient();
    public void ConnectToServer()
    {
        clientSocket.Connect("127.0.0.1", 8080);
    }
    public string AskServer(string request)
    {
        NetworkStream serverStream = clientSocket.GetStream();
        byte[] outStream = Encoding.ASCII.GetBytes(request);
        serverStream.Write(outStream, 0, outStream.Length);
        serverStream.Flush();

        byte[] inStream = new byte[10025];
        serverStream.Read(inStream, 0, 75);
        string response = Encoding.ASCII.GetString(inStream);
        return response;
    }
    public void CloseConnectionToServer()
    {
        clientSocket.Close();
    }

}

Phython服务器

^{pr2}$

本例的主要思想是测试系统。该函数只询问服务器当前时间,该时间是在每次请求时计算的。不幸的是,每次计时器回调时,excel都会崩溃。这是正确的方法吗?在


更新:

似乎问题出在python服务器上,需要一个循环来维护客户端的更新:

class TCPHandler(ss.BaseRequestHandler):
def handle(self):
    closed = False
    while not closed:
        try:
            self.data = self.request.recv(1024).decode('UTF-8')
            print(self.data[0])
            if self.data[0] == 'Time':
                tmp = str(datetime.datetime.now())
                print('Sending: ' + tmp)
                print('Byte Size: ' + str(sys.getsizeof(tmp)))
                self.request.send(tmp.encode())
            if self.data[0] == 'Exit':
                closed = True
            else:
                self.request.send(str('No request.').encode())
        except (keyboardInterrupt, SystemExit):
            raise

现在我遇到的问题是服务器没有接收到来自客户端的完整消息:没有接收到“时间”或“退出”,我只得到一个“T”o“E”。在


Tags: theself服务器newstringtopicrequestpublic

热门问题