今天看了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()