C# 为什么这个SocketServer在Python中工作而不是在IronPython中工作?

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

我正在编写一个小型套接字服务器来封装.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 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中的一个细微不同的实现