網絡通信:使用自己的電腦和別人的電腦進行練習並發送消息或者文件等操作。socket就是網絡通信的工具。
1、
C/S架構:客戶端(client)/服務端(server)架構
客戶端:指與服務器相應,為客戶提供本地服務的程序。
服務端:廣義:指網絡中能對其他機器提供某些服務的計算機系統。
B/S架構:瀏覽器(browser)/服務端(server)
軟件C\S架構:瀏覽器,QQ、,微信,
硬件C\S架構:打印機
2、
網絡通信的整個流程
①流程圖

流程描述:
第一步:打開瀏覽器,想要請求訪問京東,在地址欄輸入網址:www.jd.com.(www.jd.com是域名,就是一個IP 地址的名稱,IP地址不好記,所以就有了域名
第二步:先將請求信息發給交換機,然后交給了路由器,路由發給DNS服務器,通過DNS協議去找我們要訪問的京東的IP地址:
第三步:查到的京東服務器對應的IP地址之后,路由器通過路由協議找到路由轉發的最優路徑,將你的請求信息還送給這個IP地址的京東的路由器
第四步:京東的路由器發給了京東網站的服務器上
第五步:當你打開瀏覽器的時候,你的電腦給你的瀏覽器這個運行起來的程序給了一個編號,叫做端口號,當你的電腦收到京東發過來的消息的時候,你的電鳥通過端口號找到你的瀏覽器,你的瀏覽器拿到了京東的網站信息,然后頁面會顯示京東的網站信息
② 內部組件的信息
集線器(HUB):將所有的電腦聯通起來,屬於數據通信系統中的基礎設備
交換機:交換式的集線器,多台機器之間的網絡通信。工作方式分為單播,組播,廣播
單播:客戶端與服務器之間的點到點連接,將信息發送給對應的一個機器。
廣播:將要找的機器的信息發給局域網內的所有的機器
網卡:接受處理電信號,電腦插網線的地方叫做網卡,網卡提供了網絡的接口
MAC地址(物理地址):1C-1B-0D-74-43-9A ,長度為48為2進制,通常由12為16進制數表示( 前三位廠商編號,后三位生產流水號),全球唯一的,也就是網絡設備的身份證號,但是不能用MAC地址來找尋機器。
IP地址:由4個點分十進制組成,由點分割的四個十進制的數,在計算機中則由二進制組成,如下
ipv4 它可以設置成靜態的,也可以自動獲取
server01.py
client01.py
talk_server.py
talk_client.py
二進制:00000000.00000000.00000000.00000000 - 11111111.11111111.11111111.11111111, 十進制:0.0.0.0 - 255.255.255.255
ipv6
0.0.0.0.0.0 - 255.255.255.255.255.255
127.0.0.1 是回送地址,指本地機,一般用來測試使用,主要用於網絡軟件測試一級本地機進程間通信。無論什么程序,一旦使用會送地址發送數據,協議軟件立即返回,不進行任何網絡傳輸(來自百度百科)
IP地址段:192.168.12.0 - 192.168.12.255 同一IP地址段,稱為同一子網,以廣播的形式通信。
子網掩碼: 表示子網絡特征的一個參數,255.255.255.0。判斷任意兩個IP地址是否處在同一子網絡。方法時將兩個IP地址域子網掩碼分別進行and運算(兩個數位都為1,運算結果為1,否則為0)。然后比較結果是否相同,如果是的話就標名他們在同一個自網絡,否則就不是。
比如:已知IP地址172.16.10.1和172.16.10.2的子網掩碼都是255.255.255.0,請問它們是否在同一個子網絡?兩者與子網掩碼分別進行AND運算,
172.16.10.1:10101100.00010000.00001010.000000001 255255.255.255.0:11111111.11111111.11111111.00000000 AND運算得網絡地址結果:10101100.00010000.00001010.000000001->172.16.10.0 172.16.10.2:10101100.00010000.00001010.000000010 255.255.255.0:11111111.11111111.11111111.00000000 AND運算得網絡地址結果:10101100.00010000.00001010.000000001->172.16.10.0 結果都是172.16.10.0,因此它們在同一個子網絡。
IP地址域子網掩碼按位 與 得到網段地址
255.255.255.0
192.168.13.253
11111111.11111111.11111111.00000000 11000000.10101000.00001101.11111101 11000000.10101000.00001101.00000000 # 局域網網段 192.168.13.0 # 這樣求出了一個網段地址
DHCP協議:自動獲取IP地址 Arp協議:廣播的方式發送數據包,通過IP地址獲取目標主機mac地址,IP地址不固定,mac是全球唯一的DNS:域名解析 域名:www.jd.com DNS服務端:{'www.jd.com':173.1.49.0} NAT轉換:網絡地址轉換 路由器:轉發消息,管理內網 路由協議:計算轉發消息的最優路徑 端口:標識某個應用程序 端口映射:0-65535 找到提供服務的程序 IP地址+端口:能夠唯一鎖定一台電腦和這個電腦上的某個應用程序 網關:把關用的,所有對外的請求,都要經過網關 NAT技術:網絡地址轉換,內網IP地址轉換位公網或者說外網的IP地址
廣播風暴:廣播數據充斥網絡無法處理,並占用大量網絡帶寬,導致正常業務不能運行。(以前通過mac地址就可以通信,mac地址通信時廣播的形式,當所有的電腦都通過這種形式通信,就會西港城廣播風暴,會阻塞網絡,信息也變得很不安全,因為所有人都可以收到你打的信息。
為了避免廣播風暴:分了多個局域網,然后通過路由器連起來
內網和外網
內網:內網就是局域網,局域網就是固定在一個地理區域內由兩台以上的電腦用網線和其他網絡設備搭建而成的一個封閉的計算機組。可以是鄰居之間的2台電腦,也可以是一張大樓內的所有電腦。局域網可以是獨立封閉運行的,也可以是和外網相連接的。
外網:廣域網是一種低於跨度非常大的網絡集合,它是由無數各局域網+獨立服務器構成的。注:此處所說的局域網既可以是小型的廣域網,也可以是局域網。
實際上,從規模上來看我們很難區分局域網和廣域網,因為大小都是相對的,所以真正的局域網和廣域網的區分是通過IP地址來實現的。
任何一台電腦要上網,都必須在網絡上郵一個唯一的IP地址。在局域網內,這個IP地址是唯一的,但是在另一個局域網內,這個IP地址仍然能夠用。
在廣域網中,所有的IP地址都是唯一的。
只有內網的IP地址你是不能夠上網的,上網必需要一個外網地址,這個外網地址又稱為公網地址,這個公網地址是全球唯一的,它在你的對外出口的路由器上,也就是你的外網網關地址。
3、初識socket
socket:用於網絡通信的模塊,獨立於語言
通過下面簡單的代碼看一下,socket
服務端:

import socket # 創建一個socket對象 server = socket.socket() # 給程序設置一個IP地址和端口號 ip_port = ('127.0.0.1',8080) # 綁定IP地址和端口號 server.bind(ip_port) # 監聽IP地址和端口 server.listen() # 等待建立連接,conn時連接通道,addr是客戶端地址 conn,addr = server.accept() # 服務端通過conn連接通道來收發消息,通過recv方法,recv里面的參數是字節 1024B=1KB from_client_msg = conn.recv(1024) print('zhoyou say:',from_client_msg.decode('utf-8')) # 回復消息:通過send方法,參數必須是字節類型的 conn.send('what?'.encode('utf-8')) # 關閉通道 conn.close() # 關閉socket對象, server.close()
客戶端:

import socket # 創建一個socket對象 client = socket.socket() # 找到服務器的IP地址和端口 server_ip_port = ('127.0.0.1',8080) # 連接服務端的應用程序,通過connect方法,參數是服務端的IP地址和端口, client.connect(server_ip_port) # 發消息,用send方法,但是調用者是client的socket的對象 client.send('明天是周末嗎?'.encode('utf-8')) from_server_msg = client.recv(1024) print('孫翔說:',from_server_msg.decode('utf-8')) client.close()
兩個例子:
1、連續對話:server收一個發一個,client發一個收一個
服務端:

import socket server = socket.socket() ip_port = ('127.0.0.1',8080) server.bind(ip_port) server.listen() conn,addr = server.accept() while 1: from_client_msg = conn.recv(1024) print('來着星空的消息:',from_client_msg.decode('utf-8')) to_client_msg = input('大海:') conn.send(to_client_msg.encode('utf-8'))
客戶端:

import socket client = socket.socket() client.connect(('127.0.0.1',8080)) while 1: to_server_msg = input('星空說:') client.send(to_server_msg.encode('utf-8')) from_server_msg = client.recv(1024) print('來自大海的消息:',from_server_msg.decode('utf-8'))
2、時間:server端:接收時間戳,轉化成而格式化時間,client:每隔10秒鍾把時間戳發給server端,time.time()
服務端:

import time import socket server = socket.socket() ip_port = ('127.0.0.1',8090) server.bind(ip_port) server.listen() conn,addr = server.accept() while 1: from_client_time = conn.recv(1024) from_clienttime_str = from_client_time.decode('utf-8') time_float = float(from_clienttime_str) time_stru = time.localtime(time_float) time_strf = time.strftime('%Y_%m-%d %H:%M:%S',time_stru) print(time_strf)
客戶端:

import time import socket client = socket.socket() client.connect(('127.0.0.1',8090)) while 1: client.send(str(time.time()).encode('utf-8')) time.sleep(1)