2 網路程式設計基本語法

2022-07-08 07:24:09 字數 4441 閱讀 6755

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...