今日作业:通过开启子进程的方式实现套接字服务端可以并发的处理多个链接以及通讯循环(用到了subprocess模块,解决粘包问题)
server(服务端)
import socket
from multiprocessing import Process
import subprocess, struct
server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #
server.bind(('127.0.0.1',8080))
server.listen(5)
def talk(conn,client_addr):
print(client_addr)
while True:
data = conn.recv(1024)
if len(data) == 0:
break
print(data)
obj = subprocess.Popen(str(data,
encoding='utf-8'), shell=True,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
msg = obj.stdout.read()
import json
dic = {'size': len(msg)}
dic_bytes = (json.dumps(dic)).encode('utf-8')
head_count = struct.pack('i', len(dic_bytes))
print(dic)
conn.send(head_count)
conn.send(dic_bytes)
conn.send(msg)
if name == 'main': # windows下start进程一定要写到这下面
while True:
conn,client_addr=server.accept()
p=Process(target=talk,args=(conn,client_addr))
p.start()

client(客户端)

import socket
import struct
import json
soc=socket.socket()
soc.connect(('127.0.0.1',8080))
while True:
in_s=input('请输入要执行的命令:')
soc.send(in_s.encode('utf-8'))
head_dic_len=soc.recv(4)
head_l=struct.unpack('i',head_dic_len)[0]
dic_byte=soc.recv(head_l)
head=json.loads(dic_byte)
print(head)
l=head['size']
count=0
data_total=b''
print(l)
while count<l:
if l<1024: #如果接受的数据小于1024 ,直接接受数据大小
data=soc.recv(l)
else:#如果接受的数据大于1024
if l-count>=1024: #总数据长度-count(目前收到多少,count就是多少) 如果还大于1024 ,在收1024
data=soc.recv(1024)
else: #总数据长度-count(目前收到多少,count就是多少) 如果小于1024,只收剩下的部分就可
data=soc.recv(l-count)
data_total+=data
count+=len(data)
print(data_total.decode('gbk'))

最新文章

  1. Google 地图 API V3 之控件
  2. redis集群同步迁移方法(二):通过redis-migrate-tool实现
  3. [ACM_动态规划] 最长上升子序列(LIS)
  4. Python内置的HTTP协议服务器SimpleHTTPServer
  5. 【循序渐进学Python】8.面向对象的核心——类型(下)
  6. python 参数
  7. 运行时(iOS)
  8. Sqlserver CheckPoint 在三种恢复模式中的不同表现
  9. 动画特效的原生、jQ和CSS3方法
  10. wpf 异步使用
  11. 【LeetCode】462. Minimum Moves to Equal Array Elements II
  12. tensorflow用pretrained-model做retrain
  13. Django——缓存
  14. Gym 101981J - Prime Game - [数学题][线性筛+分解质因数][2018-2019 ACM-ICPC Asia Nanjing Regional Contest Problem J]
  15. Python实现机器学习算法:决策树算法
  16. Codeforces Round #277.5 (Div. 2)C——Given Length and Sum of Digits...
  17. 【BP算法】
  18. docker-compose安装与部署项目
  19. Qt QDateTime QTimer的简单实用
  20. Redis数据库介绍

热门文章

  1. [LeetCode] 124. Binary Tree Maximum Path Sum 求二叉树的最大路径和
  2. 关于App收集个人信息基本规范,这里公开征求你的意见!
  3. Airtest网易开源的一款UI自动化测试工具
  4. Zookeeper原理图
  5. office常用技巧汇总
  6. R语言构建蛋白质网络并实现GN算法
  7. 【03】Jenkins:SonarQube
  8. Winform 后台生成饼状图并保存为图片
  9. C++ explicit 的用法,就是必须显示调用
  10. Sqlserver表值函数来获取逗号分隔的ID