Python socket套接字程式設計

2022-09-13 02:45:10 字數 4898 閱讀 2982

要求:我們自己想寫一款可以資料互動的程式

只要涉及到遠端資料互動必須要操作osi七層,所以有現成的模組直接實現

socket模組

架構啟動要先啟動服務端再啟動客戶端

import

socket

"""匯入模組的兩種方式

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) #

接收客戶端傳送的訊息 聽別人說話

print

(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)

print

(data)

client.close()

1.客戶端校驗資訊不能為空

2.服務端新增相容性**(mac linux)

3.服務端重啟頻繁報埠占用錯誤

from socket import

sol_socket, so_reuseaddr

server.setsockopt(sol_socket, so_reuseaddr, 1) #

在bind前加

4.客戶端異常關閉,服務端報錯的問題

異常捕獲

5.服務端鏈結迴圈

6.半連線池

設定可以等待的客戶端數量

資料管道的資料沒有被完全取出

tcp協議有乙個特性

當資料量比較小且時間間隔比較短的多次資料

tcp會自動打包成乙個資料報傳送

報頭能夠標識即將到來的資料具體資訊

eg:資料量大

報頭的長度必須是固定的

import

struct

import

json

d =d =json.dumps(d)

res = struct.pack('i'

,len(d))

print

(len(res))

res1 = struct.unpack('i'

,res)[0]

print(res1)

import

socket

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'))

import

json

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):

print

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