day8---多线程socket 编程,tcp粘包处理
复习下socket 编程的步骤:


动态导入模块:

1 实践:
2 1 lib下的aa
3 def test():
4 print("hehe")
5 class C(object):
6 name = "yang"
7 def __init__(self):
8 self.name = 'shenyang' 9 lib外的test
10 import importlib
11 dd = importlib.import_module('lib.aa')
12 dd.test()
13 print(dd.C().name)

运行:
判断错误
和 if 判断 一样 但是更简洁,一句话就OK
继续socket 编程:

1 #!/usr/bin/env python3
2 # Author: Shen Yang
3 import socket,os
4 ip_address = '192.168.16.10'
5 port = 8888
6 bind_address = (ip_address,port)
7 server = socket.socket()
8 server.bind(bind_address)
9 server.listen()
10 while True:
11 conn,addr = server.accept()
12 while True:
13 data = conn.recv(1024).decode()
14 if not data:
15 print("丢失连接")
16 break
17 print("这是来自",addr,data)
18 cmd_res = os.popen(data).read()
19 conn.send(str(len(cmd_res.encode('utf-8'))).encode('utf-8'))
20 conn.send(cmd_res.encode('utf-8'))
21 server.close()

客户端

1 #!/usr/bin/env python3
2 # Author: Shen Yang
3 import socket
4 ip_address = '192.168.16.10'
5 # ip_address = '192.168.81.133'
6 port = 8888
7 conn_address = (ip_address,port)
8 client = socket.socket()
9 client.connect(conn_address)
10 while True:
11 cmd = input(":> ").encode('utf-8')
12 if len(cmd) == 0:
13 continue
14 client.send(cmd)
15 cmd_size = int(client.recv(1024).decode())
16 print(cmd_size)
17 recov_size = 0
18 recov_data = b''
19 while recov_size < cmd_size:
20 data = client.recv(1024)
21 #print(data)
22 recov_size += len(data)
23 #print(recov_size)
24 recov_data += data
25 else:
26 print("收完了,大小",recov_size)
27 print(recov_data.decode())
28 client.close()

上面的代码 在linux 发送 会出现粘包 客户端收到的是两个数据
客户端加发送过程:

#!/usr/bin/env python3
import socket,os
ip_address = '192.168.81.133'
port = 8888
bind_address = (ip_address,port)
server = socket.socket()
server.bind(bind_address)
server.listen()
while True:
conn,addr = server.accept()
while True:
data = conn.recv(1024).decode()
if not data:
print("丢失连接")
break
print("这是来自",addr,data)
cmd_res = os.popen(data).read()
conn.send(str(len(cmd_res.encode('utf-8'))).encode('utf-8'))
ack = conn.recv(1024).decode()
print(ack)
conn.send(cmd_res.encode('utf-8'))
server.close()

ssh_client

1 #!/usr/bin/env python3
2 import socket
3 ip_address = '192.168.81.133'
4 port = 8888
5 conn_address = (ip_address,port)
6 client = socket.socket()
7 client.connect(conn_address)
8 while True:
9 cmd = input(":> ").encode('utf-8')
10 if len(cmd) == 0:
11 continue
12 client.send(cmd)
13 cmd_size = int(client.recv(1024).decode())
14 print(cmd_size)
15 client.send("收到大小".encode('utf-8'))
16 recov_size = 0
17 recov_data = b''
18 while recov_size < cmd_size:
19 data = client.recv(1024)
20 #print(data)
21 recov_size += len(data)
22 #print(recov_size)
23 recov_data += data
24 else:
25 print("收完了,大小",recov_size)
26 print(recov_data.decode())
27 client.close()

使用 os.stat 获取文件详细信息,发送给客户端
另外一个解决粘包的方法:
只收指定大小的数据 永远不可能粘包

1 #!/usr/bin/env python3
2 import socket,os,hashlib
3 ip_address = '192.168.81.133'
4 port = 8888
5 bind_address = (ip_address,port)
6 server = socket.socket()
7 server.bind(bind_address)
8 server.listen()
9 while True:
10 conn,addr = server.accept()
11 while True:
12 print("等待新链接")
13 data = conn.recv(1024)
14 if not data:
15 print("丢失连接")
16 break
17 print("这是来自",addr,data)
18 cmd,file_name = data.decode().split()
19 if os.path.isfile(file_name):
20 m = hashlib.md5()
21 f = open(file_name,'rb')
22 file_size = os.stat(file_name).st_size
23 conn.send(str(file_size).encode())
24 ack = conn.recv(1024).decode()
25 print("确认:",ack)
26 for line in f:
27 m.update(line)
28 print("sending...")
29 conn.send(line)
30 f.close()
31 conn.send(m.hexdigest().encode())
32 print("发送完毕")
33 server.close()

