Python 高級(jí) 3

1.編輯器vim

目標(biāo)

? 能夠說(shuō)出vim三種工作模式

? 能夠?qū)懗鰒im復(fù)制、剪切爱只、粘貼恬试、選中多行命令

? ? ? yy,dd,p,數(shù)字+V

? 能夠?qū)懗霾檎曳枋睢⑻鎿Q命令

? ? ? :/要查找的內(nèi)容妇拯,n下一個(gè)越锈,N上一個(gè)

? ? ? :%s/要替換的內(nèi)容/新內(nèi)容/g

? ? ? :10-20s/要替換的內(nèi)容/新內(nèi)容

<1>vim簡(jiǎn)

vim是一個(gè)類(lèi)似于Vi的著名的功能強(qiáng)大甘凭、高度可定制的文本編輯器

vim有三種基本工作模式:

? 命令模式

? 編輯模式

? 末行模式对蒲。

<2>命令行模式

任何時(shí)候蹈矮,不管用戶處于何種模式,只要按一下ESC鍵蝠咆,即可使Vi進(jìn)入命令模式刚操;我們?cè)趕hell環(huán)境(提示符為$)下輸入啟動(dòng)Vi命令菊霜,進(jìn)入編輯器時(shí)鉴逞,也是處于該模式下构捡。在該模式下勾徽,用戶可以輸入各種合法的Vi命令喘帚,用于管理自己的文檔闪幽。此時(shí)從鍵盤(pán)上輸入的任何字符都被當(dāng)做編輯命令來(lái)解釋?zhuān)糨斎氲淖址呛戏ǖ腣i命令盯腌,則Vi在接受用戶命令之后完成相應(yīng)的動(dòng)作腕够。但需注意的是帚湘,所輸入的命令并不在屏幕上顯示出來(lái)大诸。若輸入的字符不是Vi的合法命令,Vi會(huì)響鈴報(bào)警撵割。

<3>編輯模式

在命令模式下輸入插入命令i啡彬、附加命令a 庶灿、打開(kāi)命令o往踢、修改命令c菲语、取代命令r或替換命令s都可以進(jìn)入文本輸入模式惑灵。在該模式下英支,用戶輸入的任何字符都被Vi當(dāng)做文件內(nèi)容保存起來(lái)干花,并將其顯示在屏幕上池凄。在文本輸入過(guò)程中肿仑,若想回到命令模式下尤慰,按鍵ESC即可伟端。

<4>末行模式

在命令模式下责蝠,用戶按“:”鍵即可進(jìn)入末行模式下,此時(shí)Vi會(huì)在顯示窗口的最后一行(通常也是屏幕的最后一行)顯示一個(gè)“:”作為末行模式的提示符擎椰,等待用戶輸入命令。多數(shù)文件管理命令都是在此模式下執(zhí)行的(如把編輯緩沖區(qū)的內(nèi)容寫(xiě)到文件中等)叹侄。末行命令執(zhí)行完后趾代,Vi自動(dòng)回到命令模式撒强。例如:

:sp newfile

則分出一個(gè)窗口編輯newfile文件飘哨。如果要從命令模式轉(zhuǎn)換到編輯模式芽隆,可以鍵入命令a或者i胚吁;如果需要從文本模式返回腕扶,則按Esc鍵即可半抱。在命令模式下輸入“:”即可切換到末行模式代虾,然后輸入命令棉磨。

<5>vim基礎(chǔ)操作

vim是從 vi 發(fā)展出來(lái)的一個(gè)文本編輯器 乘瓤。代碼補(bǔ)完衙傀、編譯及錯(cuò)誤跳轉(zhuǎn)等方便編程的功能特別豐富

進(jìn)入插入模式:

i: 插入光標(biāo)前一個(gè)字符

I: 插入行首

a: 插入光標(biāo)后一個(gè)字符

A: 插入行未

o: 向下新開(kāi)一行,插入行首

O: 向上新開(kāi)一行,插入行首

進(jìn)入命令模式:

ESC:從插入模式或末行模式進(jìn)入命令模式

移動(dòng)光標(biāo):

h: 左移

j: 下移

k: 上移

l: 右移

M: 光標(biāo)移動(dòng)到中間行

L: 光標(biāo)移動(dòng)到屏幕最后一行行首

G: 移動(dòng)到指定行,行號(hào) -G

w: 向后一次移動(dòng)一個(gè)字

b: 向前一次移動(dòng)一個(gè)字

Ctr+d: 向下翻半屏

Ctr+u: 向上翻半屏

Ctr+f: 向下翻一屏

Ctr+b: 向上翻一屏

gg: 光標(biāo)移動(dòng)文件開(kāi)頭

G: 光標(biāo)移動(dòng)到文件末尾

刪除命令:

x: 刪除光標(biāo)后一個(gè)字符,相當(dāng)于 Del

X: 刪除光標(biāo)前一個(gè)字符,相當(dāng)于 Backspace

dd: 刪除光標(biāo)所在行,n dd 刪除指定的行數(shù)火本。也是剪切的意思钙畔,配合p粘貼使用擎析,如果沒(méi)有粘貼就是刪除揍魂。

D: 刪除光標(biāo)后本行所有內(nèi)容,包含光標(biāo)所在字符

d0: 刪除光標(biāo)前本行所有內(nèi)容,不包含光標(biāo)所在字符

dw: 刪除光標(biāo)開(kāi)始位置的字,包含光標(biāo)所在字符

撤銷(xiāo)命令:

u: 一步一步撤銷(xiāo)

