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'))   # 错误的命令返回的结果