Dave Python 練習十九 — 網路用戶端編程

來源:互聯網
上載者:User

#encoding=utf-8</p><p>####**************** 網路用戶端編程 *******************</p><p>#本篇學習三個網際網路協議——FTP, NNTP 和POP3,並寫出它們的用戶端程式。</p><p>#************* Part 1: 檔案傳輸 ************************<br />## 1.1 檔案傳輸網際網路協議<br />#網際網路中最流行的事情就是檔案的交換。檔案交換無處不在。有很多協議可以供網際網路上傳輸<br />#檔案使用。最流行的有檔案傳輸通訊協定(FTP),Unix-to-Unix 複製協議(UUCP),以及網頁的超文本傳輸<br />#協議(HTTP)。另外,還有(Unix 下的)遠程檔案複製指令rcp(以及更安全,更靈活的scp 和rsync)。<br />#<br />#迄今為止,HTTP,FTP 和scp/rsync 還是非常流行的。HTTP 主要用於網頁檔案的下載和訪問Web<br />#服務上。它一般不要求使用者輸入登入的使用者名稱密碼就可以訪問伺服器上的檔案和服務。HTTP 檔案傳<br />#輸請求主要是用於擷取網頁(檔案下載)。<br />#<br />#相對的,scp 和rsync 要求使用者登入到伺服器,否則不能上傳或下載檔案。至於FTP,跟scp/rsync<br />#一樣,可以上傳或下載檔案,還採用了Unix 的多使用者的概念,使用者一定要輸入有效使用者名稱和密碼<br />#才能使用。不過,FTP 也允許匿名登入。</p><p>## 1.2 檔案傳輸通訊協定(FTP)<br />#檔案傳輸通訊協定由已故的Jon Postel 和Joyce Reynolds 開發,記錄在RFC(Request for<br />#Comment)959 號文檔中,於1985 年10 月發布。它主要用於匿名下載公用檔案。也可以用於在兩台<br />#電腦之間傳輸檔案,尤其是在使用Unix 系統做為檔案儲存體系統,使用其它機器來工作的情況。早<br />#在網路流行之前,FTP 就是在網際網路上檔案傳輸,軟體和原始碼下載的主要手段之一。<br />#<br />#FTP 要求輸入使用者名稱和密碼才能訪問遠端FTP 伺服器,但它也允許沒有帳號的使用者以匿名使用者<br />#登入。不過,管理員要先設定FTP 伺服器允許匿名使用者登入。這時,匿名使用者的使用者名稱是“anonymous”,<br />#密碼一般是使用者的e-mail 地址。與特定的使用者擁有特定的帳戶不同,這有點像是把FTP 公開出來讓<br />#大家訪問。匿名使用者通過FTP 協議可以使用的命令與一般的使用者相比來說,限制更多。</p><p>#一般,在用戶端超過15 分鐘(900 秒)不活動之後,串連就會被關閉。<br />#在底層上,FTP 只使用TCP。而且,FTP 是用戶端/伺服器編程中很“與眾不同”的例子。<br />#用戶端和伺服器都使用兩個通訊端來通訊:一個是控制和命令連接埠(21 號連接埠),另一個是資料連接埠(有時是20 號連接埠)。</p><p>#“有時”是因為FTP 有兩種模式:主動和被動。只有在主動模式伺服器才使用資料連接埠。<br />#在伺服器把20 號連接埠設定為資料連接埠後,它“主動”串連用戶端的資料連接埠。而被動模式中,服務<br />#器只是告訴用戶端它的隨機連接埠的號碼,用戶端必須主動建立資料連線。在這種模式下,你會看到,<br />#FTP 伺服器在建立資料連線時是“被動”的。最後,現在已經有了一種擴充被動模式來支援第6 版本<br />#的網際網路協議(IPv6)地址。</p><p>## 1.3 Python 和FTP</p><p>#使用Python 的FTP 支援時,需要匯入ftplib 模組,並執行個體化一個ftplib.FTP類對象。<br />#所有的FTP 操作(如登入,傳輸檔案和登出等)都要使用這個對象來完成。Python的虛擬碼:<br />#<br />#from ftplib import FTP<br />#f = FTP('ftp.python.org')<br />#f.login('anonymous', 'guess@who.org')<br />#:<br />#f.quit()</p><p>## 1.4 </p><p>## 1.4 ftplib.FTP 類方法<br />#FTP 對象的方法<br />#方法 描述<br />#login(user='anonymous',passwd='', acct='') 登入到FTP 伺服器,所有的參數都是可選的<br />#pwd() 得到當前工作目錄<br />#cwd(path) 把當前工作目錄設定為path<br />#dir([path[,...[,cb]]) 顯示path 目錄裡的內容,可選的參數cb 是一個回呼函數,它會被傳給retrlines()方法<br />#nlst([path[,...]) 與dir()類似,但返回一個檔案名稱的列表,而不是顯示這些檔案名稱<br />#retrlines(cmd [, cb]) 給定FTP 命令(如“RETR filename”),用於下載文字檔。可選的回呼函數cb 用於處理檔案的每一行<br />#retrbinary(cmd, cb[,bs=8192[, ra]]) 與retrlines()類似,只是這個指令處理二進位檔案。回呼函數cb 用於處理每一塊(塊大小預設為8K)下載的資料。<br />#storlines(cmd, f) 給定FTP 命令(如“STOR filename”),以上傳文字檔。要給定一個檔案對象f<br />#storbinary(cmd, f[,bs=8192]) 與storlines()類似,只是這個指令處理二進位檔案。要給定一個檔案對象f,上傳塊大小bs 預設為8Kbs=8192])<br />#rename(old, new) 把遠程檔案old 改名為new<br />#delete(path) 刪除位元於path 的遠程檔案<br />#mkd(directory) 建立遠程目錄<br />#rmd(directory) 刪除遠程目錄<br />#quit() 關閉串連並退出<br />#<br />#在一般的FTP 通訊中,要使用到的指令有login(), cwd(), dir(), pwd(), stor*(), retr*()和quit()。</p><p>## 1.5 FTP 串連FTP樣本</p><p>#from ftplib import FTP<br />#f=FTP('192.168.1.168')<br />#f.login('tmp', 'tmp')<br />#f.dir()<br />#print('---create a directory----')<br />#f.mkd('dave')<br />#f.dir()<br />#f.quit()<br />#-->輸出結果<br />#drw-rw-rw- 1 user group 0 Sep 19 15:38 .<br />#drw-rw-rw- 1 user group 0 Sep 19 15:38 ..<br />#---create a directory----<br />#drw-rw-rw- 1 user group 0 Sep 19 15:53 .<br />#drw-rw-rw- 1 user group 0 Sep 19 15:53 ..<br />#drw-rw-rw- 1 user group 0 Sep 19 15:53 dave</p><p>## 1.6 用戶端FTP 程式舉例:從FTP 下載檔案:dave.txt<br />#import ftplib<br />#import os<br />#import socket<br />#<br />#HOST = '192.168.1.168'<br />#USER = 'tmp'<br />#PWD = 'tmp'<br />#DIRN = 'dave'<br />#FILE = 'dave.txt'<br />#<br />#def main():<br /># try:<br /># f = ftplib.FTP(HOST)<br /># except (socket.error, socket.gaierror) as e:<br /># print('ERROR: cannot reach "%s"' % HOST)<br /># return<br /># print('*** Connected to host "%s"' % HOST)<br />#<br /># try:<br /># f.login(USER,PWD)<br /># except ftplib.error_perm:<br /># print('ERROR: cannot login anonymously')<br /># f.quit()<br /># return<br /># print('*** Logged in as [%s]' % USER)<br />#<br /># try:<br /># f.cwd(DIRN)<br /># except ftplib.error_perm:<br /># print('ERROR: cannot CD to "%s"' % DIRN)<br /># f.quit()<br /># return<br /># print('*** Changed to "%s" folder' % DIRN)<br />#<br /># try:<br /># f.retrbinary('RETR %s' % FILE, open(FILE, 'wb').write)<br /># except ftplib.error_perm:<br /># print('ERROR: cannot read file "%s"' % FILE)<br /># os.unlink(FILE)<br /># else:<br /># print('*** Downloaded "%s" to CWD' % FILE)<br /># f.quit()<br /># return<br />#<br />#if __name__ == '__main__':<br /># main()<br />#<br />#-->輸出日誌:<br />#*** Connected to host "192.168.1.168"<br />#*** Logged in as [tmp]<br />#*** Changed to "dave" folder<br />#*** Downloaded "dave.txt" to CWD</p><p>#************* Part 2: 網路新聞 ************************</p><p>## 2.1 Usenet 與新聞群組<br />#Usenet 新聞系統是一個全球存檔的“電子公告板”。各種主題的新聞群組一應俱全,從詩歌到政治,<br />#從自然語言學到電腦語言,軟體到硬體,種植到烹飪,招工,應聘,音樂,魔術,分手,求愛等。<br />#新聞群組可以是面向全球泛泛而談,也可以是只面向某個地理地區。<br />#<br />#整個系統是一個由大量電腦群組成的一個龐大的全球網路,電腦之間共用Usenet 上的文章.如<br />#果某一個使用者發了一個文章到本地的Usenet 電腦上,這個文章會被傳播到其它相連的電腦上,<br />#並再由這些電腦傳到與它們相連的電腦上,直到這個文章傳播到了全世界,每個人都收到這個帖<br />#子為止.<br />#<br />#每個系統都有一個它已經“訂閱”的新聞群組的列表,它只接收它感興趣的新聞群組裡的文章——<br />#而不是伺服器上所有新聞群組的文章。Usenet 新聞群組服務內容取決於服務提供者,很多都是可供公眾<br />#訪問的,也有一些只允許特定的使用者使用,例如付費使用者,特定大學的學生等。如果Usenet 系統<br />#管理員設定了的話,有可能會要求輸入使用者名稱和密碼。管理員也可以設定是否只允許上傳或只允許<br />#下載。</p><p>## 2.2 網路新聞傳輸通訊協定(NNTP)<br />#供使用者在新聞群組中下載或發表文章的方法叫網路新聞傳輸通訊協定(NNTP)。它由Brain Kantor(加<br />#利福尼亞大學聖地亞哥分校)和Phil Lapsley(加利福尼亞大學伯克利分校)建立並記錄在RFC 977<br />#中,於1986 年2 月公布。其後的更新記錄在RFC 2980,於2000 年10 月公布。<br />#<br />#作為用戶端/伺服器架構的另一個例子,NNTP 與FTP 的操作方式很像,而且簡單得多。FTP 需<br />#要不同的連接埠來做登入,資料轉送和控制,而NNTP 只使用一個標準連接埠119 來做通訊。</p><p>## 2.3 Python 和NNTP</p><p>#協議操作步驟:<br />#1. 串連到伺服器<br />#2. 登入(如果需要的話)<br />#3. 發送請求<br />#4. 退出</p><p>#虛擬碼:<br />#from nntplib import NNTP<br />#n = NNTP('your.nntp.server')<br />#r,c,f,l,g = n.group('comp.lang.python')<br />#...<br />#n.quit()</p><p>#一般來說,在你登入完成後,你要調用group()方法來選擇一個感興趣的新聞群組。方法返回服務<br />#器的返回資訊,文章的數量,第一個和最後一個文章的ID,以及組的名字。</p><p>## 2.4 nntplib.NNTP 類方法<br />#NNTP 對象的方法<br />#方法 描述<br />#group(name) 選擇一個組的名字,返回一個元組(rsp,ct,fst,lst,group):<br /># 伺服器的返回資訊,文章的數量,第一個和最後一個文章的號<br /># 碼以及組名,所有資料都是字串。(返回的group 與我們傳進去的name 應該是相同的)<br />#xhdr(hdr, artrg,[ofile]) 返迴文章範圍artrg('頭-尾'的格式)內文章hdr 頭的列表,或輸出到檔案ofile 中<br />#body(id[,ofile]) 給定文章的id,id 可以是訊息的ID(放在角括弧裡),或一個文章號(是一個字串),<br /># 返回一個元組(rsp, anum, mid,data): 伺服器的返回資訊,文章號(是一個字串),訊息<br /># 的ID(放在角括弧裡),和文章所有行的列表或把資料輸出到檔案ofile 中。<br />#head(id) 與body()相似,只是返回的元組中那個行的列表中只包含了文章的標題。<br />#article(id) 也跟body()一樣,只是返回的元組中那個行的列表中包含了文章的標題和內容。<br />#stat(id) 讓文章的“指標”指向id(同上,是一個訊息的ID 或是文章的號碼)。<br /># 返回一個跟body 一樣的元組(rsp, anum, mid),但不包含文章的資料。<br />#next() 用法和stat()類似,把文章指標移到下一篇文章,返回與stat()相似的元組<br />#last() 用法和stat()類似,把文章指標移到最後一篇文章,返回與stat()相似的元組<br />#post(ufile) 上傳ufile 檔案對象裡的內容(使用ufile.readline()),並在當前新聞群組發表。<br />#quit() 關閉串連,然後退出</p><p>## 2.5 互動式NNTP 樣本</p><p>#from nntplib import NNTP<br />#n = NNTP('your.nntp.server')<br />#rsp, ct, fst, lst, grp = n.group('comp.lang.python')<br />#rsp, anum, mid, data = n.article('110457')<br />#for eachLine in data:<br /># print(eachLine)<br />#n.quit()</p><p>#************* Part 3: 電子郵件 ************************</p><p>## 3.1 E-mail 系統組件和協議<br />#發送電腦要查詢到某一台中間主機,這台中間主機能到達最後的收件主機。然後這台中間主機<br />#要找一台離目的主機更近一些的主機。所以,在發送主機和目的主機之間,可能會有多台叫做“跳<br />#板”的主機。如果你仔細看看你收到的e-mail 的郵件標頭,你會看到一個“passport”標記,其中記<br />#錄了郵件寄給你這一路上都到過了哪些地方。<br />#<br />#在e-mail 系統的各個組件中。最主要的組件是訊息傳輸代理(MTA)。<br />#這是一個在郵件交換主機上啟動並執行一個伺服器程式,它負責郵件的路由,隊列和發送工作。<br />#它們就是郵件從源主機到目的主機所要經過的跳板。所以也被稱為是“資訊傳輸”的“代理”。<br />#要讓所有這些工作起來,MTA 要知道兩件事情:1) 如何找到訊息應該去的下一台MTA 2) 如何<br />#與另一台MTA 通訊。第一件事由網域名稱服務 (DNS)(DNS)來尋找目的網域名稱的MX(郵件交換Mail eXchange)<br />#來完成。這對於最後的收件者是不必要的,但對其它的跳板來說,則是必要的。</p><p>## 3.2 </p><p>## 3.2.1 SMTP 簡易郵件傳輸通訊協定<br /># SMTP 於1982 年出現,由已故的Jonathan Postel(加利福尼亞大學資訊學院)建立,記錄在RFC 821 中,於<br />#1982 年8 月公布。其後的修改記錄在RFC 2821 中,於2001 年4 月公布。</p><p>#一些已經實現了SMTP的著名MTA 包括:<br />#<br />###開源MTA<br /># Sendmail<br /># Postfix<br /># Exim<br /># qmail (免費發布,但不開源)<br />#<br />###商業MTA<br /># Microsoft Exchange<br /># Lotus Notes Domino Mail Server</p><p>#注意,雖然它們都實現了RFC 2821 中定義的最小化SMTP 協議,它們中的大多數,尤其是一些<br />#商業MTA,都在伺服器中加入了協議定義之外的特有的功能。<br />#<br />#SMTP 是在網際網路上MTA 之間用於訊息交換的最常用的MTS。它被MTA 用來把e-mail 從一台主機<br />#傳送到另一台主機。在你發e-mail 的時候,你必須要串連到一個外部的SMTP 伺服器,這時,你的<br />#郵件程式是一個SMTP 用戶端。你的SMTP 伺服器也因此成為了你的訊息的第一個跳板。</p><p>## 3.2.2 Python 和SMTP<br />#Python 串連STMP 通過 smtplib 模組來實現。</p><p>#Python 的虛擬碼:<br />#from smtplib import SMTP<br />#n = SMTP('smtp.yourdomain.com')<br />#pass<br />#n.quit()</p><p>## 3.2.3 smtplib.SMTP 類方法<br />#對大多數e-mail 發送程式來說,只有兩個方法是必須的:sendmail()和quit()。<br />#sendmail()的所有參數都要遵循RFC 2822,即e-mail 地址必須要有正確的格式,訊息體要有正<br />#確的前置頭,前置頭後面是兩個斷行符號和換行(\r\n)對。</p><p>#SMTP 對象的方法<br />#方法 描述<br />#Sendmail(from, to, msg[,mopts, ropts]) 把msg 從from 發送給to(列表或元組)。ESMTP 設定(mopts)和收件者設定(ropts)為可選。<br />#quit() 關閉串連,然後退出<br />#login(user, passwd) 使用user 使用者和passwd 密碼登入到SMTP 伺服器</p><p>## 3.2.3 互動式SMTP 樣本</p><p>#import smtplib<br />#<br />#def prompt(prompt):<br /># return input(prompt).strip()<br />#<br />#fromaddr = prompt("From: ")<br />#toaddrs = prompt("To: ").split()<br />#print("Enter message, end with ^D (Unix) or ^Z (Windows):")<br />#<br />## Add the From: and To: headers at the start!<br />#msg = ("From: %s\r\nTo: %s\r\n\r\n"<br /># % (fromaddr, ", ".join(toaddrs)))<br />#while True:<br /># try:<br /># line = input()<br /># except EOFError:<br /># break<br /># if not line:<br /># break<br /># msg = msg + line<br />#<br />#print("Message length is", len(msg))<br />#<br />#server = smtplib.SMTP('smtp.gmail.com')<br />#server.starttls() #啟動TLS模式,Gmail要求<br />#server.set_debuglevel(1)<br />#server.login('username', 'pwd')<br />#server.sendmail(fromaddr, toaddrs, msg)<br />#server.quit()<br />##-->輸出日誌<br />#From: dvd.dba@gmail.com<br />#To: dvd.dba@gmail.com<br />#Enter message, end with ^D (Unix) or ^Z (Windows):<br />#david dai<br />#<br />#Message length is 59<br />#<br />#send: 'ehlo [192.168.3.115]\r\n'<br />#reply: b'250-mx.google.com at your service, [60.191.73.11]\r\n'<br />#reply: b'250-SIZE 35882577\r\n'<br />#reply: b'250-8BITMIME\r\n'<br />#reply: b'250-AUTH LOGIN PLAIN XOAUTH\r\n'<br />#reply: b'250 ENHANCEDSTATUSCODES\r\n'<br />#reply: retcode (250); Msg: b'mx.google.com at your service, [60.191.73.11]\nSIZE 35882577\n8BITMIME\nAUTH LOGIN PLAIN XOAUTH\nENHANCEDSTATUSCODES'<br />#send: 'AUTH PLAIN AGR2ZC5kYmEAJFlzYW5xYkgkMTY4\r\n'<br />#reply: b'235 2.7.0 Accepted\r\n'<br />#reply: retcode (235); Msg: b'2.7.0 Accepted'<br />#send: 'mail FROM:<dvd.dba@gmail.com> size=59\r\n'<br />#reply: b'250 2.1.0 OK n10sm15106361pbe.4\r\n'<br />#reply: retcode (250); Msg: b'2.1.0 OK n10sm15106361pbe.4'<br />#send: 'rcpt TO:<dvd.dba@gmail.com>\r\n'<br />#reply: b'250 2.1.5 OK n10sm15106361pbe.4\r\n'<br />#reply: retcode (250); Msg: b'2.1.5 OK n10sm15106361pbe.4'<br />#send: 'data\r\n'<br />#reply: b'354 Go ahead n10sm15106361pbe.4\r\n'<br />#reply: retcode (354); Msg: b'Go ahead n10sm15106361pbe.4'<br />#data: (354, b'Go ahead n10sm15106361pbe.4')<br />#send: b'From: dvd.dba@gmail.com\r\nTo: dvd.dba@gmail.com\r\n\r\ndavid dai\r\n.\r\n'<br />#reply: b'250 2.0.0 OK 1316596683 n10sm15106361pbe.4\r\n'<br />#reply: retcode (250); Msg: b'2.0.0 OK 1316596683 n10sm15106361pbe.4'<br />#data: (250, b'2.0.0 OK 1316596683 n10sm15106361pbe.4')<br />#send: 'quit\r\n'<br />#reply: b'221 2.0.0 closing connection n10sm15106361pbe.4\r\n'<br />#reply: retcode (221); Msg: b'2.0.0 closing connection n10sm15106361pbe.4'</p><p>## 3.2.4 接收E-mail<br />#郵件使用者代理(MUA):MUA 從伺服器上下載郵件,在這個過程中可能會自動刪除它們(也可能不刪除,留在伺服器上,讓使用者手動刪除)。<br />#不過,MUA 也必須要能發送郵件。也就是說,在發送郵件的時候,它要能直接與MTA 用SMTP 進行通訊。</p><p>## 3.2.5 POP 和IMAP</p><p>#用於下載郵件的第一個協議叫郵局協議(POP),記錄在RFC 918 中,於1984 年10 月公布。“郵局協議<br />#(POP)的目的是讓使用者的工作站可以訪問郵箱伺服器裡的郵件。郵件要能從工作站通過簡單郵件傳<br />#輸協議(SMTP)發送到郵件伺服器”。POP 協議的最新版本是第3 版,也叫POP3。</p><p>#在POP 之後幾年,出現了另一個協議,叫互動式郵件訪問協議(IMAP)。第一個版本是實驗性的.<br />#直到第2 版時,其RFC 1064 才在1988 年被公布。現在被使用的IMAP 版本是IMAP4rev1,它也被廣<br />#泛地使用。事實上,當今世界上佔有郵件伺服器大多數市場的Microsoft Exchange 就使用IMAP 作<br />#為其下載機制。IMAP4rev1 協議定義在RFC 3501,於2003 年3 月公布。IMAP 的目的是要提供一個更<br />#全面的解決方案.</p><p>## 3.2.6 Python 和POP3<br />#匯入poplib,執行個體化poplib.POP3 類</p><p>#Python 的虛擬碼如下:<br />#from poplib import POP3<br />#p = POP3('pop.python.is.cool')<br />#p.user(...)<br />#p.pass_(...)<br />#...<br />#p.quit()</p><p>## 3.2.7 互動式POP3 舉例</p><p>#import poplib<br />#<br />#M = poplib.POP3('pop.qq.com')<br />#M.user('username')<br />#M.pass_('pwd')<br />#numMessages = len(M.list()[1])<br />#for i in range(numMessages):<br /># for j in M.retr(i+1)[1]:<br /># print(j)</p><p>## 3.2.7 poplib.POP3 類方法</p><p>#POP3 對象的常用方法<br />#方法 描述<br />#user(login) 發送使用者名稱login 到伺服器,並等候伺服器的正在等待使用者密碼的返回資訊<br />#pass_(passwd) 發送密碼passwd(在使用user()登入之後使用)。如果登入失敗,引發一個異常<br />#stat() 返回郵件的狀態,一個長度為2 的元組(msg_ct, mbox_siz):訊息的數量和訊息的總大小也即位元組數<br />#list([msgnum]) stat()的擴充,從伺服器返回長度為3 的元組的訊息列表(rsp, msg_list,rsp_siz):伺服器的返回資訊,訊息的列表,返回資訊的大小。<br /># 如果給了msgnum 的話,只返回指定訊息的資料。<br />#retr(msgnum) 從伺服器中得到訊息msgnum,並設定其“已讀”標誌。<br /># 返回一個長度為3 的元組(rsp, msglines, msgsiz):伺服器的返回資訊,訊息msgnum的所有行,訊息的位元組數<br />#dele(msgnum) 把訊息msgnum 標記為刪除,大多數伺服器在調用quit()後執行刪除操作。<br />#quit() 登出,儲存修改(如,執行“已讀”和“刪除”標記等),解鎖郵箱,結束串連,然後退出</p><p>#在登入時,user()方法不僅向伺服器發送了使用者名稱,也要等待伺服器正在等待使用者密碼的返回信<br />#息。如果pass_()方法認證失敗,會引發一個poplib.error_proto 的異常。<br />#如果成功,會得到一個以'+'號開頭的返回資訊,如“+OK ready”,然後伺服器上的該郵箱就被鎖定了,直到調用了quit()方法為止。<br />#調用list()方法時,msg_list 的格式為:[‘msgnum msgsiz’,…],其中,msgnum 和msgsiz分別是每個訊息的編號和訊息的大小。<br />

 

 

 

 

-------------------------------------------------------------------------------------------------------

Blog: http://blog.csdn.net/tianlesoftware

Weibo: http://weibo.com/tianlesoftware

Email: dvd.dba@gmail.com

DBA1 群:62697716(滿);   DBA2 群:62697977(滿)  DBA3 群:62697850(滿)  

DBA 超級群:63306533(滿);  DBA4 群:83829929(滿) DBA5群: 142216823(滿) 

DBA6 群:158654907(滿)   DBA7 群:69087192(滿)  DBA8 群:172855474

DBA 超級群2:151508914  DBA9群:102954821     聊天 群:40132017(滿)

--加群需要在備忘說明Oracle資料表空間和資料檔案的關係,否則拒絕申請

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.