python 之 socket 通訊
阿新 • • 發佈:2019-01-25
今天看了python 核心程式設計的第二章,講了關於python socket 模組的通訊, 記錄要點如下:
套接字:
1、AF_UNIX AF_INET
套接字地址:主機-埠對
面向連線的套接字:在通訊之前必須建立一個連線,比如使用電話給朋友打電話,實現這種連線型別的主要協議是傳輸控制協議(TCP)建立TCP套接字,必須使用SOCK_STREAM作為套接字的型別
無連線的套接字:無須建立連線,如同傳送郵政服務一樣,實現這種連線型別的主要協議是使用者資料報協議(UDP)建立UDP套接字,必須使用SOCK_DGRAM作為套接字的型別
這兩種套接字的比較:TCP可以確保資料的到達,將訊息按照順序組合在一起,最後將完整訊息傳遞給正在等待的應用程式;UDP則不一定能保證資料的到達,這些資料也沒有順序性,但是維護成本低廉,通常能夠提供更好的效能。
2、2、建立TCP伺服器 HOST = '' PORT = 21567 BUFSIZ = 1024 ADDR = (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) if not data: break tcpCliSock.send('[%s] %s' %(ctime(), data)) tcpCliSock.close() tcpSerSock.close() 3、建立TCP客戶端 from socket import * from time import ctime HOST = 'localhost' PORT = 31567 BUFSIZ = 1024 ADDR = (HOST, PORT) tcpCliSock = socket(AF_INET, SOCK_STREAM) tcpCliSock.connect(ADDR) while True: data = raw_input('> ') if not data: break tcpCliSock.send(data) data = tcpCliSock.recv(BUFSIZ) if not data: break print data tcpCliSock.close() 4、建立UDP伺服器 from socket import * from time import ctime HOST = '' PORT = 21567 BUFSIZ = 1024 ADDR = (HOST, PORT) udpSerSock = socket(AF_INET, SOCK_DGRAM) udpSerSock.bind(ADDR) while True: print 'waiting for message...' data, addr = udpSerSock.recvfrom(BUFSIZ) udpSerSock.sendto('[%s] %s' %(ctime(), data), addr) print '...recevied fro, and returned to:', addr udpSerSock.close() 5、建立UDP客戶端 from socket import * HOST = 'localhost' PORT = 21567 BUFSIZ = 1024 ADDR = (HOST, PORT) udpCliSock = socket(AF_INET, SOCK_DGRAM) while True: data = raw_input('> ') if not data: break udpCliSock.sendto(data, ADDR) data, ADDR = udpCliSock.recvfrom(BUFSIZ) if not data: break print data udpCliSock.close()