要求:我們自己想寫一款可以資料互動的程式
只要涉及到遠端資料互動必須要操作osi七層,所以有現成的模組直接實現
socket模組
架構啟動要先啟動服務端再啟動客戶端
importsocket
"""匯入模組的兩種方式
import句式
from...import...句式
pip3 install 模組名==版本號 -i 倉庫位址
"""server = socket.socket() #
預設就是基於網路的tcp傳輸協議 買手機
server.bind(('
127.0.0.1
', 8080)) #
繫結ip和port 插**卡
server.listen(5) #
半連線池 開機(過渡)
sock, address = server.accept() #
監聽 三次握手的listen態
print(address) #
客戶端位址
data = sock.recv(1024) #
接收客戶端傳送的訊息 聽別人說話
(data)
sock.send(b
'hello my big baby~~~
') #
給別人回話
sock.close() #
掛**server.close() #
關機import
socket
client = socket.socket() #
買手機client.connect(('
127.0.0.1
', 8080)) #撥號#
說話client.send(b'
hello big dsb dsb dsb!')
#聽他說
data = client.recv(1024)
(data)
client.close()
1.客戶端校驗資訊不能為空
2.服務端新增相容性**(mac linux)
3.服務端重啟頻繁報埠占用錯誤
from socket importsol_socket, so_reuseaddr
server.setsockopt(sol_socket, so_reuseaddr, 1) #
在bind前加
4.客戶端異常關閉,服務端報錯的問題
異常捕獲
5.服務端鏈結迴圈
6.半連線池
設定可以等待的客戶端數量
資料管道的資料沒有被完全取出
tcp協議有乙個特性
當資料量比較小且時間間隔比較短的多次資料
tcp會自動打包成乙個資料報傳送
報頭能夠標識即將到來的資料具體資訊
eg:資料量大
報頭的長度必須是固定的
importstruct
import
json
d =d =json.dumps(d)
res = struct.pack('i'
,len(d))
(len(res))
res1 = struct.unpack('i'
,res)[0]
print(res1)
importsocket
import
subprocess
import
json
import
struct
server =socket.socket()
server.bind((
'127.0.0.1
', 8080))
server.listen(5)
while
true:
sock, address =server.accept()
while
true:
data = sock.recv(1024) #
接收cmd命令
command_cmd = data.decode('
utf8')
sub = subprocess.popen(command_cmd, shell=true, stdout=subprocess.pipe, stderr=subprocess.pipe)
res = sub.stdout.read() + sub.stderr.read() #
結果可能很大
#1.製作報頭
data_first = struct.pack('i'
, len(res))
#2.傳送報頭
sock.send(data_first)
#3.傳送真實資料
sock.send(res)
import
socket
import
struct
client = socket.socket() #
買手機client.connect(('
127.0.0.1
', 8080)) #
撥號while
true:
msg = input('
請輸入cmd命令》:
').strip()
if len(msg) ==0:
continue
client.send(msg.encode(
'utf8'))
#1.先接收固定長度為4的報頭資料
recv_first = client.recv(4)
#2.解析報頭
real_length = struct.unpack('i'
,recv_first)[0]
#3.接收真實資料
real_data =client.recv(real_length)
print(real_data.decode('
gbk'))
importjson
import
socket
import
struct
import
osclient = socket.socket() #
買手機client.connect(('
127.0.0.1
', 8080)) #
撥號while
true:
data_path = r''#
print(os.listdir(data_path)) # [檔名稱1 檔名稱2 ]
movie_name_list =os.listdir(data_path)
for i, j in enumerate(movie_name_list, 1):
(i, j)
choice = input('
請選擇您想要上傳的電影編號》:
').strip()
ifchoice.isdigit():
choice =int(choice)
if choice in range(1, len(movie_name_list) + 1):
#獲取檔名稱
movie_name = movie_name_list[choice - 1]
#拼接檔案絕對路徑
movie_path =os.path.join(data_path, movie_name)
#1.定義乙個字典資料
data_dict =
data_json =json.dumps(data_dict)
#2.製作字典報頭
data_first = struct.pack('i'
, len(data_json))
#3.傳送字典報頭
client.send(data_first)
#4.傳送字典
client.send(data_json.encode('
utf8'))
#5.傳送真實資料
with open(movie_path,'rb'
) as f:
for line in
f: client.send(line)
#1.先接收固定長度為4的字典報頭資料
recv_first = sock.recv(4)
#2.解析字典報頭
dict_length = struct.unpack('i'
, recv_first)[0]
#3.接收字典資料
real_data =sock.recv(dict_length)
#4.解析字典(json格式的bytes資料 loads方法會自動先解碼 後反序列化)
real_dict =json.loads(real_data)
#5.獲取字典中的各項資料
data_length = real_dict.get('
size')
file_name = real_dict.get("
file_name")
recv_size =0
with open(file_name,'wb
') as f:
while recv_size data = sock.recv(1024)
recv_size +=len(data)
f.write(data)
在閱讀原始碼的時候1.變數名後面跟冒號 表示的意思是該變數名需要指代的資料型別
2.函式後更橫桿加大於號表示的意思是該函式的返回值型別
python socket套接字程式設計
服務端 import socket phone socket.socket socket.af inet,socket.sock stream phone.bind 127.0.0.1 8000 phone.listen 5 conn,addr phone.accept msg conn.recv ...
Python socket套接字通訊
socket是乙個模組,又稱套接字,用來封裝 網際網路協議 應用層以下的層 socket可以實現網際網路協議 應用層以下的層 的工作,提高開發效率。import socket 寫socket套接字 使用如下 client.py 啟動服務端後再啟動客戶端 import socket 1.買手機 cli...
python socket(套接字)小談
1 udp的看法 import socket udp servers content socket.socket socket.af inet,socket.sock dgram udp servers content.sendto hello,boy 127.0.0.1 8087 udp cont...