1. OSI七層模型詳解
2. Python socket
什麼是 Socket?
Socket又稱”套接字”,應用程式通常通過”套接字”向網絡送出請求或者應答網絡請求,使主機間或者一台計算機上的程序間可以通訊。
Python 提供了兩個級别通路的網絡服務:
低級别的網絡服務支援基本的 Socket,它提供了标準的 BSD Sockets API,可以通路底層作業系統Socket接口的全部方法。
進階别的網絡服務子產品 SocketServer, 它提供了伺服器中心類,可以簡化網絡伺服器的開發。
3. socket()函數
Python 中,我們用 socket()函數來建立套接字,文法格式如下: socket.socket([family[, type[, proto]]])
參數
family: 套接字家族可以使AF_UNIX或者AF_INET
type: 套接字類型可以根據是面向連接配接的還是非連接配接分為SOCK_STREAM或SOCK_DGRAM
protocol: 一般不填預設為0.
Socket 對象(内建)方法
函數
描述
伺服器端套接字
s.bind()
綁定位址(host,port)到套接字, 在AF_INET下,以元組(host,port)的形式表示位址。
s.listen()
開始TCP監聽。backlog指定在拒絕連接配接之前,作業系統可以挂起的最大連接配接數量。該值至少為1,大部分應用程式設為5就可以了。
s.accept()
被動接受TCP用戶端連接配接,(阻塞式)等待連接配接的到來
用戶端套接字
s.connect()
主動初始化TCP伺服器連接配接,。一般address的格式為元組(hostname,port),如果連接配接出錯,傳回socket.error錯誤。
s.connect_ex()
connect()函數的擴充版本,出錯時傳回出錯碼,而不是抛出異常
公共用途的套接字函數
s.recv()
接收TCP資料,資料以字元串形式傳回,bufsize指定要接收的最大資料量。flag提供有關消息的其他資訊,通常可以忽略。
s.send()
發送TCP資料,将string中的資料發送到連接配接的套接字。傳回值是要發送的位元組數量,該數量可能小于string的位元組大小。
s.sendall()
完整發送TCP資料,完整發送TCP資料。将string中的資料發送到連接配接的套接字,但在傳回之前會嘗試發送所有資料。成功傳回None,失敗則抛出異常。
s.recvform()
接收UDP資料,與recv()類似,但傳回值是(data,address)。其中data是包含接收資料的字元串,address是發送資料的套接字位址。
s.sendto()
發送UDP資料,将資料發送到套接字,address是形式為(ipaddr,port)的元組,指定遠端位址。傳回值是發送的位元組數。
s.close()
關閉套接字
s.getpeername()
傳回連接配接套接字的遠端位址。傳回值通常是元組(ipaddr,port)。
s.getsockname()
傳回套接字自己的位址。通常是一個元組(ipaddr,port)
s.setsockopt(level,optname,value)
設定給定套接字選項的值。
s.getsockopt(level,optname[.buflen])
傳回套接字選項的值。
s.settimeout(timeout)
設定套接字操作的逾時期,timeout是一個浮點數,機關是秒。值為None表示沒有逾時期。一般,逾時期應該在剛建立套接字時設定,因為它們可能用于連接配接的操作(如connect())
s.gettimeout()
傳回目前逾時期的值,機關是秒,如果沒有設定逾時期,則傳回None。
s.fileno()
傳回套接字的檔案描述符。
s.setblocking(flag)
如果flag為0,則将套接字設為非阻塞模式,否則将套接字設為阻塞模式(預設值)。非阻塞模式下,如果調用recv()沒有發現任何資料,或send()調用無法立即發送資料,那麼将引起socket.error異常。
s.makefile()
建立一個與該套接字相關連的檔案
4. TCP socket通信流程
Socket是網絡程式設計的一個抽象概念。通常我們用一個Socket表示“打開了一個網絡連結”,而打開一個Socket需要知道目标計算機的IP位址和端口号,再指定協定類型即可。
以下是TCP socket通信流程圖
以下是python僞代碼
以下是一個基本的tcp socket服務端和用戶端代碼示例
#!/usr/bin/env python# _*_coding:utf-8_*_'''
* Created on 2017/5/23 21:59.
* @author: Chinge_Yang.
'''# 伺服器端import socket
server = socket.socket()
server.bind(('localhost', 6969)) # 綁定要監聽的端口
server.listen() # 監聽
conn, addr = server.accept() # 等待連接配接# conn是用戶端連接配接過來,在服務端生成的一個連接配接執行個體
data = conn.recv(1024) # 1024位元組
print("recv:", data)
conn.send(data.upper())
server.close()
#!/usr/bin/env python# _*_coding:utf-8_*_'''
* Created on 2017/5/23 21:55.
* @author: Chinge_Yang.
'''# 用戶端import socket
client = socket.socket() # 聲明socket類型,同時生成socket連結對象
client.connect(('localhost', 6969))
client.send("Hello world!".encode("utf-8"))
data = client.recv(1024) # 1024位元組
print("recv:", data.decode())
client.close()
socket server并發執行個體
import socketserver # 導入socketserver子產品class MyServer(socketserver.BaseRequestHandler): # 建立一個類,繼承自socketserver子產品下的BaseRequestHandler類
def handle(self): # 要想實作并發效果必須重寫父類中的handler方法,在此方法中實作服務端的邏輯代碼(不用再寫連接配接準備,包括bind()、listen()、accept()方法)
while 1:
conn = self.request
addr = self.client_address
# 上面兩行代碼,等于 conn,addr = socket.accept(),隻不過在socketserver子產品中已經替我們包裝好了,還替我們包裝了包括bind()、listen()、accept()方法
while 1:
accept_data = str(conn.recv(1024), encoding="utf8")
print(accept_data)
if accept_data == "byebye":
break
send_data = bytes(input(">>>>>"), encoding="utf8")
conn.sendall(send_data)
conn.close()if __name__ == '__main__':
sever = socketserver.ThreadingTCPServer(("127.0.0.1", 8888),
MyServer) # 傳入 端口位址 和 我們建立的繼承自socketserver子產品下的BaseRequestHandler類 執行個體化對象
sever.serve_forever() # 通過調用對象的serve_forever()方法來激活服務端
import socket
sk = socket.socket()
sk.connect(("127.0.0.1", 8888)) # 主動初始化與伺服器端的連接配接while True:
send_data = input("輸入發送内容:")
sk.sendall(bytes(send_data, encoding="utf8"))
if send_data == "byebye":
break
accept_data = str(sk.recv(1024), encoding="utf8")
print("".join(("接收内容:", accept_data)))
sk.close()
5. Python Internet 子產品
以下列出了 Python 網絡程式設計的一些重要子產品:
協定
功能用處
端口号
Python 子產品
HTTP
網頁通路
80
httplib, urllib, xmlrpclib
NNTP
閱讀和張貼新聞文章,俗稱為”文章”
119
nntplib
FTP
檔案傳輸
20
ftplib, urllib
SMTP
發送郵件
25
smtplib
POP3
接收郵件
110
poplib
IMAP4
擷取郵件
143
imaplib
Telnet
指令行
23
telnetlib
Gopher
資訊查找
70
gopherlib, urllib
本文轉自 ygqygq2 51CTO部落格,原文連結:http://blog.51cto.com/ygqygq2/1930545,如需轉載請自行聯系原作者