標籤:python socket tcp
Python 提供了兩個基本的 socket 模組。
第一個是 Socket,它提供了標準的 BSD Sockets API。
第二個是 SocketServer, 它提供了伺服器中心類,可以簡化網路伺服器的開發。
socket類型通訊端格式:
socket(family,type[,protocal])
使用給定的地址族、通訊端類型、協議編號(預設為0,一般不寫)來建立通訊端。
地址族:
| socket類型 |
描述 |
| socket.AF_UNIX |
單一個unix處理序間通訊 |
| socket.AF_INET |
伺服器之間的通訊 |
| scoket.AF_INET6 |
IPV6使用 |
通訊端類型:
| socket類型 |
描述 |
| socket.SOCK_STREAM |
流式 for TCP |
| socket.SOCK_DGRAM |
報文式資料包 for UDP |
| scoket.SOCK_RAW |
原始通訊端,普通的通訊端無法處理ICMP、IGMP等網路報文,而SOCK_RAW可以;其次,SOCK_RAW也可以處理特殊的IPv4報文;此外,利用原始通訊端,可以通過IP_HDRINCL通訊端選項由使用者構造IP頭。 |
| socket.SOCK_SEQPACKET |
可靠的連續資料包格式 |
服務端與用戶端不能直接發送列表,元組,字典。需要字串化repr(data)。
建立TCP伺服器樣本:
思路:
1、建立socket對象
tcpSerSock=socket(AF_INET,SOCK_STREAM) #創伺服器通訊端
2、綁定主機和連接埠,應當是一個元組
tcpSerSock.bind(ADDR) #通訊端與地址綁定
3、監聽
tcpSerSock.listen(5) #監聽串連,傳入串連請求的最大數
4、等待串連
conn,addr = tcpSerSock.accept() addr是IP地址,conn是發送來的資料對象
5、接受資料
data = conn.recv() 需要用conn這個對象來操作
6、發送資料
conn.send(data) or conn.sendall(data)
7、關閉通訊端
conn.close()
tcpSerSock.close()
*這裡用的decode和encode是python3建立socket時需要bytes資料
發送的時候,需要使用encode(),對端接收到,需要使用decode()
*
#建立TCP伺服器from socket import *from time import ctimeimport subprocessHOST=‘‘PORT=21567BUFSIZ=1024ADDR=(HOST,PORT)tcpSerSock=socket(AF_INET,SOCK_STREAM) #創伺服器通訊端tcpSerSock.bind(ADDR) #通訊端與地址綁定tcpSerSock.listen(5) #監聽串連,傳入串連請求的最大數while True: print(‘waiting for connection...‘) tcpCliSock,addr =tcpSerSock.accept() print(‘...connected from:‘,addr) while True: data =tcpCliSock.recv(BUFSIZ).decode() if not data: continue print(‘command=‘,data) status,result = subprocess.getstatusoutput(data) if result.strip() == 0: tcpCliSock.send((‘[%s] create a dir or file finish! ‘ %(ctime())).encode()) else: tcpCliSock.send((‘[%s] %s‘ %(ctime(),result)).encode()) tcpCliSock.close()tcpSerSock.close()
TCP用戶端樣本:
思路:
1、建立socket對象
tcpCliSock=socket(AF_INET,SOCK_STREAM) #創伺服器通訊端
2、串連主機,應當是一個元組
tcpCliSock.connect(ADDR) #通訊端與地址綁定
3、發送資料
tcpCliSock.send(data) or sendall(data)
4、接收資料
tcpCliSock.recv(1024)
5、關閉
tcpCliSock.close()
from socket import *HOST = ‘localhost‘ # or ‘localhost‘PORT = 21567BUFSIZ = 1024ADDR=(HOST,PORT)tcpCliSock = socket(AF_INET,SOCK_STREAM)tcpCliSock.connect(ADDR)while True: data = input(‘> ‘) #print(‘data=‘,data); if not data: break tcpCliSock.send(data.encode()) data = tcpCliSock.recv(BUFSIZ).decode() if not data: break print(data)tcpCliSock.close()
建立UDP伺服器
UDP協議則不需要事先建立串連,直接互相發送資料即可。
UDP服務端樣本:
思路:
1、建立socket通訊端
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
2、綁定
host=("",8000)
s.bind(host)
3、接受串連
s.recvfrom(1024)
4、發送資料
s.sendto(data,addr) 第二個參數為用戶端IP
5、關閉
s.close()
import sockets = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)host=("",8000)s.bind(host)while True: data,address = s.recvfrom(1024) print(data.decode(),address) senddata = "this is a udp server" s.sendto(senddata.encode(),address)c.close()
UDP用戶端樣本:
1、建立通訊端
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
2、串連
host=("127.0.0.1",8000)
s.connect(host)
3、發送資料
s.send(data)
4、接收資料
s.recv(1024)
5、關閉
import sockets = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)host=("127.0.0.1",8000)s.connect(host)while True: message = input("message:") s.send(message.encode()) data = s.recv(1024) print(data.decode())sl.close()
python socket編程