Python網(wǎng)絡(luò)編程,UDP服務(wù)器與客戶端通信

同上篇日記一樣,上一篇寫了 TCP/IP 的通信,這一篇則是 UDP 通信,基本內(nèi)容同 TCP 差不多。
UDP 服務(wù)器不需要 TCP 服務(wù)器那么多設(shè)置,因?yàn)樗皇敲嫦蜻B接的,除了等待傳入的連接之外,幾乎不需要做其他工作。

創(chuàng)建服務(wù)器套接字的偽代碼,創(chuàng)建及工作流程

        ss = socket()                      #創(chuàng)建服務(wù)器套接字
        ss.bind()                             #綁定服務(wù)器套接字
        inf_loop:                             #服務(wù)器無限循環(huán)
                cs = ss.recvfrom()/ss.sendto()         #接收和發(fā)送消息
        ss.close()                            #關(guān)閉服務(wù)器套接字

完整的 UDP 時間戳服務(wù)器,接受客戶端發(fā)送來的消息,并將加了時間戳的消息返回給客戶端

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from socket import *
from time import ctime

'''
HOST,PORT,BUFSIZ 同之前一樣,對于socket()的調(diào)用與之前不同在于現(xiàn)在需要一個數(shù)據(jù)報(bào)/UDP 套接字類型,
bind()的調(diào)用與 TCP 一樣,由于 UDP 是無連接的,所以這里沒有調(diào)用’監(jiān)聽接入的連接‘
'''
HOST = ''
PORT = 21580
BUFSIZ = 1024
ADDR = (HOST,PORT)

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

'''
進(jìn)入服務(wù)器無限循環(huán)中,等待消息(數(shù)據(jù)報(bào)),當(dāng)一條消息到達(dá)時,添加一個時間戳,并將其發(fā)送回客戶端,然后等待另一條消息
'''
while True:
    print('waiting for message...')
    data,addr = udpSerSock.recvfrom(BUFSIZ)
    ss = '[%s] %s' % (ctime(), data)
    print(ss)
    udpSerSock.sendto(str.encode(ss),addr)
    print('...received from and returned to:',addr)

udpSerSock.close()

創(chuàng)建 UDP 客戶端的偽代碼,UDP 客戶端的代碼很短

        cs = socket()             #創(chuàng)建客戶端套接字
        comm_loop:             #通信循環(huán)
                cs.sendto()/cs.recvfrom()        #對話(發(fā)送/接收)
        cs.close()                 #關(guān)閉客戶端套接字

一旦創(chuàng)建了套接字對象,就進(jìn)入對話循環(huán),與服務(wù)器進(jìn)行信息交換,當(dāng)通信結(jié)束時,關(guān)閉客戶端套接字

完整的客戶端

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from socket import *

'''
由于是在本地計(jì)算機(jī)上運(yùn)行服務(wù)器,所以使用‘localhost’及與服務(wù)器相同的端口號
緩沖區(qū)大小為1kb,與 UDP 服務(wù)器相同的方法分配套接字對象
'''
HOST = 'localhost'
PORT = 21580
BUFSIZ = 1024
ADDR = (HOST,PORT)
udpCliSock = socket(AF_INET,SOCK_DGRAM)

'''
客戶端循環(huán),將用戶輸入的內(nèi)容發(fā)送給服務(wù)器,并等待服務(wù)器返回信息,當(dāng)服務(wù)器返回信息后,將信息打印出來
'''
while True:
    data = input('> ')
    if not data:
        break
    data = str.encode(data)
    udpCliSock.sendto(data,ADDR)
    data,ADDR = udpCliSock.recvfrom(BUFSIZ)
    if not data:
        break

    print(type(data))
    print(data.decode())

udpCliSock.close()

分別運(yùn)行服務(wù)器和客戶端

服務(wù)器端

屏幕快照 2017-01-03 11.28.41.png

客戶端

屏幕快照 2017-01-03 11.28.49.png

當(dāng)客戶端什么都不輸入時,關(guān)閉套接字連接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容