一、TCP
1、tcp服務器創建
#創建服務器from socket import *from time import ctime #導入ctimeHOST = '' #任意主機PORT = 21567 #隨機提供個端口號BUFSIZ = 1024 # 緩沖區大小設置為1KB,可以根據網絡性能和程序需要改變這個容量ADDR = (HOST, PORT)tcpSerSock = socket(AF_INET, SOCK_STREAM) #分配了 TCP 服務器套接字tcpSerSock.bind(ADDR) #綁定到服務器地址以及開啟 TCP 監聽器的調用。tcpSerSock.listen(5) #listen()方法的參數是在連接被轉接或拒絕之前,傳入連接請求的最大數""" 一旦進入服務器的無限循環之中,我們就(被動地)等待客戶端的連接。當一個連接請求出現時,我們進入對話循環中,在該循環中我們等待客戶端發送的消息。如果消息是空白的,這意味著客戶端已經退出,所以此時我們將跳出對話循環,關閉當前客戶端連接,然后等待另一個客戶端連接。如果確實得到了客戶端發送的消息,就將其格式化并返回相同的數據,但是會在這些數據中加上當前時間戳的前綴。最后一行永遠不會執行,它只是用來提醒讀者,如果寫了一個處理程序來考慮一個更加優雅的退出方式,正如前面討論的,那么應該調用 close()方法。"""while True: print("waiting for connection") tcpCliSock, addr = tcpSerSock.accept() # 接收客戶端連接,返回客戶端和地址 print("...connected from:", addr) while True: data = tcpCliSock.recv(BUFSIZ).decode() #對話(接收 / 發送) 接收客戶端的data if not data: break tcpCliSock.send(('service:'+ctime()+'--'+data).encode()) #發送時間戳 和data信息給客戶端 tcpCliSock.close()tcpSerSock.close()2、tcp客戶端創建
from socket import *HOST = 'localhost'PORT = 21567 #端口號 PORT 應該與你為服務器設置的完全相同(否則,將無法進行通信)BUFSIZ = 1024ADDR = (HOST, PORT)tcpCliSock = socket(AF_INET, SOCK_STREAM) #分配 TCP 客戶端套接字tcpCliSock.connect(ADDR) #主動連接""" 我們必須解碼來自服務器端的字符串(借助于distutils.log.warn()"""while True: data = input("> ") if not data: #用戶如果沒有輸入,則終止 break tcpCliSock.send(data.encode()) #發送客戶端的data給服務器 data = tcpCliSock.recv(BUFSIZ).decode() #接收服務器的data if not data: #或者服務器終止且對 recv()方法的調用失敗 break print('返回:%s'%data)tcpCliSock.close()二、UDP
1、UDP服務器創建
""" 這個腳本創建一個 UDP 服務器,它接受客戶端發來的消息,并將加了時間戳前綴的該消息返回給客戶端。"""from socket import *from time import ctime HOST = ""PORT = 21567BUFSIZ = 1024ADDR = (HOST, PORT) udpServer = socket(AF_INET, SOCK_DGRAM)udpServer.bind(ADDR) while True: print("waiting for masssage") data,addr = udpServer.recvfrom(BUFSIZ) #接收 data = data.decode() udpServer.sendto((ctime()+"--"+ data).encode(),addr) print("received from and returned to ",addr) udpServer.close()
2、UDP客戶端創建
#這個腳本創建一個 UDP 客戶端,它提示用戶輸入發送給服務器的消息,并接收服務器加了時間戳前綴的消息,然后將它們顯示給用戶。from socket import *HOST = 'localhost'PORT = 21567 #端口號 PORT 應該與你為服務器設置的完全相同(否則,將無法進行通信)BUFSIZ = 1024ADDR = (HOST, PORT)udpCS = socket(AF_INET, SOCK_DGRAM)while True: data = input("> ") if not data: break udpCS.sendto(data.encode(),ADDR) data,ADDR = udpCS.recvfrom(BUFSIZ) if not data: break print(data)udpCS.close()其實道理都差不多,在python/51068.html">python3中,利用套接字傳輸的內容都以byte形式傳輸,這時候傳送時(send/sendto)需要encode,接收(recv)時需要decode。只要掌握這個重點,處理這個問題就很簡單了。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。
新聞熱點
疑難解答