Ctr-r: 反撤銷(xiāo)

重復(fù)命令:

.: 重復(fù)上一次操作的命令

文本行移動(dòng):

>>: 文本行右移

<<: 文本行左移

復(fù)制粘貼:

yy: 復(fù)制當(dāng)前行,n yy 復(fù)制 n 行

p: 在光標(biāo)所在位置向下新開(kāi)辟一行,粘貼

可視模式:

v: 按字符移動(dòng),選中文本

V: 按行移動(dòng),選中文本可視模式可以配合 d, y, >>, << 實(shí)現(xiàn)對(duì)文本塊的刪除,復(fù)制,左右移動(dòng)

替換操作:

r: 替換當(dāng)前字符

R: 替換當(dāng)前行光標(biāo)后的字符

查找命令:

:/查找內(nèi)容

n: 下一個(gè)

N: 上一個(gè)

替換命令:

把a(bǔ)bc全部替換成123

末行模式下,將當(dāng)前文件中的所有abc替換成123

:%s/abc/123/g

末行模式下步责,將第一行至第10行之間的abc替換成123

:1, 10s/abc/123/g

因?yàn)槭欠秶鷥?nèi)替換蔓肯,最后可以不用加g

小結(jié):

? %表示整個(gè)文件, 1, 10表示1到10行范圍內(nèi)

? s表示替換

? g表示全局

<6>設(shè)置vim顯示行號(hào)

? 1 >臨時(shí)顯示行號(hào)

? ? ? 如果只是臨時(shí)顯示vim的行號(hào)蔗包,只須按ESC鍵退出編輯內(nèi)容模式调限,輸入“:set number”后按回車(chē)鍵耻矮,就可以顯示行號(hào)了裆装。行號(hào)顯示只是暫時(shí)的哨免,退出vim后再次打開(kāi)vim就不顯示行號(hào)了琢唾。

? 2>永久顯示行號(hào)

? ? ? 如果想讓vim永久顯示行號(hào)采桃,則需要修改vim配置文件vimrc普办。如果沒(méi)有此文件可以創(chuàng)建一個(gè)。在啟動(dòng)vim時(shí)踪危,當(dāng)前用戶根目錄下的vimrc文件會(huì)被自動(dòng)讀取贞远,因此一般在當(dāng)前用戶的根目錄下創(chuàng)建vimrc文件蓝仲,即使用下面的命令:

? ? ? ? ? ■ vim ~/.vimrc

? ? ? ? ? ■ 在打開(kāi)的vimrc文件中最后一行輸入:set number 袱结,然后保存退出垢夹。再次用vim打開(kāi)文件時(shí)果元,就會(huì)顯示行號(hào)了而晒。

2.Linux 命令總結(jié)

? 1. 啟動(dòng)終端: ctr+alt+t

? 2. 終端字體放大: ctr+shift+'+',終端字體縮小: ctr+'-'

? 3. ls: 查看當(dāng)前目錄下的文件信息

? 4. pwd: 查看目錄所在的路徑

? 5. touch: 創(chuàng)建文件

? 6. mkdir: 創(chuàng)建文件夾

? 7. rmdir: 刪除文件夾,提示:只能是空文件夾

? 8. rm: 默認(rèn)刪除的是文件诈胜,如果刪除文件夾需要加上-r選項(xiàng)焦匈,-r:以遞歸的方式把文件夾下的所有文件信息刪除掉

? 9. cd:切換目錄

9.1 cd 目錄名 : 切換到指定目錄

9.2 cd .: 切換到當(dāng)前目錄

9.3 cd ..: 切換到上一級(jí)目錄

9.4 cd ~: 切換到當(dāng)前用戶的目錄

9.5 cd: 等價(jià)與cd ~ 切換到當(dāng)前用戶的目錄

9.6 cd -: 切換到上一次目錄

? 10. 絕對(duì)路徑: 從根目錄算起的路徑叫做絕對(duì)路徑缓熟,比如: /home/python

? 11. 相對(duì)路徑: 從當(dāng)前目錄算起的路徑叫做相對(duì)路徑, 比如: ./AAA ../BBB

? 12. 路徑的使用總結(jié): 如果離當(dāng)前目錄近使用相對(duì)路徑够滑,如果離根目錄近使用絕對(duì)路徑梯投,如果進(jìn)入的是中間目錄建議使用絕對(duì)路徑

? 13. 自動(dòng)補(bǔ)全: 兩次tab鍵

? 14. cp: 拷貝

14.1 cp 文件名 路徑: 把文件拷貝到指定路徑

14.2 cp 路徑/文件名 路徑: 把指定路徑的文件拷貝到指定路徑

14.3 cp 文件名 路徑/新的文件名 : 先把文件拷貝到指定目錄然后再重命名

14.4 cp 文件夾 路徑 -r: 拷貝文件夾 -r:以遞歸的方式把文件夾下的所有文件拷貝過(guò)去

? 15. mv: 移動(dòng)(剪切)

15.1 mv 文件名 路徑: 把文件移動(dòng)到指定路徑

15.2 mv 路徑/文件名 路徑: 把指定路徑的文件移動(dòng)到指定路徑

15.3 mv 文件名 新的文件名: 重命名

15.4 mv 文件夾 路徑: 把文件夾移動(dòng)到指定目錄分蓖,不需要加上-r

? 16. tree: 以目錄樹(shù)方式顯示當(dāng)前文件夾信息

16.1 tree / : 以目錄樹(shù)方式顯示指定路徑的文件信息

? 17. 命令的格式

