2014-02-15 54 views
1

我不知道如何區分服務器端收到的數據。Python如何區分python socket模塊中的數據(服務器收到時)。

我想通過在發送數據或接收數據時設置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,不要收到服務器要的信息。

回答

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) 
+1

1.接受 - >的recv 2.'conn.recv(1024)'可能返回少於1024字節(部分消息)。你需要一個循環來讀取整個消息。 3.關於「if not data」:[「recv返回0字節時,表示另一端已關閉(或正在關閉)連接,您將不會再收到有關此連接的更多數據。您可能能夠成功發送數據「](http://docs.python.org/dev/howto/sockets.html) – jfs

+0

我真正想要的是:如果不是messageID,則不會收到服務器需要的。 – user3312583

+0

@ user3312583如果messageid不匹配,您唯一的選擇是丟棄服務器發送的數據。在接收數據之前,您無法知道數據是什麼。 – msvalkon

相關問題