socket加入迴圈和粘包問題

2022-08-13 16:15:23 字數 3991 閱讀 7331

客戶端

import socket

soc = socket.socket()

soc.connect(('127.0.0.1', 8080))

while true:

inp = input('請輸入要傳送的資訊》')

soc.send(inp.encode('utf-8'))

服務端

import socket

soc = socket.socket(socket.af_inet,socket.sock_stream)

soc.bind(('127.0.0.1', 8080))

soc.listen(5)

conn, addr = soc.accept()

while true:

try:

data = conn.recv(1024)

print(data)

except exception:

conn.close()

break

soc.close()

客戶端

import socket

soc = socket.socket()

soc.connect(('127.0.0.1', 8080))

while true:

inp = input('請輸入要傳送的訊息》')

soc.send(inp.encode('utf-8'))

服務端

import socket

soc = socket.socket(socket.af_inet,socket.sock_stream)

soc.bind(('127.0.0.1', 8080))

soc.listen(5)

while true:

print('等待客戶端連線...')

conn, addr = soc.accept()

print(f'客戶端已連線上了')

while true:

try:

data = conn.recv(1024)

print(data)

except exception:

break

conn.close()

soc.close()

ssh是遠端執行命令

subprocess是執行系統命令的模組

import subprocess

# 執行系統dir命令,把執行的正確結果放到管道中

obj = subprocess.popen('dir',shell=true,stdout=subprocess.pipe)

# 拿到正確結果的管道,讀出裡面的內容

content = obj.stdout.read()

# 因為windows是用gbk編碼的,所以要用gbk解碼

print(str(content,encoding='gbk'))

客戶端

import socket

soc = socket.socket()

soc.connect(('127.0.0.1', 8080))

while true:

inp = input('請輸入要傳送的訊息》')

soc.send(b'a')

soc.send(b'b')

soc.send(b'c')

服務端

import socket

soc = socket.socket(socket.af_inet,socket.sock_stream)

soc.bind(('127.0.0.1', 8080))

soc.listen(5)

while true:

print('等待客戶端連線...')

conn, addr = soc.accept()

print(f'客戶端已連線上了')

while true:

try:

data1 = conn.recv(1024)

print(data1)

data2 = conn.recv(1024)

print(data2)

data3 = conn,recv(1024)

print(data3)

except exception:

break

conn.close()

soc.close()

客戶端傳送a、b、c的訊息時,服務端有時候會接收到好幾個值,而不是單個的a、b、c,這個就是粘包問題。

注意:只有tcp有粘包現象,udp永遠不會粘包

因為tcp協議是基於資料流的,所以收發的訊息是不能為空的;但是udp協議是基於資料報的,即使傳送了空內容,udp協議也會封裝上訊息頭,因此也不會是空內容。

給我們要傳送的訊息加上自定義長度報頭,報頭中包含我們要傳送訊息的長度,接收訊息的時候,先從讀取固定長度的報頭,然後再讀取真實的長度。

客戶端

import json

import socket

import struct

client = socket.socket()

client.connect(('127.0.0.1', 8080))

while true:

content = input('開始接收資訊》')

head_len = struct.unpack('i', client.recv(4))[0]

dic = json.loads(client.recv(head_len))

size_len = dic['size']

name = dic['name']

count = 0

data = b''

with open(name, 'wb') as fw:

while count < size_len:

if size_len < 1024:

data_temp = client.recv(size_len)

else:

if size_len - count >= 1024:

data_temp = client.recv(1024)

else:

data_temp = client.recv(size_len - count)

data = data_temp

count += len(data_temp)

f.write(data)

print('接收完成')

client.close()

服務端

import os

import json

import socket

import struct

server = socket.socket(socket.af_inet,socket.sock_stream)

server.bind(('127.0.0.1', 8080))

server.listen(5)

while true:

conn, addr = server.accept()

while true:

dic =

dic_bytes = bytes(json.dumps(dic), 'utf-8')

dic_bytes_len = len(dic)

head = struct.pack('i', dic_bytes_len)

conn.send(head)

conn.send(dic_bytes)

with open('run.py', 'rb') as fr:

for line in fr:

conn.send(line)

conn.close()

server.close()

Socket粘包問題

這兩天看csdn有一些關於socket粘包,socket緩衝區設定的問題,發現自己不是很清楚,所以查資料了解記錄一下 一兩個簡單概念長連線與短連線 1.長連線 client方與server方先建立通訊連線,連線建立後不斷開,然後再進行報文傳送和接收。2.短連線 client方與server每進行一次...

Socket粘包問題

這兩天看csdn有一些關於socket粘包,socket緩衝區設定的問題,發現自己不是很清楚,所以查資料了解記錄一下 一兩個簡單概念長連線與短連線 1.長連線 client方與server方先建立通訊連線,連線建立後不斷開,然後再進行報文傳送和接收。2.短連線 client方與server每進行一次...

socket粘包問題

一兩個簡單概念長連線與短連線 1.長連線 client方與server方先建立通訊連線,連線建立後不斷開,然後再進行報文傳送和接收。2.短連線 client方與server每進行一次報文收發交易時才進行通訊連線,交易完畢後立即斷開連線。此種方式常用於一點對多點 通訊,比如多個client連線乙個se...