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. ...
随机推荐
- bzoj1032 [JSOI2007]祖码Zuma
1032: [JSOI2007]祖码Zuma Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 672 Solved: 335[Submit][Stat ...
- HDU 4003 (树形DP+背包)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4003 题目大意:有K个机器人,走完树上的全部路径,每条路径有个消费.对于一个点,机器人可以出去再回来 ...
- Codeforces Round #204 (Div. 2) A.Jeff and Digits
因为数字只含有5或0,如果要被90整除的话必须含有0,否则输出-1 如果含有0的话,就只需考虑组合的数字之和是9的倍数,只需要看最大的5的个数能否被9整数 #include <iostream& ...
- 【BZOJ】1003: [ZJOI2006]物流运输trans(SPFA+DP)
http://www.lydsy.com/JudgeOnline/problem.php?id=1003 这题一开始看是不会的额,,,还是看题解了..一开始我觉得不能用最短路啥的,,看了题解发现这是d ...
- java开源网站
1.http://www.java1234.com 2.http://www.2cto.com/Soft/
- WebUI-自用
一.常用插件 1.弹出框架: http://layer.layui.com/ http://layer.layui.com/mobile/ 移动端 http://aui.github.io/artDi ...
- log4net配置文件设置
windows服务执行cmd命令 最长公共子字符串 log4net配置文件设置 2011-11-16 13:15:41| 分类: Notes | 标签: |字号大中小 订阅 log4net ...
- 开源top100
1.SwitchyOmega 项目简介:SwitchyOmega 是 SwitchySharp 的新版本.这是一个 Chrome 浏览器用来切换不同代理的插件.SwitchyOmega 初次安装时会检 ...
- Bootstrap兼容
转:http://blog.csdn.net/chenhongwu666/article/details/41513901 如有雷同,不胜荣幸,若转载,请注明让IE6 IE7 IE8 IE9 IE10 ...
- [办公应用]我的WORD文档表格操作不灵活 无法调整列宽
最近同事的一个word文档中的表格操作非常不灵活,用鼠标直接调整列宽时总觉得很不灵活.她的操作系统为XP,office 为微软office 2003. 我首先检查了木马,检查了输入法等,结果都没有问题 ...