17.1 命令名 選項(xiàng) 參數(shù)么鹤, 提示:有些命令選項(xiàng)可以放到參數(shù)的后面蒸甜,但是:scp 選項(xiàng)必須要放到命令名的后面

? 18. ls 選項(xiàng)

18.1 -l: 以列表的方式取顯示

18.2 -a: 顯示隱藏文件

18.3 -h: 顯示文件大小的單位

? 19. mkdir 選項(xiàng)

19.1 -p: 把依賴文件夾提取創(chuàng)建好,比如: mkdir 123/456/789 -p

? 20. rm選項(xiàng)

20.1 -r: 以遞歸的方式刪除文件夾里面的所有內(nèi)容

20.2 -i: 顯示刪除的時(shí)候提醒信息

20.3 -v: 顯示刪除后的描述信息

20.4 -d: 刪除空目錄

20.5 -f: 如果文件或者目錄存在則刪除登颓,否則就不刪除也不會(huì)報(bào)錯(cuò)

? 21. cp選項(xiàng)

21.1 -i:拷貝文件的時(shí)候如果指定目錄有該文件需要顯示提醒信息

21.2 -v:顯示拷貝文件的路徑描述

21.3 -r:以遞歸的方式拷貝文件夾里面的所有內(nèi)容

? 22. mv選項(xiàng)

22.1 -i:移動(dòng)文件顯示提醒信息

22.2 -v:顯示移動(dòng)后的路徑描述

? 23. 重定向(>,>>): 在終端顯示的內(nèi)容信息重寫(xiě)規(guī)定方向框咙,保存到指定文件里面,以后查看數(shù)據(jù)是文件查看就可以了

23.1 > :如果文件不存在者铜,那么先創(chuàng)建作烟,否則會(huì)先把原有文件的數(shù)據(jù)清空然后再寫(xiě)入

23.2 >> : 在原有數(shù)據(jù)的基礎(chǔ)上進(jìn)行追加

23.3 總結(jié): ls拿撩, cat, tree都可以使用重定向

? 24. gedit:文本編輯工具压恒,可讀可編輯

? 25. cat: 內(nèi)容在終端顯示探赫,不能進(jìn)行編輯伦吠,提示:適合查看小型文件毛仪,大型文件使用分屏方式顯示(more)

? 26. more:分屏顯示

26.1 f:表示下一頁(yè)

26.2 空格:表示下一頁(yè)

26.3 回車(chē): 表示下一行

26.4 b:表示上一頁(yè)

26.5 q:退出

? 27. 文件合并 cat 1.txt 2.txt > 3.txt

? 28. 管道: 可以理解成是一個(gè)容器潭千,存放在終端顯示的內(nèi)容

28.1 總結(jié): ls /bin | more , cat刨晴, tree, ls都是可以結(jié)合管道使用完成分屏顯示的

? 29. 鏈接

29.1 軟連接:可以理解成快捷方式,把原文件刪除掉通過(guò)軟鏈接無(wú)法打文件的數(shù)據(jù)蝶桶, 提示:創(chuàng)建軟連接不會(huì)對(duì)硬鏈接數(shù)加1

29.2 硬連接: 同一個(gè)數(shù)據(jù)有多個(gè)文件名在使用真竖,某個(gè)文件刪除掉恢共,還可以通過(guò)其它文件名訪問(wèn)這個(gè)文件的數(shù)據(jù), 提示:創(chuàng)建硬鏈接硬鏈接數(shù)會(huì)加1

29.3 提示:如果創(chuàng)建的軟鏈接沒(méi)有和原文件在同一個(gè)目錄里面透硝,那么需要使用絕對(duì)路徑創(chuàng)建軟連接

? 30. grep: 根據(jù)指定的內(nèi)容在文件中進(jìn)行查找

30.1 grep "a" 8.txt : 根據(jù)指定內(nèi)容在文件中進(jìn)行查找

30.2 -n:行號(hào), -i:忽略大小寫(xiě) -v: 取反

30.3 總結(jié): ^,$ [], . 支持的正則表達(dá)式

? 31. find:在指定目錄查找對(duì)應(yīng)的文件

31.1 find . -name ".txt": 在當(dāng)前目錄查找后綴是.txt的文件濒生, -name根據(jù)文件名查找

31.2 find . -perm 666: 在當(dāng)前目錄查找文件權(quán)限是可讀可寫(xiě)的秋泄, -perm根據(jù)權(quán)限查找

31.3 總結(jié): ? [] 支持的通配符

? 32. ls:支持的通配符: *,? , [], []:表示匹配任意列舉中的一個(gè)字符

? 33. 通配符: ? * []恒序,起到了模糊查詢的作用

? 34. tar: 打包歧胁、壓縮喊巍、解包崭参、解壓縮

34.1 打包 tar -cvf test.tar *.txt, -c: 表示要打包, -v:顯示文件打到包里面 -f:表示文檔名稱海洼,提示-f必須放到所有選項(xiàng)的后面

34.2 解包 tar -xvf test.tar , -x:表示解包

34.3 打包及壓縮合并的命令:tar -zcvf test.tar.gz *.txt

34.4 解壓縮及解包合并的命令:tar -zxvf test.tar.gz ->得到對(duì)應(yīng)的文件

34.5 指定解壓縮的路徑 tar -zxvf test.tar.gz -C ../BBB, -C:指定解壓縮后的路徑

34.6 tar -jcvf test.bz2 *.txt -> test.bz2

34.7 tar -jxvf test.bz2 -> 得到對(duì)應(yīng)的文件

