多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > Python之網絡編程

Python之網絡編程

來源:程序員人生   發布時間:2015-08-04 08:28:15 閱讀次數:3590次

1、套接字

套接字是為特定網絡協議(例如TCP/IP,ICMP/IP,UDP/IP等)套件對上的網絡利用程序提供者提供當前可移植標準的對象。它們允許程序接受并進行連接,如發送和接受數據。為了建立通訊通道,網絡通訊的每一個端點具有1個套接字對象極其重要。

套接字為BSD UNIX系統核心的1部份,而且他們也被許多其他類似UNIX的操作系統包括Linux所采用。許多非BSD UNIX系統(如ms-dos,windows,os/2,mac os及大部份主機環境)都以庫情勢提供對套接字的支持。

3種最流行的套接字類型是:stream,datagram和raw。stream和datagram套接字可以直接與TCP協議進行接口,而raw套接字則接口到IP協議。但套接字其實不限于TCP/IP。

2、套接字模塊

套接字模塊是1個非常簡單的基于對象的接口,它提供對低層BSD套接字樣式網絡的訪問。使用該模塊可以實現客戶機和服務器套接字。要在python中建立具有TCP和流套接字的簡單服務器,需要使用socket模塊。利用該模塊包括的函數和類定義,可生成通過網絡通訊的程序。1般來講,建立服務器連接需要6個步驟。

第1步是創建socket對象。調用socket構造函數。

socket=socket.socket(familly,type)

要創建1個套接字,你必須使用socket.socket()函數,它在socket模塊,其中有1般的語法:

s = socket.socket (socket_family, socket_type, protocol=0)

下面是參數的描寫:

  • socket_family: 這是AF_UNIX或AF_INET,正如我剛才解釋.

  • socket_type: 這是SOCK_STREAM,或為SOCK_DGRAM.

  • protocol: 這通常被不用關心,默許為0.

family的值可以是AF_UNIX(Unix域,用于同1臺機器上的進程間通訊),也能夠是AF_INET(對IPV4協議的TCP和UDP),至于type參數,SOCK_STREAM(流套接字)或 SOCK_DGRAM(數據報文套接字),SOCK_RAW(raw套接字)。

第2步則是將socket綁定(指派)到指定地址上,socket.bind(address)

address必須是1個雙元素元組,((host,port)),主機名或ip地址+端口號。如果端口號正在被使用或保存,或主機名或ip地址毛病,則引發socke.error異常。

第3步,綁定后,必須準備好套接字,以便接受連接要求。

socket.listen(backlog)

backlog指定了最多連接數,最少為1,接到連接要求后,這些要求必須排隊,如果隊列已滿,則謝絕要求。

第4步,服務器套接字通過socket的accept方法等待客戶要求1個連接:

connection,address=socket.accept()

調用accept方法時,socket會進入'waiting'(或阻塞)狀態??蛻粢筮B接時,方法建立連接并返回服務器。accept方法返回1個含有倆個元素的元組,形如(connection,address)。第1個元素(connection)是新的socket對象,服務器通過它與客戶通訊;第2個元素(address)是客戶的internet地址。

第5步是處理階段,服務器和客戶通過send和recv方法通訊(傳輸數據)。服務器調用send,并采取字符串情勢向客戶發送信息。send方法返回已發送的字符個數。服務器使用recv方法從客戶接受信息。調用recv時,必須指定1個整數來控制本次調用所接受的最大數據量。recv方法在接受數據時會進入'blocket'狀態,最后返回1個字符串,用它來表示收到的數據。如果發送的量超過recv所允許,數據會被截斷。過剩的數據將緩沖于接受端。以后調用recv時,過剩的數據會從緩沖區刪除。

第6步,傳輸結束,服務器調用socket的close方法以關閉連接。

建立1個簡單客戶連接則需要4個步驟。

第1步,創建1個socket以連接服務器 socket=socket.socket(family,type)

第2步,使用socket的connect方法連接服務器 socket.connect((host,port))

第3步,客戶和服務器通過send和recv方法通訊。

第4步,結束后,客戶通過調用socket的close方法來關閉連接。

實例:

這是Socket Server 部份:

import socket

s = socket.socket()

host = socket.gethostname()
port = 8088
s.bind((host,port))

s.listen(5)
while True:
	c, addr = s.accept()
	print 'Got connection from', addr
	c.send('Thank you for connection')
	c.close()

這是Socket Client 部份:

import socket

s = socket.socket()

host = socket.gethostname()
port = 8088

s.connect((host,port))
print s.recv(1024)

運行時,請將對應的端口(這里是8088)添加到防火墻的InBound和OutBound的規則中。

