Socket
socket起源于Unix蛹尝,而Unix/Linux基本哲學之一就是“一切皆文件”,對于文件用【打開】【讀寫】【關閉】模式來操作。socket就是該模式的一個實現(xiàn),socket即是一種特殊的文件,一些socket函數(shù)就是對其進行的操作(讀/寫IO缠捌、打開、關閉)
基本上译蒂,Socket 是任何一種計算機網(wǎng)絡通訊中最基礎的內(nèi)容曼月。例如當你在瀏覽器地址欄中輸入 http://www.cnblogs.com/ 時,你會打開一個套接字柔昼,然后連接到 http://www.cnblogs.com/ 并讀取響應的頁面然后然后顯示出來哑芹。而其他一些聊天客戶端如 gtalk 和 skype 也是類似。任何網(wǎng)絡通訊都是通過 Socket 來完成的岳锁。
Python 官方關于 Socket 的函數(shù)請看 http://docs.python.org/library/socket.html
socket和file的區(qū)別:
1. file模塊是針對某個指定文件進行【打開】【讀寫】【關閉】
2. socket模塊是針對 服務器端 和 客戶端Socket 進行【打開】【讀寫】【關閉】
Socket服務端代碼
import socket
sk = socket.socket()
sk.bind(("127.0.0.1",8080))
sk.listen(5)
conn,address = sk.accept()
conn.sendall(bytes("Hello world",encoding="utf-8"))
socket客戶端代碼
import socket
obj = socket.socket()
obj.connect(("127.0.0.1",8080))
ret = str(obj.recv(1024),encoding="utf-8")
print(ret)
在Ipython命令行下绩衷,執(zhí)行完
用抓包工具可以看到建立了TCP鏈接
服務器發(fā)送數(shù)據(jù)之后抓包可以看到數(shù)據(jù)在TCP segment data里
socket更多功能
sk.bind(address)
s.bind(address) 將套接字綁定到地址。address地址的格式取決于地址族激率。在AF_INET下咳燕,以元組(host,port)的形式表示地址。
sk.listen(backlog)
開始監(jiān)聽傳入連接乒躺。backlog指定在拒絕連接之前招盲,可以掛起的最大連接數(shù)量。backlog等于5嘉冒,表示內(nèi)核已經(jīng)接到了連接請求曹货,但服務器還沒有調(diào)用accept進行處理的連接個數(shù)最大為5這個值不能無限大,因為要在內(nèi)核中維護連接隊列
sk.setblocking(bool)
是否阻塞(默認True),如果設置False讳推,那么accept和recv時一旦無數(shù)據(jù)顶籽,則報錯。
sk.accept()
接受連接并返回(conn,address),其中conn是新的套接字對象银觅,可以用來接收和發(fā)送數(shù)據(jù)礼饱。address是連接客戶端的地址。接收TCP 客戶的連接(阻塞式)等待連接的到來
sk.connect(address)
連接到address處的套接字究驴。一般镊绪,address的格式為元組(hostname,port),如果連接出錯,返回socket.error錯誤洒忧。
sk.connect_ex(address)
同上蝴韭,只不過會有返回值,連接成功時返回 0 熙侍,連接失敗時候返回編碼榄鉴,例如:10061
sk.close()
關閉套接字
sk.recv(bufsize[,flag])
接受套接字的數(shù)據(jù)履磨。數(shù)據(jù)以字符串形式返回,bufsize指定最多可以接收的數(shù)量庆尘。flag提供有關消息的其他信息蹬耘,通常可以忽略减余。
sk.recvfrom(bufsize[.flag])
與recv()類似,但返回值是(data,address)惩系。其中data是包含接收數(shù)據(jù)的字符串位岔,address是發(fā)送數(shù)據(jù)的套接字地址。
sk.send(string[,flag])
將string中的數(shù)據(jù)發(fā)送到連接的套接字堡牡。返回值是要發(fā)送的字節(jié)數(shù)量抒抬,該數(shù)量可能小于string的字節(jié)大小。即:可能未將指定內(nèi)容全部發(fā)送晤柄。
sk.sendall(string[,flag])
將string中的數(shù)據(jù)發(fā)送到連接的套接字擦剑,但在返回之前會嘗試發(fā)送所有數(shù)據(jù)。成功返回None芥颈,失敗則拋出異常惠勒。內(nèi)部通過遞歸調(diào)用send,將所有內(nèi)容發(fā)送出去爬坑。
sk.sendto(string[,flag],address)
將數(shù)據(jù)發(fā)送到套接字纠屋,address是形式為(ipaddr,port)的元組盾计,指定遠程地址售担。返回值是發(fā)送的字節(jié)數(shù)。該函數(shù)主要用于UDP協(xié)議署辉。
sk.settimeout(timeout)
設置套接字操作的超時期族铆,timeout是一個浮點數(shù),單位是秒哭尝。值為None表示沒有超時期哥攘。一般,超時期應該在剛創(chuàng)建套接字時設置刚夺,因為它們可能用于連接的操作(如 client 連接最多等待5s )
sk.getpeername()
返回連接套接字的遠程地址献丑。返回值通常是元組(ipaddr,port)。
sk.getsockname()
返回套接字自己的地址侠姑。通常是一個元組(ipaddr,port)
sk.fileno()
套接字的文件描述符