34.8 -C: 指定解壓縮的路徑: tar -jxvf test.bz2 -C ../BBB

? 35. zip的壓縮及解壓縮

35.1 zip test *.txt -> test.zip ,提示:壓縮包的后綴不需要指定默認(rèn)是.zip

35.2 unzip test.zip -> 得到是壓縮包里面的文件

35.3 unzip -d ./123 test.zip -> 解壓到指定路徑 , -d:表示解壓的路徑

? 36. chmod:修改權(quán)限

36.1 -r(4):可讀 -w(2):可寫(xiě) -x(1):可執(zhí)行

36.2 u:當(dāng)前用戶 g: 同組用戶 o: 其它用戶 a:所有用戶

36.3 +:添加權(quán)限, -:撤銷(xiāo)權(quán)限 是整, = : 賦值權(quán)限

36.4 chmod 000 1.txt : 全部沒(méi)有權(quán)限

36.5 chmod a=- 1.txt chmod a= 1.txt : 全部沒(méi)有權(quán)限

36.6 chmod 777 1.txt chmod a=rwx 1.txt : 都權(quán)限,可讀可讀可執(zhí)行

36.7 chmod 664 1.txt chmod u=rw,g=rw,o=r 1.txt 設(shè)置不同用戶不同權(quán)限

? 37. cp選項(xiàng)

37.1-a: 保留文件原有權(quán)限舵盈,-a包含-r,也就是使用-a也可以拷貝文件夾

? 38. which : 查看命令的路徑

? 39. sudo -s: 切換到管理員賬號(hào)

? 40. passwd:修改密碼

? 41. who :當(dāng)前那些用戶登陸

? 42. whoami:當(dāng)前電腦登陸的用戶是誰(shuí)

? 43. exit:退出

? 44. ssh: 遠(yuǎn)程登陸 44.1 ssh : 可以遠(yuǎn)程登陸服務(wù)端可以通過(guò)vim修改文件

? 45. scp: 遠(yuǎn)程拷貝

45.1 scp 1.txt python@192.168.107.132:/home/python/Desktop ,把本地文件拷貝到服務(wù)器端

45.2 scp -r test python@192.168.107.132:/home/python/Desktop,把本地文件夾拷貝到服務(wù)器端

45.3 scp python@192.168.107.132:/home/python/Desktop/1.txt . 陋率, 把服務(wù)端的文件拷貝的本地

45.4 scp -r python@192.168.107.132:/home/python/Desktop/test . , 把服務(wù)端的文件夾拷貝的本地

? 46. apt list 支持的安裝包

? 47. vim的使用

47.1 命令模式秽晚, 編輯模式瓦糟, 末行模式, 命令模式是編輯模式和末行模式的中轉(zhuǎn)站

? 48. vim常用命令

命令模式下:

? i:插入模式光標(biāo)之前插入

? I:行首插入

? o:光標(biāo)下一行插入

? O:光標(biāo)上一行插入

? a:光標(biāo)之后插入

? A:行尾插入

? j:向下移動(dòng)

? k:向上移動(dòng)

? l:向右移動(dòng)

? h:向左移動(dòng)

? gg:跳至首行

? G:跳至末行赴蝇,數(shù)字+G:跳至指定行

? L:跳至末行

? yy:復(fù)制菩浙,數(shù)字+yy:從當(dāng)前行復(fù)制指定行數(shù)

? dd:剪切句伶,數(shù)字+dd:從當(dāng)前行剪切指定行數(shù) D刪除光標(biāo)后本行所有內(nèi)容劲蜻,包含光標(biāo)

? p:粘貼

? u:撤銷(xiāo)

? M:跳轉(zhuǎn)至屏幕中間一行

? w:向后移動(dòng)一個(gè)單詞

? b:向前移動(dòng)一個(gè)單詞

? Ctrl+d:向下翻半屏

? Ctrl+u:向上翻半屏

? Ctrl+f:向下翻一屏

? Ctrl+b:向上翻一屏

? Ctrl+r:反撤銷(xiāo)

? r:替換當(dāng)前字符

? R:替換光標(biāo)后的字符

? x:刪除光標(biāo)后一個(gè)字符

? X:刪除光標(biāo)前一個(gè)字符

? d0:刪除光標(biāo)前本行所有內(nèi)容,不包含當(dāng)前光標(biāo)所在位置

? dw:刪除光標(biāo)開(kāi)始位置的單詞考余,包含當(dāng)前字符

? >>:向右縮進(jìn) 數(shù)字+>>:當(dāng)前行開(kāi)始的指定行數(shù)向右縮進(jìn)

? <<:向左縮進(jìn) 數(shù)字+<<:當(dāng)前行開(kāi)始的指定行數(shù)向左縮進(jìn)

? v:從當(dāng)前字符選擇 選擇后:y:復(fù)制 d:剪切

? V:從當(dāng)前行選擇? 選擇后:y:復(fù)制 d:剪切

? Shift+;:進(jìn)入末行模式

末行模式下

? ? q:退出

? ? q!:強(qiáng)制退出先嬉,不保存

? ? w:保存

? ? wq:保存并退出

? ? x:保存并退出

? ? /:字符串查找? n:下一個(gè)? N:上一個(gè)

? ? %s/old/new/g:把文本中的old全部替換為new

? ? 2,10s/old/new/g:把文本中2到10行中的old替換為new

? ? !:直接在vi中執(zhí)行shell命令

3.烏班圖執(zhí)行python文件