1.2 urllib 和 urllib2 模塊

urlliburllib2 是Python標準庫中最強的的網絡工作庫。通過這兩個庫所提供的上層接口,使我們可以像讀取本地文件1樣讀取網絡上的文件。而且 urllib2 其實不是 urllib 的升級版本(應當是1種補充),2者是不可相互替換的。

通過使用 urlliburlopen 函數可以很容易的打開遠程的文件,以下:

from urllib import urlopen

webpage = urlopen('http://www.cnblogs.com/IPrograming/')
txt = webpage.readline(45)
print txt  # !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 

也能夠通過在通過在路徑的前面添加 file: 來訪問本地文件:

from urllib import urlopen

webpage = urlopen(r'file:D:Hsr23updADD_ABBR.txt')
txt = webpage.readline(45)
print txt 

如果你還可以通過 urllib 提供的 urlretrieve函數,來直接保存遠程文件副本:

from urllib import urlretrieve

webpage = urlretrieve('http://www.cnblogs.com/IPrograming/','C:	emp.html')
print type(webpage) # <type 'tuple'>





1.3 其他與網絡相干的模塊

除 socket、urllib和urllib2這些模塊之外標準庫還有很多和網絡相干的模塊,下面的列表是其中的1部份:

===========================================================
模塊                        描寫
===========================================================
asynchat                asyncore的增強版本                 
asyncore                異步socket處理程序                 
cgi                     基本的CGI支持                      
Cookie                  Cookie對象操作,主要用于服務器操作 
cookielib               客戶端cookie支持                   
email                   E-mail消息支持(包括MIME)           
ftplib                  FTP客戶端模塊                      
gopherlib               gopher客戶端博客                   
httplib                 HTTP客戶端模塊                     
imaplib                 IMAP4客戶端模塊                    
mailbox                 讀取幾種郵件的格式                 
mailcap                 通過mailcap文件訪問MIME配置        
mhlib                   訪問MH郵箱                         
nntplib                 NNTP客戶端模塊                     
poplib                  POP客戶端模塊                      
robotparser             支持解析Web服務器的robot文件       
SimpleXMLRPCServer      1個簡單的XML-RPC服務器            
stmpd                   SMTP服務器模塊                     
smtplib                 SMTP客戶端模塊                     
telnetlib               Telnet客戶端模塊                   
urlparse                支持解析URL                        
xmlrpclib               XML-RPC的客戶端支持                 



Python網絡模塊

可使用Python中的網絡/互聯網編程的1些重要的模塊列表.

Protocol Common function Port No Python module
HTTP Web pages 80 httplib, urllib, xmlrpclib
NNTP Usenet news 119 nntplib
FTP File transfers 20 ftplib, urllib
SMTP Sending email 25 smtplib
POP3 Fetching email 110 poplib
IMAP4 Fetching email 143 imaplib
Telnet Command lines 23 telnetlib
Gopher Document transfers 70 gopherlib, urllib

請查看上面提到所有庫的合作與FTP,SMTP的POP,IMAP協議.





最后:

1、建立socket

建立socket對象需要弄清通訊類型和協議家族。通訊類型指明了用甚么協議來傳輸數據。協議的例子包括IPv4、IPv6、IPXSPX、AFP。對internet通訊,通訊類型基本上都是AF_INET(和IPv4對應)。協議家族1般表示TCP通訊的SOCK_STREAM或表示UDP通訊的SOCK_DGRAM。因此對TCP通訊,建立1個socket連接的語句為:
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
對UDP通訊,建立1個socket連接的語句為:
s=socket.socket(socket.AF_INET,SOCK_DGRAM)

2、連接socket

