socketserve及其应用
1.cmd命令 利用socket
socket服务端
import socket
import subprocess
s = socket.socket()
s.bind(("127.0.0.1",8000))
s.listen(3)
print("waiting...")
while 1:
conn,addr = s.accept()
print(conn)
while 1:
try:
a = conn.recv(1024)
except Exception:
break
if not a:
break
print(">>>",str(a,"utf8"))
obj = subprocess.Popen(a.decode("utf8"),shell=True,stdout=subprocess.PIPE)
result = obj.stdout.read()
print('ooooo',type(result))
result_len = bytes(str(len(result)),"utf8") # result是unicode编码下的十六进制 所以先转换成字符串(Unicode) 在转换成bytes
conn.sendall(result_len) # 两个send在一起容易发生粘包 特别是第一个数据特别小的时候
conn.sendall(result) # 所以在send之间在来个一收一发
s.close()
client客户端
import socket
s = socket.socket()
ss = ("127.0.0.1",8000)
s.connect(ss)
while 1:
inp = input(">>>")
if inp =="q":
break
s.send(bytes(inp,"utf8")) # send 传送智能是bytes类型
result_len = int(str(s.recv(1024),"utf8")) # 二进制的不能直接转换成整形!!!
print(result_len)
data = bytes()
while len(data)!=result_len: # 大文件传输过程中 不能一次传完 造成延迟 所以要先
data += s.recv(1024) # 传输文件的大小 根据大小判断文件传输
print(str(data,"gbk"))
s.close()
上述的代码实现了client端发送cmd指令到serve端进行执行后返回给client端结果的一个过程。
attention:一发一收
socket创建
s = socket.socket()这样就创建了一个socket对象。在serve端和client端分别需要创建一个。括号中仍有4个默认函数:
family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None
其中family是IPV4 的默认值,type是TCP的默认值。
设置值
创建好socket之后,serve端需要设置(4,5行)
1 bind绑定IP和端口。
2 listening值是最多等待。
3 接受client协议和地址 即 第八行
4 注意这里的conn就是client端的.socket 所以在接收的时候为conn.receive
client端只用设置连接的address和端口。
小细节
1.serve端的try是防止client端直接结束造成接收报错。
2.若接收的a为空表示client端主动断开了socket连接(本身发送不能发送空)。
关于subprocess
obj = subprocess.Popen(a.decode("utf8"),shell=True,stdout=subprocess.PIPE)
result = obj.stdout.read()
这两句话实现了cmd在子程序中运行后返回结果到result。
注意这里的result是gbk编码下的bytes类型。
关于这其中杂乱的编码
Python3中有两种格式:
str:str>>bytes 称为编码(encode)方法有1.re=bytes(“ccc”,“utf8”)2.re=“ccc”.encode(“utf8”)py3中str都是Unicode编码。兼容utf8,三字节表示中文。
bytes:bytes>>str称为解码(decode)方法有1.re = str(“ccc”,“utf8”)2.re=“ccc”.decode(“utf8”)bytes类型有相对应的编码协议。即什么样的编码形式 (如utf8)就仍用什么样的解码。
Python2中也有两种:
str:即原来的3中的bytes
Unicode:即str u“你好” 表示内容用的Unicode编码。
pyhton3中页面用到utf8,2中用的阿斯克码。
大文件传输问题解决
发送端的sendall必将数据都发送过去,但是接收的时候一次最多接收设置值1024个字节。(received值最大8K)所以造成接收时显示缓慢。(接收第二条时仍旧显示第 一条)
解决办法是:多次循环接收直到data大小等于文件大小。while len(data)!=result_len:不相等就继续接收。
2.socketserve
serve端
import socketserver
class Myserve(socketserver.BaseRequestHandler):
def handle(self):
print("active")
while 1:
conn = self.request
print(self.client_address)
while 1:
a = conn.recv(1024)
print(">>>", str(a, "utf8"))
if not a:
break
inp = input(">>>")
conn.send(bytes(inp, "utf8"))
conn.close()
mine = socketserver.ThreadingTCPServer(("127.0.0.1",8000),Myserve)
mine.serve_forever()
上述通过调用socketserver实现了多个client和一个server进行通信的功能。
实现过程:
创建一个自己命名的server类myserver
只在此类中创建一个方法:handle名字不能变,逻辑按照功能设计
创建socketserver对象,调用ThreadingTCPServer方法传入address元组,和server。
serverforever()激活这个并发的server。
socketserve及其应用的更多相关文章
- socket-自我总结(2)
这里总结下一个服务端与多个客户端之间的通信. 先看demo: #/usr/bin/env python #_*_coding:utf-8_*_ __author__ = 'ganzl' import ...
- iOS开发之AsyncSocket使用教程
用socket可以实现像QQ那样发送即时消息的功能.客户端和服务端需要建立长连接,在长连接的情况下,发送消息.客户端可以发送心跳包来检测长连接. 在iOS开发中使用socket,一般都是用第三方库As ...
- CocoaAsyncSocket框架的简单封装
在iOS开发中使用socket(CFNetwork),一般都是用第三方库AsyncSocket. 参考博客:http://my.oschina.net/worldligang/blog/396881? ...
- [py]python的继承体系-源码目录结构
python3安装目录 pip install virtualenv pip install virtualenvwrapper pip install virtualenvwrapper-win m ...
- [py]python的继承体系
python的继承体系 python中一切皆对象 随着类的定义而开辟执行 class Foo(object): print 'Loading...' spam = 'eggs' print 'Done ...
- 网络编程进阶---->>> hamc模块 socketserver模块验证合法性 两者进行通信连接
我们在工作中经常遇到,你公司内的某一台电脑要去访问你的服务器或者一个服务端电脑,那么你是让每一台都进行连接吗? 那不可能的 你肯定要进行限定的 验证客户端链接的合法性: hamc模块 hamc也是 ...
- python--(socket与粘包解决方案)
python--(socket与粘包解决方案) 一.socket: Socket 是任何一种计算机网络通讯中最基础的内容.例如当你在浏览器地址栏中输入 http://www.cnblogs.com/ ...
- Apache Log4j 反序列化代码执行(CVE-2019-17571) 漏洞分析
Apache Log4j 漏洞分析 仅用于研究漏洞原理,禁止用于非法用途,后果自负!!! CVE-2019-17571 漏洞描述 Log4j是美国阿帕奇(Apache)软件基金会的一款基于Java的开 ...
- Python网络编程基础 PDF 完整超清版|网盘链接内附提取码下载|
点此获取下载地址提取码:y9u5 Python网络编程最好新手入门书籍!175个详细案例,事实胜于雄辩,Sockets.DNS.Web Service.FTP.Email.SMTP.POP.IMAP. ...
随机推荐
- BZOJ3919 : [Baltic2014]portals
预处理出每个点上下左右能延伸到的最远点以及到它们的距离的最小值md. 然后spfa,一个点除了可以以1的代价到达四周的点之外,还可以以md+1的代价到达四个方向能到达的最远点. #include< ...
- BZOJ3046 : lagoon
码农题,拆点BFS预处理出所有联通块的面积即可,注意分类讨论. #include<cstdio> #include<cmath> using namespace std; co ...
- HDU 2222(AC自动机模板题)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2222 题目大意:多个模式串.问匹配串中含有多少个模式串.注意模式串有重复,所以要累计重复结果. 解题 ...
- 编写爬虫程序的神器 - Groovy + Jsoup + Sublime
写过很多个爬虫小程序了,之前几次主要用C# + Html Agility Pack来完成工作.由于.NET BCL只提供了"底层"的HttpWebRequest和"中层& ...
- topcoder SRM 592 DIV2 LittleElephantAndBooks
#include <iostream> #include <vector> #include <algorithm> using namespace std; cl ...
- 【BZOJ】1098: [POI2007]办公楼biu(补图+bfs+链表)
http://www.lydsy.com/JudgeOnline/problem.php?id=1098 显然答案是补图连通块..... 想到用并查集...可是连补图的边都已经...n^2了...怎么 ...
- Contest Hunter Round #70 - 连续两大交易事件杯省选模拟赛
orz lydrainbowcat [Problem A]「艦これ市」70万幕后交易事件 排序机器=-=.重要的是相同的处理. 我们可以从小到大添加数字,然后维护一个位置的序列.每一种相等的数字都在一 ...
- hiho#14
军训去了没有打,回来看题跑. T1:hehe 注意X可能是实数233 #include<cstdio> #include<cctype> #include<queue&g ...
- new在c#方法中的使用
new在c#中有三种用法: 1.实例化对象 2.泛型约束 3.用在方法前.new和override的区别在于:override用于重写父类的方法:new用于隐藏方法,它调用的方法来自于申明的类,如果申 ...
- jsoncpp封装和解析字符串、数字、布尔值和数组
使用jsoncpp进行字符串.数字.布尔值和数组的封装与解析. 1)下载jsoncpp的代码库 百度网盘地址 :http://pan.baidu.com/s/1ntqQhIT 2)解压缩文件 json ...