客戶端
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...