第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Python套接字接收大量數(shù)據(jù)

Python套接字接收大量數(shù)據(jù)

不負(fù)相思意 2019-10-06 15:54:23
當(dāng)我嘗試接收大量數(shù)據(jù)時(shí),該數(shù)據(jù)將被切斷,我必須按Enter鍵才能獲取其余數(shù)據(jù)。最初,我可以將其增加一點(diǎn),但仍然無(wú)法收到全部。如您所見,我增加了conn.recv()上的緩沖區(qū),但它仍然無(wú)法獲取所有數(shù)據(jù)。它在某個(gè)點(diǎn)將其切斷。我必須在raw_input上按Enter鍵才能接收其余數(shù)據(jù)。無(wú)論如何,我可以一次獲取所有數(shù)據(jù)嗎?這是代碼。port = 7777sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.bind(('0.0.0.0', port))sock.listen(1)print ("Listening on port: "+str(port))while 1:    conn, sock_addr = sock.accept()    print "accepted connection from", sock_addr    while 1:        command = raw_input('shell> ')            conn.send(command)                data = conn.recv(8000)                if not data: break                print data,    conn.close()
查看完整描述

3 回答

?
茅侃侃

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超22個(gè)贊

TCP / IP是基于流的協(xié)議,而不是基于消息的協(xié)議。不能保證send()一個(gè)對(duì)等方的每個(gè)呼叫都會(huì)導(dǎo)致另一對(duì)等方的單個(gè)recv()呼叫接收到發(fā)送的確切數(shù)據(jù)recv(),由于數(shù)據(jù)包分段,它可能會(huì)接收到數(shù)據(jù)塊,并分成多個(gè)呼叫。


您需要在TCP之上定義自己的基于消息的協(xié)議,以區(qū)分消息邊界。然后,要閱讀消息,請(qǐng)繼續(xù)呼叫recv()直到您閱讀了整個(gè)消息或發(fā)生錯(cuò)誤為止。


發(fā)送消息的一種簡(jiǎn)單方法是為每個(gè)消息加上前綴。然后要讀取一條消息,您首先要讀取長(zhǎng)度,然后讀取那么多字節(jié)。您可以按照以下方式進(jìn)行操作:


def send_msg(sock, msg):

    # Prefix each message with a 4-byte length (network byte order)

    msg = struct.pack('>I', len(msg)) + msg

    sock.sendall(msg)


def recv_msg(sock):

    # Read message length and unpack it into an integer

    raw_msglen = recvall(sock, 4)

    if not raw_msglen:

        return None

    msglen = struct.unpack('>I', raw_msglen)[0]

    # Read the message data

    return recvall(sock, msglen)


def recvall(sock, n):

    # Helper function to recv n bytes or return None if EOF is hit

    data = b''

    while len(data) < n:

        packet = sock.recv(n - len(data))

        if not packet:

            return None

        data += packet

    return data

然后,您可以使用send_msg和recv_msg函數(shù)來(lái)發(fā)送和接收整個(gè)消息,并且它們不會(huì)在網(wǎng)絡(luò)級(jí)別拆分或合并數(shù)據(jù)包時(shí)帶來(lái)任何問題。


查看完整回答
反對(duì) 回復(fù) 2019-10-06
?
當(dāng)年話下

TA貢獻(xiàn)1890條經(jīng)驗(yàn) 獲得超9個(gè)贊

您可以將其用作: data = recvall(sock)


def recvall(sock):

    BUFF_SIZE = 4096 # 4 KiB

    data = b''

    while True:

        part = sock.recv(BUFF_SIZE)

        data += part

        if len(part) < BUFF_SIZE:

            # either 0 or end of data

            break

    return data


查看完整回答
反對(duì) 回復(fù) 2019-10-06
?
白豬掌柜的

TA貢獻(xiàn)1893條經(jīng)驗(yàn) 獲得超10個(gè)贊

可以接受的答案很好,但是對(duì)于大文件來(lái)說這確實(shí)會(huì)很慢-string是一個(gè)不可變的類,這意味著每次使用+符號(hào)時(shí)都會(huì)創(chuàng)建更多對(duì)象,將其list用作堆棧結(jié)構(gòu)會(huì)更有效。


這應(yīng)該更好地工作


while True: 

    chunk = s.recv(10000)

    if not chunk: 

        break

    fragments.append(chunk)


print "".join(fragments)


查看完整回答
反對(duì) 回復(fù) 2019-10-06
  • 3 回答
  • 0 關(guān)注
  • 931 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)