標籤:網路 伺服器 python 網路編程 socket
通訊端
(每本書都有不同的說法,這裡選用百度詞條給出的理解):源IP地址和目的IP地址以及源連接埠號碼和目的連接埠號碼的組合稱為通訊端。其用於標識用戶端請求的伺服器和服務。通訊端有兩種分別是基於檔案型(Unix通訊端,其“家族名”為AF_UNIX)的和基於網路型的(其“家族名”為AF_INET)。
python只支援AF_UNIX,AF_INET,AF_NETLINK(一種Linux通訊端)。
最常用的通訊端對象方法
通訊端的類型
通訊端的類型只有兩種:連線導向的通訊端和不需連線的通訊端。
連線導向的通訊端
即在通訊前一定要建立一條串連,它提供了一種順序可靠不會重複的資料轉送,實現這種串連的主要協議就是傳輸控制通訊協定(即TCP),要建立這種通訊端需要指定通訊端類型為SOCK_STREAM,由於這類通訊端使用網際協議(IP)來尋找網路中的主機,所以一般會用TCO/IP組合來描述。
建立TCP用戶端
from socket import *from time import ctime#設定主機名稱與連接埠HOST=" "PORT=21567#設定緩衝區大小BUFSIZ=1024ADDR=(HOST,PORT)#建立伺服器通訊端tcpSerSock=socket(AF_INET,SOCK_STREAM)#把地址綁定到通訊端上面tcpSerSock.bind(ADDR)#最多允許5個串連tcpSerSock.listen(10)#伺服器無限迴圈while True: print ("waiting for connection......")#接收用戶端串連,accept()函數使阻塞式的 tcpCliSock, addr=tcpSerSock.accept() print('......connected from:',addr)#通訊迴圈 while True: data=tcpCliSock.recv(BUFSIZ)#對話,接收 if not data: break data=data.decode() tcpCliSock.send(('[%s]%s'%(ctime(),data)).encode()) tcpCliSock.close()tcpSerSock.close()關於通訊端的decode() ,encode()問題,參見http://blog.csdn.net/chuanchuan608/article/details/17915959
建立TCP用戶端
from socket import *#建立一個TCP用戶端,程式會提示使用者輸入要傳給伺服器的資訊#顯示伺服器返回的加了時間戳記的結果HOST=' 'PORT=21567BUFSIZ=1024ADDR=(HOST,PORT)#建立用戶端通訊端tcpCliSock=socket(AF_INET,SOCK_STREAM)#嘗試串連伺服器tcpCliSock.connect(ADDR)#與伺服器對話while True: data=input('>') if not data:#使用者沒有輸入時退出 break tcpCliSock.send(data) data=tcpCliSock.rec(BUFSIZ) if not data:#伺服器由於某種原因退出時導致接受失敗而退出 break print (data)tcpCliSock.close()
不需連線的通訊端
這意味著無需串連就可以通訊,但是資料到達的順序和可靠性便無法保證,實現這種串連的主要協議就是使用者資料包通訊協定(即UDP),要建立UDP就得在建立的時候指定SOCK_DGRAM,同上,一般會有UDP/IP組合名來描述。
建立一個UDP伺服器
from socket import*from time import ctimeHOST=' 'PORT=21567BUFSIZE=1024ADDR=(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)).encode(),addr)print ('......received from and returned to:',addr)udpSerSock.close()
建立一個UDP用戶端
from socket import *#不需要和伺服器建立連結直接把訊息發出去然後等待伺服器的回複。HOST='<span style="font-family:arial,宋體,sans-serif;"> </span>'PORT=21567BUFSIZE=1024ADDR=(HOST,PORT)udpCliSock=socket(AF_INET,SOCK_DGRAM)while True: data=input('> ') if not data: break data=data.encode() udpCliSock.sendto(data,ADDR) data,ADDR=udpCliSock.recvfrom(BUFSIZE) if not data: break print (data)udpCliSock.close()
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
python網路編程