C# 为什么这个SocketServer在Python中工作而不是在IronPython中工作?
我正在编写一个小型套接字服务器来封装.NET/CAPI。当SocketServer在IronPython下运行时,我很难让它工作。我使用的是2.7.4版 当我像这样运行服务器时:C# 为什么这个SocketServer在Python中工作而不是在IronPython中工作?,c#,python,.net,ironpython,socketserver,C#,Python,.net,Ironpython,Socketserver,我正在编写一个小型套接字服务器来封装.NET/CAPI。当SocketServer在IronPython下运行时,我很难让它工作。我使用的是2.7.4版 当我像这样运行服务器时: C:\Python27\python.exe data_server.py # data_server.py import sys, os, pickle, SocketServer PORT = 31337 def dump_data(f): for w in ['A','B','C']: # test
C:\Python27\python.exe data_server.py
# 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
从客户端,我得到了预期的输出:
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/64位IronPython,并使用32/64位IronPython运行客户端。不管我怎么做,IronPython服务器似乎都无法工作
知道我做错了什么吗
Python代码
服务器代码如下所示:
C:\Python27\python.exe data_server.py
# 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
客户端代码如下所示:
C:\Python27\python.exe data_server.py
# 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
我想我可以回答我自己的问题。事实证明,我必须更改对socket.makefile的调用以显式指定二进制模式。即:
f = self.request.makefile('b')
我假设这是由于IronPython中的一个细微不同的实现