./1.py 直接執(zhí)行.py文件,需要先在.py文件的首行輸入 #!/usr/bin/python3

#!后面跟python3的路徑楚堤,python3所在的路徑可以用which python3查詢

4.網(wǎng)絡(luò)

<1>網(wǎng)絡(luò)概述

? ? 什么是網(wǎng)絡(luò)

網(wǎng)絡(luò)就是指將具有獨(dú)立功能的多臺(tái)計(jì)算機(jī)通過(guò)通信線路連接起來(lái)疫蔓,在網(wǎng)絡(luò)管理軟件及網(wǎng)絡(luò)通信協(xié)議下,實(shí)現(xiàn)資源共享和信息傳遞的虛擬平臺(tái)身冬。

通俗理解網(wǎng)絡(luò)就是把雙方或者多方設(shè)備連接起來(lái)的一個(gè)工具衅胀,然后可以進(jìn)行數(shù)據(jù)傳遞

? 學(xué)習(xí)網(wǎng)絡(luò)的目的

能夠編寫(xiě)基于網(wǎng)絡(luò)通信的軟件,通過(guò)網(wǎng)絡(luò)把數(shù)據(jù)從一方傳遞到另外一方酥筝,完成數(shù)據(jù)的共享

通俗來(lái)說(shuō)就是能夠進(jìn)行網(wǎng)絡(luò)編程滚躯,開(kāi)發(fā)網(wǎng)絡(luò)通信程序或者軟件。

<2>ip地址

? ip地址的概念

ip地址是標(biāo)識(shí)網(wǎng)絡(luò)中唯一的一臺(tái)設(shè)備的

? ip地址的作用

通過(guò)ip地址找到網(wǎng)絡(luò)中唯一一臺(tái)設(shè)備嘿歌,然后可以給設(shè)備發(fā)送數(shù)據(jù)

? 私有ip

私有ip就是局域網(wǎng)中使用的ip地址掸掏,國(guó)際規(guī)定有一部分ip地址是在局域網(wǎng)中使用的

私有ip的范圍,也就是不在公網(wǎng)中使用的ip地址范圍:

? 10.0.0.0~10.255.255.255

? 172.16.0.0~172.31.255.255

? 192.168.0.0~192.168.255.255

? 本機(jī)ip地址

127.0.0.1表示本機(jī)ip地址; 本機(jī)域名是localhost; 通過(guò)域名可以解析一個(gè)ip地址搅幅,域名方便大家記憶某臺(tái)電腦的主機(jī)地址

<3>Linux命令(ping, ifconfig)

? 查看或配置網(wǎng)卡信息:ifconfig

? mac和Linux 用 ifconfig

? Windows 用 ipconfig

? 測(cè)試遠(yuǎn)程主機(jī)連通性:ping

? ? ? 通常用ping來(lái)檢測(cè)網(wǎng)絡(luò)是否正常

小結(jié)

? 1.ping 127.0.0.1 檢查本地網(wǎng)卡是否正常

? 2.ping www.baidu.com 檢查是否能上公網(wǎng)

? 3.ping 當(dāng)前局域網(wǎng)的ip地址 檢查是否在同一個(gè)局域網(wǎng)內(nèi)

<4>端口

? 什么是端口

端口是傳輸數(shù)據(jù)的通道阅束,好比教室的門(mén)呼胚,是數(shù)據(jù)傳輸必經(jīng)之路茄唐。

如果一個(gè)程序需要收發(fā)網(wǎng)絡(luò)數(shù)據(jù),那么就需要有這樣的端口

? 端口號(hào)

問(wèn)題:一個(gè)電腦上運(yùn)行著多個(gè)應(yīng)用程序蝇更,都需要收發(fā)數(shù)據(jù)沪编,如何區(qū)分給那個(gè)應(yīng)用程序呢?

既然有這么多端口,操作系統(tǒng)為了統(tǒng)一管理年扩,所以進(jìn)行了編號(hào)蚁廓,這就是端口號(hào)

端口號(hào):使用唯一一個(gè)編號(hào)來(lái)標(biāo)識(shí)端口, 其實(shí)就是標(biāo)識(shí)端口的一個(gè)編號(hào)。

在linux系統(tǒng)中厨幻,端口號(hào)有65536(2的16次方)個(gè)

? 端口號(hào)劃分

端口號(hào)不是隨意使用的相嵌,而是按照一定的規(guī)定進(jìn)行分配腿时。

端口號(hào)分為知名端口號(hào)和動(dòng)態(tài)端口號(hào)

? 知名端口號(hào)(Well Known Ports)

知名端口號(hào): 系統(tǒng)程序使用的端口號(hào)

知名端口號(hào)是眾所周知的端口號(hào),范圍從0到1023

80端口分配給HTTP服務(wù)

21端口分配給FTP服務(wù)

一般情況下饭宾,如果一個(gè)程序需要使用知名端口的需要有root權(quán)限

? 動(dòng)態(tài)端口號(hào)(Dynamic Ports)

動(dòng)態(tài)端口號(hào): 程序員開(kāi)發(fā)應(yīng)用程序使用端口號(hào), 之所以稱為動(dòng)態(tài)端口批糟,是因?yàn)樗话悴还潭ǚ峙淠撤N服務(wù),而是動(dòng)態(tài)分配看铆。

動(dòng)態(tài)端口的范圍是從1024到65535

? 注冊(cè)端口:端口1024到49151

? 動(dòng)態(tài)端口:從49152到65535

當(dāng)這個(gè)程序關(guān)閉時(shí)徽鼎,同時(shí)也就釋放了所占用的端口號(hào)

