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()
?