첫째, 스틱 패키지는 이유는 무엇입니까?가
1 작은 씨앗 연속 포인트합니다 (Nagle 알고리즘이 전송 패키지화)이 패키지 버티
수신 된 데이터 전송 제한이 전달보다 씨앗이 클 경우 2. '> RECV는 수신 바이트 번호, 접수 마감 시간은, 상기 제 2 입력 명령은 전체 데이터를 취할 처음 촬영되지 발생 후 때도 스틱 패키지라고 첫번째 데이터, 촬영 완료되었다
하여 : 스틱 패키지를 해결하기 이전에, 우리는 버퍼 영역의 개념을 소개
버퍼가 :? 무엇을
우리가 받고 보낼 때, 수신 버퍼의 역할이 그래서 존재 전송합니다.
: 완충 지대 역할
1. 일시적으로 일부를 저장을 데이터
2.1 버퍼 경우 네트워크 변동하지만, 안정적인 송수신, 균일 한 데이터를 확보 : 그것은 하나 개의 스틱 팩 현상 결과 : 씨앗 데이터의 연속 여러 번 (작은 데이터), 데이터가 스틱 때 도 중 : 함께 전송 (더 작은 간격 시간, 데이터의 적은 양의 데이터를, 다음 패킷의 큰 블록으로 결합 데이터 근본적인 이유 Nagle 알고리즘이다).
이 버퍼입니다 !!!!!
어떻게 스틱 패키지 해결하기 위해 :
아이디어 제공 : 1. 10000 바이트를 보낼 수있는 서버 설정을
클라이언트가 데이터 수신주기를 수신하면 모든 바이트의 마지막과 함께 수신 될 때까지 (1024) 실시 예 1024 바이트마다 수신, 디코딩
환경 문제
1.recv 번호를 판별 할 수없는
2. 데이터를 보내기 전에 항상 나에게 전체 데이터 길이의 예를 제공합니다 : 1000 바이트, 다음의 총 데이터 전송을
3. 클라이언트 : 10,000 바이트의 길이를 받아 긴 I를 재활용는 데이터를 수신 나는 미만 10,000 바이트가 수신되었습니다
4. 두 번째 문제 : 전체 데이터 길이가 해결되지 않은당신은 보낼 수있는 바이트 유형으로 변환됩니다 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()
다음 낮은 버전이 우리가 스틱 패키지의 일부의 문제를 해결하도록, 우리가 다음 아이디어를 제공하기 위해 여기에 있습니다, 또한 버전에 큰이 있습니다 :
- 우리는 고정 된 헤더를 만들고 싶어
- 이제 때문에, 우리는 헤더를 수정해야 바이트 두 가지 유형의 길이를 고정되지 않고 있습니다
- 당신은 고정 길이 헤더를하지 않습니다
- 고정 길이의 헤더를 이용하여 구조체 모듈은 4 바이트 고정되지
- 제 4 바이트는 재송 헤더를 전송
- 우선 전송 헤더는 다음 전체 데이터를 전송 (세 가지 데이터 송신 처리 (제 송신기 헤드 (1), (2)의 길이와 그 제 1 송신기가 존재하고 전체 파일 데이터를 보내는 3))