为什么这个SocketServer在Python中运行而不是IronPython?

时间:2014-01-29 15:32:36

标签: c# python .net ironpython socketserver

我正在编写一个小型套接字服务器来包装.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服务器似乎都无法正常工作。

任何想法我做错了什么?

Python代码

服务器代码如下所示:

# 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

1 个答案:

答案 0 :(得分:0)

我想我可以回答我自己的问题。事实证明,我必须将对socket.makefile的调用更改为显式指定二进制模式。即:

f = self.request.makefile('b')

我认为这取决于IronPython中一个略有不同的实现。