socket通信
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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() # 关机
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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() #挂电话
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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()
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
import socket client = socket.socket() client.connect(('127.0.0.1',8080)) client.send(b'xixixi') data = client.recv(1024) print(data) client.close()
通信循环
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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()
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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)
粘包问题
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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)
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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')) # 错误的命令返回的结果