? 怎樣查看端口號(hào) ?

? ? ? 用 netstat -an 查看程序所使用的端口號(hào)

? ? ? lsof -i [tcp/udp]:2425 查看端口號(hào)對(duì)應(yīng)的應(yīng)用程序

提示: 如果端口號(hào)找不到應(yīng)用程序弹惦,使用管理員權(quán)限加上sudo

可以全部用sudo lsof -i:端口號(hào)

總結(jié):

網(wǎng)絡(luò)通信的流程是先通過(guò)ip地址找到網(wǎng)絡(luò)中的設(shè)備否淤,再通過(guò)端口號(hào)來(lái)找到對(duì)應(yīng)的端口,然后通過(guò)端口把數(shù)據(jù)傳輸給對(duì)應(yīng)的應(yīng)用程序

5.網(wǎng)絡(luò)傳輸方式-UDP

<1>UDP概念

UDP:英文全拼(User Datagram Protocol)簡(jiǎn)稱用戶數(shù)據(jù)報(bào)協(xié)議棠隐,它是無(wú)連接的石抡、不可靠的網(wǎng)絡(luò)傳輸協(xié)議

<2>UDP特點(diǎn)

因?yàn)閡dp發(fā)送數(shù)據(jù)之前不需要建立連接所以具有以下特點(diǎn)

? ? ? 無(wú)連接

? ? ? 資源開(kāi)銷(xiāo)小

? ? ? 傳輸速度快

? ? ? udp每個(gè)數(shù)據(jù)包最大是64K

<3>UDP的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

? 傳輸速度快

? 不需要連接,資源開(kāi)銷(xiāo)小

缺點(diǎn):

? 傳輸數(shù)據(jù)不可靠助泽,容易丟數(shù)據(jù)包

? 沒(méi)有流量控制汁雷,當(dāng)對(duì)方?jīng)]有及時(shí)接收數(shù)據(jù),發(fā)送方一直發(fā)送數(shù)據(jù)會(huì)導(dǎo)致緩沖區(qū)數(shù)據(jù)滿了报咳,電腦出現(xiàn)卡死情況侠讯,所有接收方需要及時(shí)接收數(shù)據(jù)秀存。

<4>UDP的使用場(chǎng)景

當(dāng)對(duì)網(wǎng)絡(luò)通訊質(zhì)量要求不高的時(shí)候勤晚,要求網(wǎng)絡(luò)通訊速度能盡量的快重斑,這時(shí)就可以使用UDP

? qq音視頻傳輸蔫仙,微信音視頻傳輸

? 上課使用的共屏軟件

? 發(fā)送廣播消息

小結(jié):

UDP是一個(gè)簡(jiǎn)單的面向數(shù)據(jù)報(bào)的運(yùn)輸層協(xié)議秒裕。UDP不提供可靠性俯萎,它只是把應(yīng)用程序傳給IP層的數(shù)據(jù)報(bào)發(fā)送出去火俄,但是并不能保證它們能到達(dá)目的地巢墅。由于UDP在傳輸數(shù)據(jù)報(bào)前不用在客戶和服務(wù)器之間建立一個(gè)連接架谎,且沒(méi)有超時(shí)重發(fā)等機(jī)制炸宵,故而傳輸速度很快。

6.socket介紹

<1>不同電腦上的進(jìn)程之間如何通信

首先通過(guò)ip地址找到網(wǎng)絡(luò)中對(duì)應(yīng)的電腦谷扣,然后通過(guò)傳輸協(xié)議和端口號(hào)來(lái)確定這個(gè)進(jìn)程(運(yùn)行起來(lái)的軟件)土全,那么數(shù)據(jù)如何傳輸需要使用socket來(lái)完成,也就是進(jìn)程之間通信使用socket

注意:

所謂進(jìn)程指的是:運(yùn)行的程序或者軟件稱之為進(jìn)程(在講解多任務(wù)編程時(shí)進(jìn)行詳細(xì)講解)

所謂進(jìn)程間通信指的是:運(yùn)行的程序之間的數(shù)據(jù)共享

<2>什么是socket

socket(簡(jiǎn)稱 套接字) 是進(jìn)程間通信一個(gè)工具会涎,它能實(shí)現(xiàn)把數(shù)據(jù)從一方傳輸?shù)搅硗庖环焦祝瓿刹煌娔X上進(jìn)程之間的通信, 它好比數(shù)據(jù)的搬運(yùn)工末秃。

<3>socket使用場(chǎng)景

不夸張來(lái)說(shuō)概页,只要跟網(wǎng)絡(luò)相關(guān)的應(yīng)用程序或者軟件都使用到了socket

小結(jié):

? socket就是完成不同電腦上進(jìn)程之間通信的一個(gè)工具,負(fù)責(zé)進(jìn)程之間數(shù)據(jù)的傳輸

7.udp網(wǎng)絡(luò)程序-發(fā)送练慕、接收數(shù)據(jù)

<1>udp網(wǎng)絡(luò)程序流程

創(chuàng)建一個(gè)基于udp的網(wǎng)絡(luò)程序流程很簡(jiǎn)單惰匙,具體步驟如下:

? 創(chuàng)建客戶端套接字

? 發(fā)送/接收數(shù)據(jù)

? 關(guān)閉套接字

總結(jié): 網(wǎng)絡(luò)通信的流程

1. 對(duì)方的ip地址

2. 應(yīng)用程序的端口號(hào)

3. 數(shù)據(jù)的傳輸協(xié)議(udp/tcp)

