UDP通訊解決a bytes-like object is required, not 'str' 問題
阿新 • • 發佈:2019-02-15
簡介:最近在進行網路通訊的學習時候遇到了這個問題,使用的版本是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)
解決