2014-02-15 1 views
1

서버에서 수신 한 데이터를 구분하는 방법을 모르겠습니다.Python Python 소켓 모듈에서 데이터를 구별하는 방법 (서버 수신시)

데이터를 보내거나 데이터를받을 때 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. 

방법과 같이 만들 수있어?

다른 프로그래머가 파이썬에서 데이터를 구별하는 방법 ..?

내가 원하는 것은 : 어떤 메시지를 원하지 않는 경우 수신하지 마십시오.

답변

2

전송하려는 dataMessageID을 입력해야합니다. 데이터에 대해 알려진 프로토콜을 사용하는 것이 좋을지도 모르므로 예상되는 내용을 알고 있지만 여기에 간단한 예가 있습니다. 적절한 오류 처리를 구현해야합니다. 단 하나의 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) 

당신은 당신은 단순히 사전을 사용할 수 jsonpickle를 사용하여이를 구현하거나 원하는 경우 :

# 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

관련 문제