連接socket需要提供1個tuple,包括host(主機名或IP)和port(遠程端口),類似代碼為:
s.connect(("www.baidu.com",80)

3、尋覓端口號

socket庫中利用getservbyname()函數可以查詢端口號,1般需要兩個參數:1是協議名,如http、smtp、pop3等,1個是端口名,如tcp、udp

例如:

import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
port=socket.getservbyname('http','tcp')
port的返回值為80。若改成:
port=socket.getservbyname('smtp','tcp')
port的返回值為25。

4、從socket獲得信息

建立socket連接后,可以通過getsockname()獲得本身的ip地址和端口號,也能夠通過getpeername()顯示遠程機器的ip地址和端口號。
如:在python shell中

>>> import socket
>>> s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
>>> port=socket.getservbyname('http','tcp')
>>> s.connect(('www.baidu.com',port))
>>> print s.getsockname()
('192.168.87.138', 3213)
>>> print s.getpeername()
('220.181.111.147', 80)

Socket 模塊的類方法
類方法 說明
Socket 低層網絡接口(每一個 BSD API)
socket.socket(family, type) 創建并返回1個新的 socket 對象
socket.getfqdn(name) 將使用點號分隔的 IP 地址字符串轉換成1個完全的域名
socket.gethostbyname(hostname) 將主機名解析為1個使用點號分隔的 IP 地址字符串
socket.fromfd(fd, family, type) 從現有的文件描寫符創建1個 socket 對象

Socket 模塊的實例方法

實例方法 說明
sock.bind( (adrs, port) ) 將 socket 綁定到1個地址和端口上
sock.accept() 返回1個客戶機 socket(帶有客戶機真個地址信息)
sock.listen(backlog) 將 socket 設置成監聽模式,能夠監聽 backlog 外來的連接要求
sock.connect( (adrs, port) ) 將 socket 連接到定義的主機和端口上
sock.recv( buflen[, flags] ) 從 socket 中接收數據,最多 buflen 個字符
sock.recvfrom( buflen[, flags] ) 從 socket 中接收數據,最多 buflen 個字符,同時返回數據來源的遠程主機和端口號
sock.send( data[, flags] ) 通過 socket 發送數據
sock.sendto( data[, flags], addr ) 通過 socket 發送數據
sock.close() 關閉 socket
sock.getsockopt( lvl, optname ) 取得指定 socket 選項的值
sock.setsockopt( lvl, optname, val ) 設置指定 socket 選項的值

舉例:
>>> import socket
>>> socket.gethostbyname('www.baidu.com')
'220.181.111.147'
>>> socket.gethostbyname('www.126.com')
'123.125.50.22'
>>> socket.getfqdn('123.125.50.22')
'123.125.50.22'
這里getfqdn卻不能返回域名?

5、處理毛病
關于毛病異常的處理,主要就是用try、except語句。如將python網絡編程學習筆記(1)中gopherclient.py進行1下修改:

復制代碼 代碼以下:

# -*- coding: cp936 -*-
##modify by 小5義
import socket,sys
port =70
host=sys.argv[1]

filename=sys.argv[2]

try:
    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
except Socket.error,e:
    print "建立socket毛?。?s"%e

try:
    s.connect((host,port))
except socket.gaierror,e:
    print "host或端口毛?。?s" %e
except socket.error,e:
    print "連接毛?。?s" %e

try:
    s.sendall(filename+" ")
except socket.error,e:
    print "數據發送毛?。?s" %e
    sys.exit(1)


while 1:
    try:
        buf=s.recv(2048)
    except socket.error,e:
        print "接收毛?。?s"%e
        sys.exit(1)
    if 'does not exist' in buf:
        print "%s文件不存在" %filename
    else:
        if not len(buf):
            break
        sys.stdout.write(buf)



參考文獻:

http://www.jb51.net/article/50857.htm

http://www.cnblogs.com/IPrograming/p/Python-socket.html

http://blog.csdn.net/alpha5/article/details/24122749

http://www.cppblog.com/lai3d/archive/2008/02/19/42919.html

http://www.showerlee.com/archives/1051

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 国产精品无码久久av | 午夜a级| 波多野结衣在线播放视频 | 日本xxxxx久色视频在线观看 | 免费观看做网站爱 | 波多野结衣久久一区二区 | 伊人免费视频网 | 亚洲天堂视频在线播放 | 亚洲成aⅴ人片在线影院八 亚洲成aⅴ人在线观看 | 最近中文字幕最新在线视频 | jizz国产精品 | 中文在线第一页 | 国产片在线观看 | 亚洲欧美另类日本 | 中文字幕在线网 | 日本高清中文字幕视频在线 | 国产美女一级做受在线观看 | 成人综合在线视频 | 国产亚洲视频在线观看 | 中文字幕精品视频在线观看 | 久久精品视频一区 | 伊人久久精品成人网 | 另类小说亚洲 | 国产免费久久精品久久久 | 日韩精品一区二区三区视频网 | 日韩亚洲一区中文字幕在线 | 日本人69式视频最长 | 欧美日韩精品一区二区三区四区 | 亚洲伊人久久大香线焦 | 91在线一区二区 | 日本japanesexxxx人妖2 | 91精品福利在线观看 | 精品欧美一区二区三区 | 亚洲不卡视频在线 | 亚洲黄色高清视频 | 中文字幕免费高清视频 | 手机看片日韩高清国产欧美 | 欧美伦理一区 | 欧美激情_区二区三区 | 国产精品亚洲综合 | 欧美最猛性xxxxx亚洲精品 |