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

首頁 > 編程 > Python > 正文

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

2020-01-04 16:55:39
字體:
來源:轉載
供稿:網友

一、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武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 九龙城区| 丰镇市| 子长县| 青浦区| 黑山县| 隆子县| 静海县| 陕西省| 政和县| 富宁县| 额济纳旗| 偃师市| 习水县| 嵊州市| 信丰县| 南城县| 泰安市| 乌兰浩特市| 新竹县| 攀枝花市| 壶关县| 仲巴县| 淮安市| 万荣县| 宕昌县| 即墨市| 合水县| 长兴县| 陆良县| 正定县| 临泉县| 正安县| 沐川县| 方山县| 绍兴市| 家居| 犍为县| 山东省| 鞍山市| 彭水| 康定县|