1. 程式人生 > >UDP通訊解決a bytes-like object is required, not 'str' 問題

UDP通訊解決a bytes-like object is required, not 'str' 問題

簡介:最近在進行網路通訊的學習時候遇到了這個問題,使用的版本是Python3.5.2,啟動伺服器端,再啟動客戶端通訊時候遇到該問題,並且直接出錯無法繼續執行

服務端的程式是一個UDP通訊程式

import socket

s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind(('127.0.0.1',9999))

print('Bind UDP on 9999....')
while True:
    data,addr=s.recvfrom(1024)
    print('Received from %s:%s.' % addr)
    s.sendto(b'Hello,%s!' % data,addr)
s.close()

客戶端程式會發送一段話給伺服器端,伺服器端會將這句話加上字串之後回傳

import socket
import time
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
failuretime = 0



def udpsend(str):
    s.sendto(str, ('127.0.0.1', 9999))
    recdata = s.recv(1024).decode()
    s.close()
    return

udpsend('hello')

本來是簡單的不行的一個程式卻屢次碰壁

比如,以上的執行時候就會出錯,提示 TypeError: a bytes-like object is required, not 'str'

原因不明,按照意思來說是我的傳值不對,應該傳入的是bytes型別而不是string,既然這樣那就把傳值改了,改為二進位制吧

udpsend(b'hello')

 結果提示 BrokenPipeError: [Errno 32] Broken pipe

然後,我找了一個可以使用的函式

def udpsend2(str):
    s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    s.sendto(str,('127.0.0.1',9999))
    print(s.recv(1024).decode('utf-8'))
    s.close()

對比我寫的


def udpsend(str):
    s.sendto(str, ('127.0.0.1', 9999))
    recdata = s.recv(1024).decode('utf-8')
    print(recdata)
    s.close()
    return

所以我發現最後導致問題的,是我在這裡出現了一個錯誤,在建立連結時候,錯用了SOCK_STREAM模式,該模式是給TCP通訊使用的,會保證有握手過程,資訊一定收到,而服務端是UDP監聽

最後

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

改為

s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

解決