我正在编写一个小型套接字服务器来包装.NET / C#API。当SocketServer在IronPython下运行时,我很难让它工作。我使用的是2.7.4版本。
当我像这样运行服务器时:
C:\Python27\python.exe data_server.py
从客户端我得到了我期望的输出:
C:\Python27\python.exe data_client.py
{'host': ('localhost', 31337), 'name': 'A'}
{'host': ('localhost', 31337), 'name': 'B'}
{'host': ('localhost', 31337), 'name': 'C'}
但是当我使用IronPython运行服务器时,我从客户端得不到任何东西。即。
"C:\Program Files (x86)\IronPython 2.7\ipy64.exe" ipdb_server.py
我尝试过32 / 64bit IronPython并使用32/64位IronPython运行客户端。无论我采用何种方式,IronPython服务器似乎都无法正常工作。
任何想法我做错了什么?
服务器代码如下所示:
# data_server.py
import sys, os, pickle, SocketServer
PORT = 31337
def dump_data(f):
for w in ['A','B','C']: # test data to be replaced by call to .NET API
meta = {}
meta['name'] = w
print 'Sending: ', meta
pickle.dump(meta, f)
class DataHandler(SocketServer.BaseRequestHandler):
def handle(self):
f = self.request.makefile()
dump_data(f)
f.close()
SocketServer.TCPServer.allow_reuse_address = True
serv = SocketServer.TCPServer(("",PORT), DataHandler)
print "server running on port %d" % PORT
serv.serve_forever()
客户端代码如下所示:
# data_client
import pickle, socket
def get_data(host):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(host)
f = s.makefile()
try:
while True:
meta = pickle.load(f)
meta['host'] = host
yield meta
except EOFError:
pass
f.close()
s.close()
data = get_data(("localhost",31337))
for d in data: print d
答案 0 :(得分:0)
我想我可以回答我自己的问题。事实证明,我必须将对socket.makefile的调用更改为显式指定二进制模式。即:
f = self.request.makefile('b')
我认为这取决于IronPython中一个略有不同的实现。