4. 使用socket收發(fā)數(shù)據(jù)

<2>創(chuàng)建socket

在 Python 中 使用socket 模塊的函數(shù) socket 就可以完成:

import socket

socket.socket(AddressFamily, Type)

說(shuō)明:

函數(shù) socket.socket 創(chuàng)建一個(gè) socket技掏,該函數(shù)帶有兩個(gè)參數(shù):

Address Family:IP地址類(lèi)型; AF_INET表示ipv4類(lèi)型、AF_INET6表示ipv6類(lèi)型; Type:套接字類(lèi)型项鬼,可以是 SOCK_STREAM(流式套接字零截,主要用于 TCP 協(xié)議)或者 SOCK_DGRAM(數(shù)據(jù)報(bào)套接字,主要用于 UDP 協(xié)議)

創(chuàng)建一個(gè)udp socket(udp套接字)

import socket

# 創(chuàng)建udp的套接字

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# ...這里是使用套接字的功能(省略)...

# 不用的時(shí)候秃臣,關(guān)閉套接字

s.close()

說(shuō)明

套接字使用流程 與 文件的使用流程很類(lèi)似 創(chuàng)建套接字 使用套接字收/發(fā)數(shù)據(jù) 關(guān)閉套接字

<3>發(fā)送數(shù)據(jù)sendto()

代碼如下:

import socket

# 1. 創(chuàng)建udp套接字

udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 2. 準(zhǔn)備接收方的地址

# '192.168.1.103'表示目的ip地址

# 8080表示目的端口

dest_addr = ('192.168.1.103', 8080)? # 注意 是元組涧衙,ip是字符串,端口是數(shù)字

# 3. 從鍵盤(pán)獲取數(shù)據(jù)

send_data = input("請(qǐng)輸入要發(fā)送的數(shù)據(jù):")

# 4. 發(fā)送數(shù)據(jù)到指定的電腦上的指定程序中

udp_socket.sendto(send_data.encode('utf-8'), dest_addr)

# 5. 關(guān)閉套接字

udp_socket.close()

<4>發(fā)送奥此、接收數(shù)據(jù)

import socket

# 1. 創(chuàng)建udp套接字

udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 2. 準(zhǔn)備接收方的地址

dest_addr = ('192.168.236.129', 8080)

# 3. 從鍵盤(pán)獲取數(shù)據(jù)

send_data = input("請(qǐng)輸入要發(fā)送的數(shù)據(jù):")

# 4. 發(fā)送數(shù)據(jù)到指定的電腦上

udp_socket.sendto(send_data.encode('utf-8'), dest_addr)

# 5. 等待接收對(duì)方發(fā)送的數(shù)據(jù)

recv_data = udp_socket.recvfrom(1024)? # 1024表示本次接收的最大字節(jié)數(shù)

# 6. 顯示對(duì)方發(fā)送的數(shù)據(jù)

# 接收到的數(shù)據(jù)recv_data是一個(gè)元組

# 第1個(gè)元素是對(duì)方發(fā)送的數(shù)據(jù)

# 第2個(gè)元素是對(duì)方的ip和端口

print(recv_data[0].decode('gbk'))

print(recv_data[1])

# 7. 關(guān)閉套接字

udp_socket.close()

8.數(shù)據(jù)編碼和解碼

? 編碼和解碼操作

? ? ? str->bytes:encode編碼

? ? ? bytes->str:decode解碼

字符串通過(guò)編碼成為字節(jié)碼弧哎,字節(jié)碼通過(guò)解碼成為字符串。

? 其中decode()與encode()方法可以接受參數(shù)稚虎,其聲明分別為:

? bytes.decode(encoding="utf-8", errors="strict")

? str.encode(encoding="utf-8", errors="strict")

其中的encoding是指在解碼編碼過(guò)程中使用的編碼格式撤嫩,errors是指錯(cuò)誤的處理方案。

注意:

? strict:表示嚴(yán)格按照指定編解碼方式進(jìn)行編碼和解碼蠢终,如果編解碼不成功則崩潰

? ignore:表示忽略編解碼不成功的字符序攘,如果編解碼不成功程序不會(huì)崩潰

9.udp綁定端口號(hào)

<1>綁定信息

一般情況下,在一臺(tái)電腦上運(yùn)行的網(wǎng)絡(luò)程序有很多寻拂,為了不與其他的網(wǎng)絡(luò)程序占用同一個(gè)端口號(hào)程奠,往往在編程中,udp的端口號(hào)一般不綁定

但如果需要做成一個(gè)服務(wù)器端的程序的話祭钉,是需要綁定的

一般服務(wù)性的程序瞄沙,往往需要一個(gè)固定的端口號(hào),這就是所謂的端口號(hào)綁定

<2>綁定示例

#coding=utf-8

from socket import *

# 1. 創(chuàng)建套接字

udp_socket = socket(AF_INET, SOCK_DGRAM)

# 2. 綁定本地的相關(guān)信息慌核,如果一個(gè)網(wǎng)絡(luò)程序不綁定距境,則系統(tǒng)會(huì)隨機(jī)分配

#? ip地址和端口號(hào),ip一般不用寫(xiě)垮卓,表示本機(jī)的任何一個(gè)ip

local_addr = ('', 7788)

udp_socket.bind(local_addr)

# 3. 等待接收對(duì)方發(fā)送的數(shù)據(jù)

recv_data = udp_socket.recvfrom(1024) #? 1024表示本次接收的最大字節(jié)數(shù)

