Python如何区分python套接字模块中的数据(当服务器接收时)。

时间:2014-02-15 06:41:03

标签: python sockets python-3.3

我不知道如何区分服务器中收到的数据。

我想通过在发送数据或接收数据时设置MessageID(示例名称)来区分数据。

以下是示例:

服务器

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host=''
port=int(input(Please Enter the port:))
s.bind((host,port))
s.listen(1)
conn, addr = s.accept()
print('Someone connected.He :%s'%addr)
while True:
    data=conn.recv(1024,MessageID) # I want to make this.
    print(data)

客户端

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host=''
port=int(input(Please Enter the port:))
s.connect((host,port))
data='hello world'
data=data.encode('utf-8') # I encoded data because Python 3.3.3's socket module doesn't
work with string(str) when I send data.
s.send(data,MessageID) # This is what I want.I want to set messageID which can        distinguish data.

如何制作这样的?

其他程序员如何区分python中的数据..?

我真的想要的是:如果不是服务器想要的messageID,请不要收到。

1 个答案:

答案 0 :(得分:2)

您需要将MessageID放入您发送的data。使用一些已知的数据协议可能是一个好主意,所以你知道会发生什么,但这是一个简单的例子。您需要实现正确的错误处理。请注意,您还必须实现一个循环来读取所有数据,因为使用单个recv读取套接字最终会导致您收到部分消息的情况。我真的不知道你的数据是什么,所以我不会猜测它。

客户

....
message_id = 1
data = '{}:hello world!'.format(message_id)
data = data.encode('utf-8')
s.send(data)

服务器

while True:
    data = conn.recv(1024)
    if not data:
       # Always handle the case where the client
       # connects but sends no data. This means the socket is closed
       # by the other end.
       break
    message_id, message = data.split(":", 1)
    print "Got message, id: {}, data: {}".format(message_id, message)

如果您使用picklejson实现此功能,则只需使用词典:

# Client
data = {'message_id': 1, 'message': 'hello world'}
data = pickle.dumps(data) # Or json.dumps(data)
s.send(data)

# Server
while True:
    data = conn.recv(1024)
    if not data:
        break
    data = pickle.loads(data) # Or json.loads(data)
    print "Got id: {message_id}, data: {message}".format(**data)