国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

詳解python3中socket套接字的編碼問題解決

2019-11-25 16:03:24
字體:
來源:轉載
供稿:網友

一、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()

其實道理都差不多,在python3中,利用套接字傳輸的內容都以byte形式傳輸,這時候傳送時(send/sendto)需要encode,接收(recv)時需要decode。只要掌握這個重點,處理這個問題就很簡單了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 自贡市| 随州市| 泰宁县| 邢台市| 宜君县| 惠安县| 夹江县| 祁连县| 台北县| 湛江市| 昌平区| 肃南| 海原县| 崇礼县| 榆中县| 阿瓦提县| 英吉沙县| 河曲县| 嫩江县| 吴江市| 广南县| 阜平县| 广宁县| 聂荣县| 弥勒县| 甘泉县| 邯郸县| 牙克石市| 太湖县| 同江市| 秦安县| 印江| 合作市| 兴安县| 莱西市| 武定县| 宜兰市| 青铜峡市| 五家渠市| 龙胜| 舟曲县|