2016-08-04 1 views
0

소켓에 연결을 수신하고 클라이언트가 다양한 크기의 사전에 연결되면 서버를 보냅니다.파이썬 소켓, 클라이언트에 다음 데이터의 길이를 알려주는 int를 보냅니다.

클라이언트에게 수신 할 바이트 수를 알려주기 위해 먼저 사전의 크기를 보내려고합니다.

dic={'asdf':'1234', 'ghkj':'5678'} 
serialized_dict = pickle.dumps(dic) 
dic_size = sys.getsizeof(serialized_dict) 

connection.send(dic_size) 

connection.send(serialized_dict) 

대략 클라이언트가 연결되면 서버가 수행하는 작업입니다.

이제는 dic_size을 정수로 보낼 수 없습니다. 즉, 아마 직렬화해야 할 수도 있습니다. 그렇게하면 클라이언트에서 올바른 바이트 수를 읽고 정수 값을 받고 정수 값만큼의 바이트 수를 어떻게받을 수 있습니까?

답변

0

나는 이렇게하지 않을 것이다. 스트림의 끝을 소켓 버퍼에 알리는 일반적인 방법은 사전 뒤에 어떤 종류의 구분 기호/끝 마커를 보내고 클라이언트가 끝 마커를 찾도록하는 것입니다. 일단 마커가 수신되면 사전에 마침표를 받았음을 알게됩니다.

나는 그들이 내가 피클 deserialisation에 대한 클라이언트 측의 길이를 알 필요가 \r\n

self.messBuffer = "" #message buffer 
while self.messBuffer.find("\r\n") == -1: 
      try: 
       #take in 500 bytes 
       self.socket.settimeout(10) #set timeout of socket 
       self.messBuffer += self.socket.recv(500) 
       self.socket.settimeout(None) 
      #if there is a socket error 
      except socket.error: 
       self.socket.close() #close the socket 
       return 
     #find the end of the message which is marked by "\r\n" 
     end = self.messBuffer.find("\r\n") 

     #get the message which is 0 to the end(occurrence of "\r\n") 
     msg = self.messBuffer[0:end] 
     #reset the message buffer to what is behind "\r\n" 
     self.messBuffer = self.messBuffer[end+2:] 
     return msg 
+0

같은 것을하지 마십시오 사용하는 필드의 끝을 표시하기 위해 SMTP 메일 서버를 믿지? 직렬화 된 데이터가 완전히 전송 된 시점을 알 필요가 있으므로 변수에 socket.recv (lenght)를 할당하고 역 직렬화 할 수 있습니다. 아니면 여기에 뭔가 빠졌나요? –

+0

@ boolean.is.null 나는 내 대답을 업데이트했다. 수업을 위해 만든 SMTP 메일 서버에서 작업 한 일부 코드를 가져왔다. 모든 코드가 필요한 것은 아니지만 기본 개념입니다. 구분 기호를 얻을 때까지 계속 바이트를 수신합니다. 코드가 거의 모든 것을 설명합니다 –

+0

감사합니다. 거기에 대한 접근 방식을 이해하지만 데이터가 직렬화되고 직렬화 될 때까지 검색 할 수 없기 때문에 시나리오에 해당되지 않는다고 생각합니다. –

관련 문제