ftp_client.py

1 #!/usr/bin/env python3
2 import socket,hashlib
3 ip_address = '192.168.81.133'
4 port = 8888
5 conn_address = (ip_address,port)
6 client = socket.socket()
7 client.connect(conn_address)
8 while True:
9 cmd = input("input your cmd:> ").strip()
10 if len(cmd) == 0:
11 continue
12 if cmd.startswith("get"):
13 client.send(cmd.encode('utf-8'))
14 file_name = cmd.split()[1]
15 server_response = client.recv(1024)
16 print("收到回应:",server_response)
17 client.send("收到".encode('utf-8'))
18 total_file_size = int(server_response.decode())
19 print("总的",total_file_size)
20 f = open(file_name + '.new','wb')
21 recov_file_size = 0
22 m = hashlib.md5()
23 while recov_file_size < total_file_size:
24 if total_file_size - recov_file_size > 1024:
25 size = 1024
26 else:
27 size = total_file_size - recov_file_size
28 print("最后收",size)
29 #print("收数据...")
30 data = client.recv(size)
31 m.update(data)
32 recov_file_size += len(data)
33 f.write(data)
34 else:
35 print("收完了,大小",recov_file_size,total_file_size)
36 f.close()
37 print("服务器端发送的原MD5",client.recv(1024).decode())
38 print("自己算出来的最终MD5",m.hexdigest())
39 client.close()


继承关系:
创建socket server 步骤:
下面是重写的handle:

1 import socketserver
2 class MyTCPHandler(socketserver.BaseRequestHandler):
3 def handle(self):
4 while True:
5 try:
6 self.data = self.request.recv(1024).strip()
7 print("来自",self.client_address)
8 print(self.data)
9 self.request.send(self.data.upper())
10 except ConnectionResetError as e:
11 print("客户端退出",e)
12 break
13 if __name__ == "__main__":
14 HOST,PORT="localhost",9999
15 server = socketserver.TCPServer((HOST,PORT),MyTCPHandler)
16 server.serve_forever()

client:

1 import socket
2 client = socket.socket() #声明socket类型,同时生成socket连接对象
3 #client.connect(('192.168.16.200',9999))
4 client.connect(('localhost',9999))
5 while True:
6 msg = input(">>:").strip()
7 if len(msg) == 0:continue
8 client.send(msg.encode("utf-8"))
9 data = client.recv(10240)
10 print("recv:",data.decode())
11 client.close()


2 使用多进程实现: (windos 下不行,不支持,但是linux 绝得好使)

