python socket编程_Python学习记录-socket编程
1. OSI七層模型詳解
2. Python socket
什么是 Socket?
Socket又稱”套接字”,應(yīng)用程序通常通過”套接字”向網(wǎng)絡(luò)發(fā)出請求或者應(yīng)答網(wǎng)絡(luò)請求,使主機(jī)間或者一臺計算機(jī)上的進(jìn)程間可以通訊。
Python 提供了兩個級別訪問的網(wǎng)絡(luò)服務(wù):
低級別的網(wǎng)絡(luò)服務(wù)支持基本的 Socket,它提供了標(biāo)準(zhǔn)的 BSD Sockets API,可以訪問底層操作系統(tǒng)Socket接口的全部方法。
高級別的網(wǎng)絡(luò)服務(wù)模塊 SocketServer, 它提供了服務(wù)器中心類,可以簡化網(wǎng)絡(luò)服務(wù)器的開發(fā)。
3. socket()函數(shù)
Python 中,我們用 socket()函數(shù)來創(chuàng)建套接字,語法格式如下:?socket.socket([family[, type[, proto]]])
參數(shù)
family: 套接字家族可以使AF_UNIX或者AF_INET
type: 套接字類型可以根據(jù)是面向連接的還是非連接分為SOCK_STREAM或SOCK_DGRAM
protocol: 一般不填默認(rèn)為0.
Socket 對象(內(nèi)建)方法
函數(shù)
描述
服務(wù)器端套接字
s.bind()
綁定地址(host,port)到套接字, 在AF_INET下,以元組(host,port)的形式表示地址。
s.listen()
開始TCP監(jiān)聽。backlog指定在拒絕連接之前,操作系統(tǒng)可以掛起的最大連接數(shù)量。該值至少為1,大部分應(yīng)用程序設(shè)為5就可以了。
s.accept()
被動接受TCP客戶端連接,(阻塞式)等待連接的到來
客戶端套接字
s.connect()
主動初始化TCP服務(wù)器連接,。一般address的格式為元組(hostname,port),如果連接出錯,返回socket.error錯誤。
s.connect_ex()
connect()函數(shù)的擴(kuò)展版本,出錯時返回出錯碼,而不是拋出異常
公共用途的套接字函數(shù)
s.recv()
接收TCP數(shù)據(jù),數(shù)據(jù)以字符串形式返回,bufsize指定要接收的最大數(shù)據(jù)量。flag提供有關(guān)消息的其他信息,通常可以忽略。
s.send()
發(fā)送TCP數(shù)據(jù),將string中的數(shù)據(jù)發(fā)送到連接的套接字。返回值是要發(fā)送的字節(jié)數(shù)量,該數(shù)量可能小于string的字節(jié)大小。
s.sendall()
完整發(fā)送TCP數(shù)據(jù),完整發(fā)送TCP數(shù)據(jù)。將string中的數(shù)據(jù)發(fā)送到連接的套接字,但在返回之前會嘗試發(fā)送所有數(shù)據(jù)。成功返回None,失敗則拋出異常。
s.recvform()
接收UDP數(shù)據(jù),與recv()類似,但返回值是(data,address)。其中data是包含接收數(shù)據(jù)的字符串,address是發(fā)送數(shù)據(jù)的套接字地址。
s.sendto()
發(fā)送UDP數(shù)據(jù),將數(shù)據(jù)發(fā)送到套接字,address是形式為(ipaddr,port)的元組,指定遠(yuǎn)程地址。返回值是發(fā)送的字節(jié)數(shù)。
s.close()
關(guān)閉套接字
s.getpeername()
返回連接套接字的遠(yuǎn)程地址。返回值通常是元組(ipaddr,port)。
s.getsockname()
返回套接字自己的地址。通常是一個元組(ipaddr,port)
s.setsockopt(level,optname,value)
設(shè)置給定套接字選項的值。
s.getsockopt(level,optname[.buflen])
返回套接字選項的值。
s.settimeout(timeout)
設(shè)置套接字操作的超時期,timeout是一個浮點數(shù),單位是秒。值為None表示沒有超時期。一般,超時期應(yīng)該在剛創(chuàng)建套接字時設(shè)置,因為它們可能用于連接的操作(如connect())
s.gettimeout()
返回當(dāng)前超時期的值,單位是秒,如果沒有設(shè)置超時期,則返回None。
s.fileno()
返回套接字的文件描述符。
s.setblocking(flag)
如果flag為0,則將套接字設(shè)為非阻塞模式,否則將套接字設(shè)為阻塞模式(默認(rèn)值)。非阻塞模式下,如果調(diào)用recv()沒有發(fā)現(xiàn)任何數(shù)據(jù),或send()調(diào)用無法立即發(fā)送數(shù)據(jù),那么將引起socket.error異常。
s.makefile()
創(chuàng)建一個與該套接字相關(guān)連的文件
4. TCP socket通信流程
Socket是網(wǎng)絡(luò)編程的一個抽象概念。通常我們用一個Socket表示“打開了一個網(wǎng)絡(luò)鏈接”,而打開一個Socket需要知道目標(biāo)計算機(jī)的IP地址和端口號,再指定協(xié)議類型即可。
以下是TCP socket通信流程圖
以下是python偽代碼
以下是一個基本的tcp socket服務(wù)端和客戶端代碼示例
#!/usr/bin/env python# _*_coding:utf-8_*_'''
* Created on 2017/5/23 21:59.
* @author: Chinge_Yang.
'''# 服務(wù)器端import socket
server = socket.socket()
server.bind(('localhost', 6969)) ?# 綁定要監(jiān)聽的端口
server.listen() ?# 監(jiān)聽
conn, addr = server.accept() ?# 等待連接# conn是客戶端連接過來,在服務(wù)端生成的一個連接實例
data = conn.recv(1024) ?# 1024字節(jié)
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字節(jié)
print("recv:", data.decode())
client.close()
socket server并發(fā)實例
import socketserver ?# 導(dǎo)入socketserver模塊class MyServer(socketserver.BaseRequestHandler): ?# 創(chuàng)建一個類,繼承自socketserver模塊下的BaseRequestHandler類
def handle(self): ?# 要想實現(xiàn)并發(fā)效果必須重寫父類中的handler方法,在此方法中實現(xiàn)服務(wù)端的邏輯代碼(不用再寫連接準(zhǔn)備,包括bind()、listen()、accept()方法)
while 1:
conn = self.request
addr = self.client_address
# 上面兩行代碼,等于 conn,addr = socket.accept(),只不過在socketserver模塊中已經(jīng)替我們包裝好了,還替我們包裝了包括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() ?# 通過調(diào)用對象的serve_forever()方法來激活服務(wù)端
import socket
sk = socket.socket()
sk.connect(("127.0.0.1", 8888)) ?# 主動初始化與服務(wù)器端的連接while True:
send_data = input("輸入發(fā)送內(nèi)容:")
sk.sendall(bytes(send_data, encoding="utf8"))
if send_data == "byebye":
break
accept_data = str(sk.recv(1024), encoding="utf8")
print("".join(("接收內(nèi)容:", accept_data)))
sk.close()
5. Python Internet 模塊
以下列出了 Python 網(wǎng)絡(luò)編程的一些重要模塊:
協(xié)議
功能用處
端口號
Python 模塊
HTTP
網(wǎng)頁訪問
80
httplib, urllib, xmlrpclib
NNTP
閱讀和張貼新聞文章,俗稱為”帖子”
119
nntplib
FTP
文件傳輸
20
ftplib, urllib
SMTP
發(fā)送郵件
25
smtplib
POP3
接收郵件
110
poplib
IMAP4
獲取郵件
143
imaplib
Telnet
命令行
23
telnetlib
Gopher
信息查找
70
gopherlib, urllib
本文轉(zhuǎn)自 ygqygq2 51CTO博客,原文鏈接:http://blog.51cto.com/ygqygq2/1930545,如需轉(zhuǎn)載請自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的python socket编程_Python学习记录-socket编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python构建二叉树_BinaryTr
- 下一篇: python求阶乘之和_python计算