1. 程式人生 > >《python核心程式設計》讀書筆記-建立UDP服務端/客戶端

《python核心程式設計》讀書筆記-建立UDP服務端/客戶端

UDP伺服器

偽碼

ss = socket() # 建立伺服器套接字
ss.bind() # 繫結伺服器套接字
inf_loop: # 伺服器無限迴圈
    cs = ss.recvfrom()/ss.sendto() # 關閉(接收/傳送)
ss.close() # 關閉伺服器套接字

具體實現

[[email protected] ~]# cat udpserv.py 
#!/usr/bin/env python3.4

from socket import *  #socket模組不需要下載,自帶了
from time import ctime
 
HOST = ''                 
PORT = 21567             
BUFSIZE = 1024
ADDR = (HOST, PORT)

udpSerSock = socket(AF_INET,SOCK_DGRAM)
udpSerSock.bind(ADDR)

while True:
    print ('waiting for message...')
    data,addr=udpSerSock.recvfrom(BUFSIZE)
    udpSerSock.sendto(('[%s] %s' % (ctime(),data.decode())).encode(),addr)
    print('...received from and returned to : ',addr)
udpSerSock.close()

UDP客戶端

偽碼

cs = socket() # 建立客戶端套接字
comm_loop: # 通訊迴圈
    cs.sendto()/cs.recvfrom() # 對話(傳送/接收)
cs.close() # 關閉客戶端套接字

具體實現

[[email protected] ~]# cat udpcli.py 
#!/usr/bin/env python3.4

from socket import *  #socket模組不需要下載,自帶了
 
HOST = ''                 
PORT = 21567             
BUFSIZE = 1024
ADDR = (HOST, PORT)

udpCliSock = socket(AF_INET,SOCK_DGRAM)

while True:
    data= input('> ')
    if not data:
        break
    udpCliSock.sendto((data.encode()),ADDR)
    data,addr=udpCliSock.recvfrom(BUFSIZE)
    if not data:
        break
    print(data)

udpCliSock.close()

以上都是測試成功的部分,下面是遇到的錯誤的總結

遇到的錯誤

客戶端遇到的問題

[[email protected] ~]# ./udpcli.py 
> 123
Traceback (most recent call last):
  File "./udpcli.py", line 16, in <module>
    udpCliSock.sendto(data,ADDR)
TypeError: 'str' does not support the buffer interface

問題的部分程式碼

udpCliSock.sendto(data,ADDR)

解決方法,修改為

    udpCliSock.sendto(data.encode(),ADDR)

服務端遇到的問題

[[email protected] ~]# ./udpserv.py 
waiting for message...
Traceback (most recent call last):
  File "./udpserv.py", line 17, in <module>
    udpSerSock.sendto('[%s] %s' % (ctime(),data),addr)
TypeError: 'str' does not support the buffer interface

有問題的部分程式碼

udpSerSock.sendto('[%s] %s' % (ctime(),data),addr)

解決方法,修改為

udpSerSock.sendto(('[%s] %s' % (ctime(),data.decode())).encode(),addr)

參考的連結 https://blog.csdn.net/chuanchuan608/article/details/17915959