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. ...
随机推荐
- POJ2778 DNA Sequence(AC自动机+矩阵快速幂)
题目给m个病毒串,问不包含病毒串的长度n的DNA片段有几个. 感觉这题好神,看了好久的题解. 所有病毒串构造一个AC自动机,这个AC自动机可以看作一张有向图,图上的每个顶点就是Trie树上的结点,每个 ...
- POJ 2217 (后缀数组+最长公共子串)
题目链接: http://poj.org/problem?id=2217 题目大意: 求两个串的最长公共子串,注意子串是连续的,而子序列可以不连续. 解题思路: 后缀数组解法是这类问题的模板解法. 对 ...
- Remove Duplicates from Sorted List II leetcode java
题目: Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct ...
- 转:JQuery中$.ajax()方法参数详解
url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 ...
- windows渗透被人忽视的一些小命令
cmdkey /list 可以列出域内网之间可用的凭据. wmic useraccount get name,sid gpresult /r
- 使用CSS3实现百叶窗
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title&g ...
- Java下利用Jackson进行JSON解析和序列化
Java下利用Jackson进行JSON解析和序列化 Java下常见的Json类库有Gson.JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行 ...
- [转]3天搞定的小型B/S内部管理类软件定制开发项目【软件开发实战10步骤详解】
本文转自:http://www.cnblogs.com/jirigala/archive/2010/10/07/1845275.html 2010-10-07 21:39 by 通用C#系统架构, 5 ...
- BibTex插入Reference
1. 在tex文件中加入: \bibliographystyle{plain} %这是格式 \bibliography{reffile} % reffile.bib是reference的文件 2 ...
- GIT: 远程建立一个仓库,然后复制到本地
1. 登录 GIT,创建一个新的仓库 gitskills 2. 创建的时候,要选择 Initialize this repository with a readme ,让GitHub初始化仓库 3. ...