socket通信
import socket
server = socket.socket() # 买手机 不传参数默认用的TCP协议
server.bind(('127.0.0.1',8080)) # bind(host,port) 插电话卡 绑定ip和端口
server.listen(5) # 开机 半连接池
conn,addr = server.accept() # 接听电话 特点运行之后会卡在哪里 等着别人打电话 没有数据会阻塞
data = conn.recv(1024) # 听别人说话 接受1024个字节数据 没有数据会阻塞
print(data)
conn.send(b'hello baby~~~') # 给别人回话
conn.close() # 挂电话
server.close() # 关机
服务端
import socket
client = socket.socket() # 那电话
client.connect(('127.0.0.1',8080)) # 拨号 写的是对方的ip和port
client.send(b'hello,world!!!')
data = client.recv(1024) # 听别人说话
print(data)
client.close() #挂电话
客户端
import socket
server = socket.socket()
server.bind(('127.0.0.1',8080))
server.listen(5)
conn, addr = server.accept()
data = conn.recv(1024)
conn.send(b'asdasdasd')
print(data)
conn.close()
server.close()
服务端
import socket
client = socket.socket()
client.connect(('127.0.0.1',8080))
client.send(b'xixixi')
data = client.recv(1024)
print(data)
client.close()
客户端
通信循环
import socket
server = socket.socket() # 生成一个对象
server.bind(('127.0.0.1',8080)) # 绑定ip和port
server.listen(5) # 半连接池 同时服务数量
while True:
conn, addr = server.accept() # 等到别人来 conn 就类似于双向通道
print(addr)
while True:
try:
data = conn.recv(1024)
print(data) # 针对mac和linux 客户端异常之后 服务端不会报错 会一直收b''
if len(data) == 0: # 增加代码兼容性
break
conn.send(data.upper())
except ConnectionResetError as e:
print(e)
break
conn.close()
服务端
import socket
client = socket.socket()
client.connect(('127.0.0.1',8080))
while True:
msg = input('输入>>>:').encode('utf-8')
if not msg:
continue
client.send(msg)
data = client.recv(1024)
print(data)
客户端
粘包问题
import socket
server = socket.socket() # 不传参数默认就是TCP协议
server.bind(('127.0.0.1',8080)) # bind(host,port) ;两个参数 ip 和port
server.listen(5) # 半连接池
conn, addr = server.accept() #等着别人给你打电话
data = conn.recv(5) # 接受5字节数据
print(data)
data = conn.recv(5) # 接受5字节数据
print(data)
data = conn.recv(4) # 接受4字节数据
print(data)
import socket
server = socket.socket()
server.bind(('127.0.0.1',8080))
server.listen(5)
conn,addr = server.accept()
data = conn.recv(6)
print(data)
服务端
import socket
client = socket.socket() # 拿电话
client.connect(('127.0.0.1',8080)) #
client.send(b'hello')
client.send(b'world')
client.send(b'baby')
import socket
client = socket.socket()
client.connect(('127.0.0.1',8080))
client.send(b'asdasd')
客户端
解决粘包问题
服务端
import socket,json,subprocess,struct
server = socket.socket()
server.bind(('127.0.0.1',8080))
server.listen(5)
while True:
conn,addr = server.accept()
while True:
try:
cmd = conn.recv(1024).decode('utf-8')
if not cmd:
break
obj = subprocess.Popen(shell=True,stdout=subprocess.Popen,stderr=subprocess.PIPE)
res = obj.stdout.read() + obj.stdout.read()
dic = {'name':'james','file_size':len(res),'info':'asd'}
json_dic = json.dumps(dic)
header = struct.pack('i',len(json_dic))
conn.send(header)
conn.send(json_dic.encode('utf-8'))
conn.send(res)
except Exception:
break
conn.close()
客户端
import socket,json,struct
client = socket.socket()
client.connect(('127.0.0.1',8080))
while True:
cmd = input('>>>').encode('utf-8')
if not cmd:
continue
client.send(cmd)
header_dict = client.recv(1024)
dict_size = struct.unpack('i',header_dict)[0]
dict_bytes = client.recv(dict_size)
dict_json = json.loads(dict_bytes.decode('utf-8'))
recv_size = 0
read_data = b''
while recv_size > dict_json.get('file_size'):
data = client.recv(1024)
read_data += data
recv_size += len(data)
struct模块
import struct
# res = 'qwertyuiopasdfghjkqwertyuiosdfghjkqwertyuiopasdfghjk'
# print('原始数据长度',len(res))
# 原始数据特别大的时候 i模式打包不了 需要更换模式
# 如果遇到数据量特别大的情况 该如何解决
dic = {
'name':'james',
'file_size':8979879879798777777777777777777777777946513232,
'info':'厉害了我的哥'
}
import json
json_d = json.dumps(dic)
print(len(json_d))
# 对数据打包
res1 = struct.pack('i',len(json_d))
print(len(res1))
# 对数据解包
res2 = struct.unpack('i',res1)[0]
print('解包之后的',res2)
subprocess模块复习
import subprocess
cmd = input('>>>:')
obj = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
print(obj.stdout.read().decode('gbk')) # 正确的命令返回的结果
print(obj.stderr.read().decode('gbk')) # 错误的命令返回的结果
# subprocess 获取的数据 拿完就没了 不能重复的拿
print(obj.stdout.read().decode('gbk')) # 正确的命令返回的结果
print(obj.stderr.read().decode('gbk')) # 错误的命令返回的结果