ソケット
ソケットは通信サイクルに参加します
クライアント
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'客户端{addr}已连接上了')
while True:
try:
data = conn.recv(1024)
print(data)
except Exception:
break
conn.close()
soc.close()
SSH
sshのリモートコマンドの実行
サブプロセスモジュールは、システムコマンドを実行することです
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'客户端{addr}已连接上了')
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()
クライアントが送信すると、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 = {'size': os.path.getsize('run.py'), 'name': 'new_run.py'}
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()