1.tcp基本語法
服務端
# 服務端 (七劍下天山)
"""注意 :
一發一收必須成對,否則會出現資料異常
"""import socket
# 1.建立乙個tcp(socket)物件
sk = socket.socket()
# 2.繫結對應的ip和埠號(註冊網路,讓其他電腦可以訪問到該主機)
sk.bind(("127.0.0.1",8000)) #注意:引數為乙個元組
# 3.開啟監聽(監聽是否有裝置訪問)
sk.listen()
# 4.建立連線 (三次握手)
"""addr : ('127.0.0.1', 45466)
"""conn,addr = sk.accept()
# 5.處理收發資料的邏輯
msg = conn.recv(1024) #最多一次接受1024個位元組
print(msg.decode("utf-8")) #需要解碼成字串
# 6.斷開連線 (四次揮手)
conn.close()
# 7.退還埠
sk.close()
客戶端# 客戶端
import socket
# 1.建立乙個tcp(socket)物件
sk = socket.socket()
# 2.與服務端建立連線 (需要知道目標主機的ip和埠號)
sk.connect(("127.0.0.1",8000)) #注意: 乙個引數元組
# 3.傳送資料 (必須是二進位制位元組流)
strvar = "好人一生平安~"
sk.send(strvar.encode("utf-8"))
# 4.關閉連線
sk.close()
2.tcp迴圈發訊息
服務端
# 迴圈發訊息[服務端]
import socket
sk = socket.socket() #建立tcp物件
sk.bind(("127.0.0.1",8001)) #繫結ip埠註冊網路
sk.listen() #開啟監聽
while true: #服務端永不停機,一直監聽
conn,addr = sk.accept() #建立連線(三次招手)
# 迴圈發訊息
while true:
msg = conn.recv(1024) #收訊息
print(msg.decode("utf-8"))
# 接收q停止迴圈
if msg == b"q" or msg == b"q":
break
strvar = input("請輸入內容:")
conn.send(strvar.encode("utf-8")) #發訊息
conn.close() #關閉連線 (四次揮手)
sk.close() #退還埠
客戶端# 迴圈發訊息[客戶端]
import socket
sk = socket.socket() #建立tcp物件
sk.connect(("127.0.0.1",8001)) #與服務端建立連線
# 迴圈發訊息
while true:
# 傳送資料
strvar = input("請輸入您要傳送的資料(按q結束):")
sk.send(strvar.encode()) #
# 停止迴圈條件
if strvar.upper() == "q":
break
# 接收資料
msg = sk.recv(1024)
print(msg.decode())
sk.close() #關閉連線
3.udp 基本語法
服務端
# 服務端
import socket
# 1.建立乙個udp物件
sk = socket.socket(type = socket.sock_dgram)
# 2.繫結ip和埠號
sk.bind(("127.0.0.1",8002)) #引數乙個元組
# 3.針對udp伺服器,第一次只能接受資料
while true:
while true:
msg,addr = sk.recvfrom(1024) #接收訪問裝置的資訊和位址
if msg ==b"q" or msg ==b"q":
break
print(msg.decode("utf-8"))
strvar = input("請輸入傳送的內容:")
sk.sendto(strvar.encode("utf-8"),addr) #傳送內容
# 4.關閉連線
sk.close()
客戶端# 客戶端
import socket
# 1.建立udp物件
sk = socket.socket(type = socket.sock_dgram)
# 2.收發資訊的邏輯
while true:
strvar = input("請輸入您要傳送的內容(按q退出):")
sk.sendto(strvar.encode("utf-8"),("127.0.0.1",8002)) #傳送資料
if strvar.upper() =="q":
break
msg,addr = sk.recvfrom(1024) #接收資料資訊和位址
print(msg.decode("utf-8"))
# 3.關閉連線
sk.close()
4.tcp黏包原因:
[傳送端]出現黏包: 1.資料太小, 2.資料之間時間間隔太短了;
[接收端]出現黏包: 接受資料太慢了
struct 模組"""
pack 打包
把任意長度數字轉換成具有固定4個位元組長度的位元組流
unpack 解包
把4個位元組長度的值恢復成原來的數字,返回的是數字元組
"""# i => int 要轉換的當前型別是整型 數字範圍-21億~21億
# pack 打包
res = struct.pack("i",191992131) #打包
print(res,len(res)) # b'c\x91q\x0b' 4
#unpack 解包成數字元組
tup = struct.unpack("i",res) #解包成數字元組
print(tup,type(tup)) #(191992131,) res = tup[0] #取出元組數字
print(res,type(res)) # 191992131
解決黏包辦法(struct模組)
服務端 :
# 服務端
import socket,struct
sk = socket.socket() #建立物件
sk.bind(("127.0.0.1",8000)) #繫結ip埠 註冊網路
sk.listen() #開啟監聽
conn,addr = sk.accept() #建立連線
# 傳送訊息
strvar = input("請輸入你想要傳送的資料:")
msg = strvar.encode() #轉化位元組流
num = len(msg) #位元組流大小
res = struct.pack("i",num) #打包4個位元組的位元組流
conn.send(res) #先傳送資料大小
conn.send(msg) #再傳送真實資料
conn.send("賈英賀".encode("utf-8"))
conn.close() #關閉連線
sk.close() #退還埠
客戶端 :
# 客戶端
import socket,struct
sk = socket.socket() #建立物件
sk.connect(("127.0.0.1",8000)) #連線服務端
# 接收訊息
msg = sk.recv(4) #第一次接收資料大小
tup = struct.unpack("i",msg) #解包成數字元組
num = tup[0] #提取數字
msg1 = sk.recv(num) #第二次接收真實資料,按第一次提取數字大小擷取
print(msg1.decode("utf-8"))
msg2 = sk.recv(1024)
print(msg2.decode("utf-8"))
sk.close()
Linux網路程式設計 (2)網路程式設計基礎
一 ip位址 1 ip的概念 internet protocol 網路之間互連的協議 也就是為計算機網路相互連線進行通訊而設計的協議。在 網際網路中,它是能使連線到網上的所有計算機網路實現相互通訊的一套規則,規定了 計算機在網際網路上進行通訊時應當遵守的規則。任何廠家生產的計算機系統,只要遵守ip協...
python 2 網路程式設計
訪問某網域名稱的過程 以www.baidu.com 為例 1.先要知道預設閘道器的mac 1.1 使用arp獲取預設閘道器的mac位址 1.2.組織資料傳送給預設閘道器 ip為dns伺服器的ip,但是mac位址是預設閘道器的mac位址 1.3.預設閘道器擁有 資料的能力,把資料 給路由器 1.4.路...
網路程式設計 2 網路程式設計三要素
指網際網路協議位址 internet protocol address 俗稱ip。ip位址用來給乙個網路中的計算機裝置做唯一的編號。假如我們把 個人電腦 比作 一台 的話,那麼 ip位址 就相當於 號碼 inetaddress ip位址分類 ipconfig ping 空格 ip位址 ping 22...