網(wǎng)絡(luò)通信的三要素
IP
通信的時(shí)候, 雙方必須知道對(duì)方的標(biāo)識(shí), 好比發(fā)郵件必須知道對(duì)方的郵件地址。 互聯(lián)網(wǎng)上每個(gè)計(jì)算機(jī)的唯一標(biāo)識(shí)就是IP地址, 類似 123.123.123.123 。
IP地址實(shí)際上是一個(gè)32位整數(shù)(稱為IPv4) , 以字符串表示的IP地址,如 192.168.0.1 實(shí)際上是把32位整數(shù)按8位分組后的數(shù)字表示, 目的是便于閱讀。端口port
在兩臺(tái)計(jì)算機(jī)通信時(shí), 只發(fā)IP地址是不夠的, 因?yàn)橥慌_(tái)計(jì)算機(jī)上跑著多個(gè)網(wǎng)絡(luò)程序。 一個(gè)IP包來(lái)了之后, 到底是交給瀏覽器還是QQ, 就需要端口號(hào)來(lái)區(qū)分。
每個(gè)網(wǎng)絡(luò)程序都向操作系統(tǒng)申請(qǐng)唯一的端口號(hào), 這樣, 兩個(gè)進(jìn)程在兩臺(tái)計(jì)算機(jī)之間建立網(wǎng)絡(luò)連接就需要各自的IP地址和各自的端口號(hào)。
TCP/UDP協(xié)議
為了把全世界的所有不同類型的計(jì)算機(jī)都連接起來(lái), 就必須規(guī)定一套全球通用的協(xié)議,大家把互聯(lián)網(wǎng)的協(xié)議簡(jiǎn)稱TCP/IP協(xié)議
socket編程
Socket是網(wǎng)絡(luò)編程的一個(gè)抽象概念。 通常我們用一個(gè)Socket表示“打開(kāi)了一個(gè)網(wǎng)絡(luò)鏈接”, 而打開(kāi)一個(gè)Socket需要知道目標(biāo)計(jì)算機(jī)的IP地址和端口號(hào), 再指定協(xié)議類型即可。
import socket # socket.gethostname()當(dāng)不傳入?yún)?shù)時(shí),返回本機(jī)主機(jī)名 print(socket.gethostname()) #DESKTOP-EN0LQJH #域名(英語(yǔ):Domain Name),簡(jiǎn)稱域名、網(wǎng)域,是由一串用點(diǎn)分隔的名字組成的Internet上某一臺(tái)計(jì)算機(jī)或計(jì)算機(jī)組的名稱 #通過(guò)域名查找服務(wù)器IP地址 print(socket.gethostbyname('www.baidu.com')) #119.75.216.20 #通過(guò)一個(gè)IPv4的地址來(lái)獲取主機(jī)信息 print(socket.gethostbyaddr('114.114.114.114')) #通過(guò)IP/port組合,訪問(wèn)服務(wù)器信息 # 如果是AF_INET則格式為:(address, port),如果為AF_INET6,則返回(address, port, flow info, scope id) print(socket.getaddrinfo('www.xunlei.com',80))
用socket實(shí)現(xiàn)簡(jiǎn)易的web服務(wù)器
import socket def reply_info(socketObj): # socketObj.send('ok') with open('hello.html') as f: socketObj.send(f.read().encode('utf-8')) if __name__=="__main__": #1. 創(chuàng)建socket對(duì)象 socket_server = socket.socket() #2. 綁定IP和端口 socket_server.bind(('192.168.1.165',9999)) print("服務(wù)器端已經(jīng)啟動(dòng)9999端口......") #3. 監(jiān)聽(tīng)是否有客戶端連接 socket_server.listen(5) while True: # 4. 接受客戶端的連接 socket_client,address = socket_server.accept() # 5. 接收客戶端發(fā)來(lái)的信息 data = socket_client.recv(1024) # 6. 與客戶端進(jìn)行交互, 返回給客戶端信息 reply_info(socket_server) socket_server.close()
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com