스틱 소켓 패킷 데이터 전송 문제를 바탕으로

첫째, 스틱 패키지는 이유는 무엇입니까?가
1 작은 씨앗 연속 포인트합니다 (Nagle 알고리즘이 전송 패키지화)이 패키지 버티
수신 된 데이터 전송 제한이 전달보다 씨앗이 클 경우 2. '> RECV는 수신 바이트 번호, 접수 마감 시간은, 상기 제 2 입력 명령은 전체 데이터를 취할 처음 촬영되지 발생 후 때도 스틱 패키지라고 첫번째 데이터, 촬영 완료되었다
하여 : 스틱 패키지를 해결하기 이전에, 우리는 버퍼 영역의 개념을 소개
버퍼가 :? 무엇을
우리가 받고 보낼 때, 수신 버퍼의 역할이 그래서 존재 전송합니다.
: 완충 지대 역할
1. 일시적으로 일부를 저장을 데이터
2.1 버퍼 경우 네트워크 변동하지만, 안정적인 송수신, 균일 한 데이터를 확보 : 그것은 하나 개의 스틱 팩 현상 결과 : 씨앗 데이터의 연속 여러 번 (작은 데이터), 데이터가 스틱 때 도 중 : 함께 전송 (더 작은 간격 시간, 데이터의 적은 양의 데이터를, 다음 패킷의 큰 블록으로 결합 데이터 근본적인 이유 Nagle 알고리즘이다).

이 버퍼입니다 !!!!!
어떻게 스틱 패키지 해결하기 위해 :
아이디어 제공 : 1. 10000 바이트를 보낼 수있는 서버 설정을

  1. 클라이언트가 데이터 수신주기를 수신하면 모든 바이트의 마지막과 함께 수신 될 때까지 (1024) 실시 예 1024 바이트마다 수신, 디코딩

  2. 환경 문제

    1.recv 번호를 판별 할 수없는

    2. 데이터를 보내기 전에 항상 나에게 전체 데이터 길이의 예를 제공합니다 : 1000 바이트, 다음의 총 데이터 전송을

    3. 클라이언트 : 10,000 바이트의 길이를 받아 긴 I를 재활용는 데이터를 수신 나는 미만 10,000 바이트가 수신되었습니다
    4. 두 번째 문제 : 전체 데이터 길이가 해결되지 않은
  3. 당신은 보낼 수있는 바이트 유형으로 변환됩니다 INT 타입을 TOTAL_SIZE 할

    387 ----> STR (387) '387'----> 바이트 b'387 '길이 3bytes

    4185은 ----> STR (4185) "4185"----> 바이트 b'4185 '길이 4 바이트

    18,000 ------------------------------------------------- -----> 길이 5bytes

    우리는 해결해야한다 :

    고정 길이는 고정 된 길이의 INT 바이트 형식으로 변환도 다시 이성을 상실 할 수 없습니다.

    구조체 모듈

그런 다음 우리는 스틱 패키지를 해결할 수 :이 낮은 버전입니다

import socket
import struct
import subprocess
phone = socket.socket()
phone.bind(('127.0.01',8878))
Python.listen(5)
while 1:
    conn,adds = phone.accept()
    while 1:
        try:
            receives_commands = conn.recv(1024)
            receives_commands = receives_commands.decode('utf-8')
            if receives_commands = 'Q':break
            obj = subprocess.Popen(receives_commands,
                                  shall = True
                                  stdout = subprocess.PIPE
                                  stderr =subprocess.PIPE )
            ret = obj.stdout.read()+obj.stderr.read()
            ret = ret.encode('utf-8')
            ret_len = len(ret)
            ret_len_struct = struct.pack('i',ret_len) 
            conn.send(ret_len_struct)
            conn.send(ret)
       except ConnectionResetError:
            print('客户端终端')
            break
       conn.cloce()
phone.cloce()
#客户端
import socket 
import struct
while 1:
    dispatch_orders = inport('请输入您的命令:').strip().encode('utf-8')
    if not dispatch_orders:print('不为空')
    phone.send(dispatch_orders)
    if dispatch_orders.upper() == b'Q':break
    receives_commands_hand = phone.recv(4)
    receives_commands_hand = struct.unpack('i',receives_commands_hand)
    tata =b'' 
    while len(tata)<receives_commands_hand:
        tata+=phone.recv(1024)
    tata = tata.decode('gbk')
    print(f'来自服务端的回执 \n {tata}')
phone.close()
   

다음 낮은 버전이 우리가 스틱 패키지의 일부의 문제를 해결하도록, 우리가 다음 아이디어를 제공하기 위해 여기에 있습니다, 또한 버전에 큰이 있습니다 :

  1. 우리는 고정 된 헤더를 만들고 싶어
  2. 이제 때문에, 우리는 헤더를 수정해야 바이트 두 가지 유형의 길이를 고정되지 않고 있습니다
    1. 당신은 고정 길이 헤더를하지 않습니다
    2. 고정 길이의 헤더를 이용하여 구조체 모듈은 4 바이트 고정되지
    3. 제 4 바이트는 재송 헤더를 전송
    4. 우선 전송 헤더는 다음 전체 데이터를 전송 (세 가지 데이터 송신 처리 (제 송신기 헤드 (1), (2)의 길이와 그 제 1 송신기가 존재하고 전체 파일 데이터를 보내는 3))

추천

출처www.cnblogs.com/wuzifan/p/11420926.html