# 4. 顯示接收到的數(shù)據(jù)

print(recv_data[0].decode('gbk'))

# 5. 關(guān)閉套接字

udp_socket.close()

總結(jié)

一個(gè)udp網(wǎng)絡(luò)程序垫桂,不綁定端口號(hào),此時(shí)操作系統(tǒng)會(huì)隨機(jī)分配一個(gè)端口號(hào)粟按,如果綁定端口號(hào)诬滩,每次啟動(dòng)程序端口號(hào)不變。

10.UDP發(fā)送廣播消息

參考代碼

import socket

if __name__ == '__main__':

? ? # 創(chuàng)建udpsocket

? ? udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

? ? # 設(shè)置socket的選項(xiàng)钾怔,允許發(fā)送廣播消息

? ? udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True)

? ? # 發(fā)送廣播消息

? ? udp_socket.sendto("大家好碱呼,我叫小郭同學(xué)蒙挑,多多關(guān)照!".encode("gbk"), ("255.255.255.255", 9090))

? ? # 關(guān)閉socket

? ? udp_socket.close()

總結(jié)

? 廣播地址最常用的是255.255.255.255 通用的廣播地址宗侦,不區(qū)分網(wǎng)段

? ? 192.168.14.255: 局域網(wǎng)內(nèi)的廣播地址

11.udp聊天器

目標(biāo)

? ? ? 能夠?qū)懗鰑dp聊天器功能程序

說(shuō)明

? 在一個(gè)電腦中編寫(xiě)1個(gè)程序,有2個(gè)功能

? 1.獲取鍵盤(pán)數(shù)據(jù)忆蚀,并將其發(fā)送給對(duì)方

? 2.接收數(shù)據(jù)并顯示

? 選擇以上的2個(gè)功能調(diào)用

參考代碼

import socket

def send_msg(udp_socket):

? ? """獲取鍵盤(pán)數(shù)據(jù)矾利,并將其發(fā)送給對(duì)方"""

? ? # 1. 從鍵盤(pán)輸入數(shù)據(jù)

? ? msg = input("\n請(qǐng)輸入要發(fā)送的數(shù)據(jù):")

? ? # 2. 輸入對(duì)方的ip地址

? ? dest_ip = input("\n請(qǐng)輸入對(duì)方的ip地址:")

? ? # 3. 輸入對(duì)方的port

? ? dest_port = int(input("\n請(qǐng)輸入對(duì)方的port:"))

? ? # 4. 發(fā)送數(shù)據(jù)

? ? udp_socket.sendto(msg.encode("utf-8"), (dest_ip, dest_port))

def recv_msg(udp_socket):

? ? """接收數(shù)據(jù)并顯示"""

? ? # 1. 接收數(shù)據(jù)

? ? recv_msg = udp_socket.recvfrom(1024)

? ? # 2. 解碼

? ? recv_ip = recv_msg[1]

? ? recv_msg = recv_msg[0].decode("utf-8")

? ? # 3. 顯示接收到的數(shù)據(jù)

? ? print(">>>%s:%s" % (str(recv_ip), recv_msg))

def main():

? ? # 1. 創(chuàng)建套接字

? ? udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

? ? # 2. 綁定本地信息

? ? udp_socket.bind(("", 7890))

? ? while True:

? ? ? ? # 3. 選擇功能

? ? ? ? print("="*30)

? ? ? ? print("1:發(fā)送消息")

? ? ? ? print("2:接收消息")

? ? ? ? print("="*30)

? ? ? ? op_num = input("請(qǐng)輸入要操作的功能序號(hào):")

? ? ? ? # 4. 根據(jù)選擇調(diào)用相應(yīng)的函數(shù)

? ? ? ? if op_num == "1":

? ? ? ? ? ? send_msg(udp_socket)

? ? ? ? elif op_num == "2":

? ? ? ? ? ? recv_msg(udp_socket)

? ? ? ? else:

? ? ? ? ? ? print("輸入有誤姑裂,請(qǐng)重新輸入...")

if __name__ == "__main__":

? ? main()

?


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市男旗,隨后出現(xiàn)的幾起案子舶斧,更是在濱河造成了極大的恐慌,老刑警劉巖察皇,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茴厉,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡什荣,警方通過(guò)查閱死者的電腦和手機(jī)矾缓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)稻爬,“玉大人嗜闻,你說(shuō)我怎么就攤上這事∥Τ” “怎么了琉雳?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)友瘤。 經(jīng)常有香客問(wèn)我翠肘,道長(zhǎng),這世上最難降的妖魔是什么辫秧? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任锯茄,我火速辦了婚禮,結(jié)果婚禮上茶没,老公的妹妹穿的比我還像新娘肌幽。我一直安慰自己,他們只是感情好抓半,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布喂急。 她就那樣靜靜地躺著,像睡著了一般笛求。 火紅的嫁衣襯著肌膚如雪廊移。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天探入,我揣著相機(jī)與錄音狡孔,去河邊找鬼。 笑死蜂嗽,一個(gè)胖子當(dāng)著我的面吹牛苗膝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播植旧,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼辱揭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼离唐!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起问窃,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤亥鬓,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后域庇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體嵌戈,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年听皿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了咕别。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡写穴,死狀恐怖惰拱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情啊送,我是刑警寧澤偿短,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站馋没,受9級(jí)特大地震影響昔逗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜篷朵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一勾怒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧声旺,春花似錦笔链、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至澈缺,卻和暖如春坪创,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背姐赡。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工莱预, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人项滑。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓依沮,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子悉抵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容