網絡編程
- 網絡:
- 網絡協議:一套規則
- 網絡模型:
- 七層模型
- 物理層:網線,水晶頭等
- 數據鏈路層:
- 網絡層
- 傳輸層
- 會話層
- 表示層
- 應用層
- 四層模型- 時間應用
- 鏈路層
- 網絡
- 傳輸層
- 應用層
- 七層模型
- 每一層都有相應的協議負責交換信息或者協同工作
- TCP/IP協議族
- IP地址:負責在網路上唯一定位一個機器
- IP地址分ABCDE類
- 是由四個數字段組成,每個數字段的取值是0~255
- 192.168.xxx.xxx:局域網IP
- 127.0.0.1:本機
- IPv4,IPv6
- 端口
- 範圍:0-65535
- 知名端口: 0-1023
- 非知名端口:1024-65535
TCP/UDP協議
- UDP協議:非安全的面向鏈接的傳輸
- 安全性差
- 大小限制64kb
- 沒有順序
- 速度快
- TCP
- 基於鏈接的通信
-
SOCKET編程
- socket(套接字):是一個網絡通信的端點,能實現不同主機的進程通信。
- 通過IP+端口定位對方發送消息的通信機制
- 分爲UDP和TCP
- 客戶端Client:發起訪問的一方
- 服務器端Server:接受訪問的一方
-
UDP編程
- Server端流程
- 建立socket,socket是負責具體通信的一個實例
- 綁定,爲創建的socket指派固定的端口和ip地址
- 接受對方發送的內容
- 給對方發送反饋,此步驟爲非必須步驟
- Client端流程
- 建立通信的socket
- 發送內容到指定服務器
- 接受服務器給定的反饋內容
- (服務器程序要求永久運行,一般用死循環處理)
- Server端流程
# -*- coding:utf-8 -*-
"""
Server段流程
1、建立socket
2、
3、
4、
"""
import socket
def serverFunc():
# 1、建立socket
# socket.AF_INET :使用IPv4協議族
# socket.SOCK_DGRAM: 使用UDP通信
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2、綁定IP的端口
# 地址是一個tuple類
address = ("127.0.0.1", 8989)
sock.bind(address)
# 3\接收對方消息
# 等待方式爲死等
# recvfrom接收的返回值是一個tuple,前一項表示數據,後一項表示地址
# 參數的含義是緩衝區大小
data, address = sock.recvfrom(500)
print(data)
print(type(data))
# 4\發送過來的數據是bytes格式,必須通過解碼才能得到str格式
# decode默認解碼格式utf-8
text = data.decode()
print(text)
print(type(text))
# 返回消息
req = "I am not wtt"
# 發送消息 默認編碼utf-8
data = req.encode()
sock.sendto(data, address)
if __name__ == '__main__':
print("Starting Server ....")
serverFunc()
print("Start SUEESS!")
Starting Server ....
# -*- coding:utf-8 -*-
import socket
def clientFunc():
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
text = "I LOve wtt"
data = text.encode()
sock.sendto(data, ('127.0.0.1', 8989))
data, address = sock.recvfrom(200)
data = data.decode()
print(data)
if __name__ == '__main__':
clientFunc()
TCP編程
- 面向鏈接的傳輸,即每次傳輸之前需要建立一個鏈接
- 客戶端和服務端兩個程序需要編寫
-
Server端編寫流程
- 1、建立socket負責具體通信,這個socket其實只負責接受對方的請求
- 2、綁定IP和端口
- 3、監聽接入的訪問socket
- 4、接收訪問的socket,可以理解接收訪問即建立一個通訊的鏈接通路
- 5、 接收對方的發送內容,利用接收到的socket接收內容
- 6、如果有必要,給對方發送返回信息
- 7、關閉鏈接通路
-
Client端編程
- 1、建立通信socket
- 2、鏈接對方,請求跟對方建立通路
- 3、發送內容到對方服務器
- 4、接收對方的反饋
- 5、關閉鏈接通路
# -*- coding:utf-8 -*-
"""
Server段流程
"""
import socket
def serverFunc():
# 1、建立socket
# socket.AF_INET :使用IPv4協議族
# socket.SOCK_DGRAM: 使用UDP通信
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2、綁定IP的端口
# 地址是一個tuple類
address = ("127.0.0.1", 8989)
sock.bind(address)
# 3、監聽接入的訪問socket
sock.listen()
while True:
# 4、接收訪問的socket
# accept 返回的元祖第一個元素賦值給skt,第二個賦值給address
skt, address = sock.accept()
# 5、接收對方發送的消息,利用socket接收內容
# 500代表接收使用的buffersize
msg = skt.recv(500)
# 接收到的是bytes格式內容
# 想得到str格式的,需要進行解碼
msg = msg.decode()
rst = "Received msg:{0} from {1}".format(msg, address)
print(rst)
# 6、如果有必要,給對方發送返回消息
skt.send(rst.encode())
# 7、關閉鏈接
skt.close()
if __name__ == '__main__':
print("Starting Server ....")
serverFunc()
print("Start SUEESS!")
# -*- coding:utf-8 -*-
import socket
def tcp_clt():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address = ('127.0.0.1', 8989)
sock.connect(address)
msg = "djksajdaskd你撒的d"
sock.send(msg.encode())
ret = sock.recv(500)
print(ret.decode())
sock.close()
if __name__ == '__main__':
tcp_clt()
FTP編程
- FTP(File Transfer Protocal)文件傳輸協議
- 用途:定製一些特殊的上傳下載文件的服務
- 用戶分類:登錄FTP服務器必須有一個賬號
- Real賬戶:註冊賬戶
- Guest賬戶:可能臨時對某一類人的行爲進行授權
- Anonymous賬戶:匿名賬戶,允許任何人
- FTP工作流程
- 客戶端連接遠程主機上的FTP服務器
- 客戶端輸入用戶名和密碼(或者“Anonymous”和電子郵件地址)
- 客戶端和服務器進行各種文件傳輸和信息查詢操作
- 客戶端從遠程FTP服務器退出,結束傳輸
- FTP文件表示
- 分三段表示FTP服務器上的文件
- HOST:主機地址,類似於ftp.mozilla.org,以ftp開頭
- OIR:目錄,表示文件所在本地的路徑
- File:文件名稱
- 如果想完整精確的表示ftp上某一個文件,需要上述三部分組合在一起
#導入相應的包,主要是ftplib
import ftplib#關於ftp的操作都在這個包裏面
import oss
import socket
#三部分精確表示在ftp服務器上的某一個文件
#好多公開ftp服務器訪問會出錯或者沒反應
HOST = "ftp.acc.umu.se"
DIR = 'Public/EFLIB'
FILE = 'README'
#1.客戶端連接遠程主機上的FTP服務器
try:
f = ftplib.FTP()
#通過設置調試級別可以方便調試
f.set_debuglevel(2)
#連接主機地址
f.connect(HOST)
except Exception as e:
print(e)
exit()
print("Connected to host {0}".format(HOST))
#2.客戶端輸入用戶和密碼(或者“anonymous”和電子郵件地址)
try:
#更改當前目錄到指定目錄
f.cwd(DIR)
except Exception as e:
print(e)
exit()
print("Connected dir to {0}".format(DIR))
try:
#從ftp服務器上下載文件
#第一個參數是ftp命令
#第二個參數是回調函數
#此函數的意思是,執行RETR命令,下載文件到本地後,運行回調函數
f.retrbinary('RETR {0}'.format(FILE), open(FILE, 'wb').write)
except Exception as e:
print(e)
exit()
#4.客戶端從遠程ftp服務器退出,結束傳輸
f.quit()