2 处理单个请求,一般也用不到
3 一直收请求,直到收到一个明确的shutdown (每0.5秒检测是否给我发了shutdown 的信号)
4 告诉 server_forever() 关闭
5 地址的重用,不需要等待tcp断开
day8---多线程socket 编程,tcp粘包处理的更多相关文章
- socket编程 TCP 粘包和半包 的问题及解决办法
一般在socket处理大数据量传输的时候会产生粘包和半包问题,有的时候tcp为了提高效率会缓冲N个包后再一起发出去,这个与缓存和网络有关系. 粘包 为x.5个包 半包 为0.5个包 由于网络原因 一次 ...
- Socket编程--TCP粘包问题
TCP是个流协议,它存在粘包问题 产生粘包的原因是: TCP所传输的报文段有MSS的限制,如果套接字缓冲区的大小大于MSS,也会导致消息的分割发送. 由于链路层最大发送单元MTU,在IP层会进行数据的 ...
- python/socket编程之粘包
python/socket编程之粘包 粘包 只有TCP有粘包现象,UDP永远不会粘包. 首先需要掌握一个socket收发消息的原理 发送端可以是1k,1k的发送数据而接受端的应用程序可以2k,2k的提 ...
- Python全栈-网络编程-TCP粘包
一.什么是TCP粘包 C/S架构下,接收方不知道每个消息的发送间隙.也不知道每次应该提取多少个字节的数据,与此同时,TCP是面向连接的,面向流的,收发两端都要有,因此发送端为了将多个发往接收端的数据包 ...
- socket编程解决粘包和丢包问题
##socket 丢包粘包解决方式 采用固定头部长度(一般为4个字节),包头保存的是包体的长度 header+body 包头+包体 下面的例子不是按照上图中规定的格式编写的,但是思路都是一样的,先读出 ...
- Socket编程 Tcp和粘包
大多数程序员都要接触网络编程,Web开发天天和http打交道.稍微底层一点的程序员,就是TCP/UDP . 对程序员来说,Tcp/udp的核心是Socket编程. 我的浅薄的观点---------理解 ...
- Socket编程(4)TCP粘包问题及解决方案
① TCP是个流协议,它存在粘包问题 TCP是一个基于字节流的传输服务,"流"意味着TCP所传输的数据是没有边界的.这不同于UDP提供基于消息的传输服务,其传输的数据是有边界的.T ...
- Socket编程实践(5) --TCP粘包问题与解决
TCP粘包问题 由于TCP协议是基于字节流且无边界的传输协议, 因此很有可能产生粘包问题, 问题描述如下 对于Host A 发送的M1与M2两个各10K的数据块, Host B 接收数据的方式不确定, ...
- 查漏补缺:socket编程:TCP粘包问题和常用解决方案(上)
1.TCP粘包问题的产生(发送端) 由于TCP协议是基于字节流并且无边界的传输协议,因此很容易产生粘包问题.TCP的粘包可能发生在发送端,也可能发生在接收端.发送端的粘包是TCP协议本身引起的,TCP ...
- TCP粘包/拆包 ByteBuf和channel 如果没有Netty? 传统的多线程服务器,这个也是Apache处理请求的模式
通俗地讲,Netty 能做什么? - 知乎 https://www.zhihu.com/question/24322387 谢邀.netty是一套在java NIO的基础上封装的便于用户开发网络应用程 ...
随机推荐
- Entity Framwork(EF) 7——在现在数据库的甚而上开发MVC 新项目
一.开发背景: 由于老系统已经无法满足实际业务需求,需在现有数据库的甚而上开发新的项目. 二.困难点: 而EF默认情况下是要删除现有数据库表格后重新创建,这是不允许的.当你创建数据库对象时系统会提示“ ...
- 基于WDF的PCI/PCIe接口卡Windows驱动程序(3)- 驱动程序代码(头文件)
原文出处:http://www.cnblogs.com/jacklu/p/4679304.html 在WDF的PCIe驱动程序中,共有四个.h文件(Public.h Driver.h Device ...
- Ubuntu下搭建Android编译环境
Ubuntu一台新机器的一些环境搭建新增一个3TB的硬盘,挂载方法,大于2TB的得parted来进行分区1: sudo parted /dev/sda2: mklabel gpt3: unit TB4 ...
- if条件里比较浮点数
晚上看会儿书,基础的东西,很多都不熟练,不得不佩服那些人真的很厉害,为啥会想到那些,我这傻脑袋是想不到,暂时...... 比较3.3333与3 #!/bin/bash var1=`echo " ...
- 安装crab
1. crab 介绍: Recommender systems in Python 官网介绍:http://muricoca.github.io/crab/ 在安装过程中,发现一个问题,我已经安装了A ...
- Dynamic CRM2016在一台本地服务器安装部署
在本地单独一台服务器上安装部署CRM2016时需要提前安装好CRM软件需要的必备软件,具体需要安装的组件如下截图:其中required为必须具备的安装组件.license可以采用微软官网的90天测试版 ...
- 心情闲适,发几个tatanic的图
第一次看这个是98年在高一的同学家里. 唯一的月末休息时,那时没有电话,老父以为我会在下午到caojp,结果老父在寒风中等我一个下午,发火了.
- 简单的jquery插件写法之一
http://jsfiddle.net/kyu0hdmx/embedded/#HTML
- HashedWheelTimer 原理
HashedWheelTimer 是根据 Hashed and Hierarchical Timing Wheels: Data Structuresfor the Efficient Impleme ...
- openstack cinder-volume 的高可用(HA)
http://blog.csdn.net/LL_JCB/article/details/51879378 为了保证云平台的稳定性,需要做很多部分的高可用.比如控制节点高可用.计算节点高可用.网络节点高 ...