Python:确保一次发送1024个字节

时间:2016-09-13 21:09:12

标签: python python-2.7 sockets

perl_server.pl

$client_socket = $socket->accept();

if (defined $client_socket) {
    $client_socket->autoflush(1);
    $client_socket->setsockopt(SOL_SOCKET, SO_RCVTIMEO, pack('l!l!', 30, 0)) or die "setsockopt: $!";
}

    while (1) {
        my $line = "";
        $client_socket->recv($line, 1024);
        print "$line\n";
}

python_client.py

def random_line():
    return "random len of line here"

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = (brock_host, int(brock_port))
sock.connect(server_address)
while True:
    sock.sendall(random_line())

我如何保证perl_server一次收到一行(没有损坏)? 或者阻止线路被缓冲,这样它就不会在服务器端打印,除非另一条线路进入?

我相信如果我确定发送的项目的大小是1024,那么perl服务器一次会得到一行,对吗?

如何确保一行是1024字节?

如果线路长度超过1024字节,那么策略是什么? (不确定这是否是一个需要关注的案例)

通常,一行约为50个字符

2 个答案:

答案 0 :(得分:3)

PACKET_SIZE = 1024
line = random_line()
sock.send(line+"\x00"*max(PACKET_SIZE-len(line),0))

是你可以做到的一种方式

另一种方式(如果'\x00' 您的终端字符

'{val:{terminal}<{size}}'.format(val=line,size=PACKET_SIZE,terminal='\xff')

答案 1 :(得分:1)

可能是使用步幅,长度和填充的组合。由于您确定切片小于数据包大小,因此不需要max

M = 32

for length in (M - 1, M, M + 1):

    payload = '1' * length

    for i in range(0, len(payload), M):

        packet = payload[i : i + M]

        packet += '0' * (M - len(packet))

        print(packet)

print()

输出:

11111111111111111111111111111110

11111111111111111111111111111111

11111111111111111111111111111111
10000000000000000000000000000000