我希望实现一个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”。在
目前没有回答
相关问题 更多 >
编程相关推荐