通信循环 粘包问题 及解决方法 socket通信 struct模块 subprocess模块复习

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'))   # 错误的命令返回的结果
原文地址:https://www.cnblogs.com/xuzhaolong/p/11340545.html