day26

网络通信

参考:

http://www.cnblogs.com/yuanchenqi/articles/5692716.html

男生是client端,字条是socket(sk),通过sk通信。

socket属于客户端。应用程序两端通过“套接字”向网络发出请求或者应答网络请求。可以把socket理解为通信的把手(hand)。

确定对端IP地址→ 确定应用程序端口 → 确定通讯协议

server下的方法

bind()

listen()

accept()

recv()

send()#传送内容必须为bytes类型

sendall()

close()

client下的方法

connect()

recv()

send()

aendall()

close()

client发送,serve接收

serve.py

 import socket

 sk = socket.socket()#创建socket

 print(sk)

 address = ('127.0.0.1', 8000)#本机地址
sk.bind(address)#为socket绑定IP和端口号 sk.listen(3)#限制排队的个数
print('waiting......')
conn, addr = sk.accept()#conn为客户端socket对象
#
# inp = input('>>>')
# conn.send(bytes(inp, 'utf8')) data = conn.recv(1024)#为什么用conn,而不用sk
print(str(data, 'utf8')) # conn.close()#关具体对象
# sk.close()#全关

client.py

 import socket

 sk = socket.socket()

 print(sk)
address = ('127.0.0.1', 8000) sk.connect(address) #data = sk.recv(1024)#收到的为bytes类型
data = sk.send(bytes('hah', 'utf8')) #print(str(data, 'utf8'))

运行serve.py

<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)>
waiting......

waiting,accept()阻塞。

运行client.py

<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)>

Process finished with exit code 0

serve收到数据“hah”

<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)>
waiting......
hah Process finished with exit code 0

client接收,serve发送

serve.py

 import socket

 sk = socket.socket()#创建socket

 print(sk)

 address = ('127.0.0.1', 8000)#本机地址
sk.bind(address)#为socket绑定IP和端口号 sk.listen(3)#限制排队的个数
print('waiting......')
conn, addr = sk.accept()#conn为客户端socket对象 inp = input('>>>')
conn.send(bytes(inp, 'utf8')) # data = conn.recv(1024)#为什么用conn,而不用sk
# print(str(data, 'utf8')) # conn.close()#关具体对象
# sk.close()#全关

client.py

import socket

sk = socket.socket()

print(sk)
address = ('127.0.0.1', 8000) sk.connect(address) data = sk.recv(1024)#收到的为bytes类型
#data = sk.send(bytes('hah', 'utf8')) print(str(data, 'utf8'))

运行serve.py

<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)>
waiting......

运行client.py

<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)>

在serve命令行输入hello

<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)>
waiting......
>>>hello Process finished with exit code 0

client命令行收到数据。

<socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 0)>
hello Process finished with exit code 0

不间断聊天

client.py

 import socket

 sk = socket.socket()

 print(sk)
address = ('127.0.0.1', 8000)
sk.connect(address) while True:
inp = input('>>>')
if inp == 'exit':
break
sk.send(bytes(inp, 'utf8')) data = sk.recv(1024)
print(str(data, 'utf8')) sk.close()
#print(sk)

serve.py

 import socket

 sk = socket.socket()#创建socket

 print(sk)

 address = ('127.0.0.1', 8000)#本机地址
sk.bind(address)#为socket绑定IP和端口号 sk.listen(3)#限制排队的个数
print('waiting......')
#conn, addr = sk.accept()#conn为客户端socket对象 while True:
conn, addr = sk.accept()
print(addr) #client打开则接收
while True:
#收
try:
data = conn.recv(1024)#为什么用conn,而不用sk,client关闭时报错误
except Exception:
break #client端停止,他也停止
print('.......',str(data, 'utf8'))
if not data:break
#发
inp = input('>>>')
conn.send(bytes(inp, 'utf8')) sk.close()#全关

不间断聊天,其中client若关闭,新开一个client,serve端还能继续服务。

粘包现象(远程执行命令)

cmd_client.py

 import socket

 sk = socket.socket()

 print(sk)
address = ('127.0.0.1', 8001)
sk.connect(address) while True:
inp = input('>>>')
if inp == 'exit':
break
sk.send(bytes(inp, 'utf8'))
result_len = int(str(sk.recv(1024), 'utf8')) sk.sendall(bytes('ok', 'utf8'))#收到长度信息后,告诉server data = bytes()#初始化
while len(data) != result_len: #等于原文件大小,说明接收完
recv = sk.recv(1024)
data += recv print(str(data, 'utf8')) sk.close()
#print(sk)

cmd_server.py

 import socket
import subprocess
sk = socket.socket()#创建socket print(sk) address = ('127.0.0.1', 8001)#本机地址
sk.bind(address)#为socket绑定IP和端口号 sk.listen(3)#限制排队的个数
print('waiting......')
#conn, addr = sk.accept()#conn为客户端socket对象 while True:
conn, addr = sk.accept()
print(addr) #client打开则接收
while True:
#收
try:
data = conn.recv(1024)#为什么用conn,而不用sk,client关闭时报错误
except Exception:
break #client端停止,他也停止
print('.......',str(data, 'utf8')) if not data:break
obj = subprocess.Popen(str(data, 'utf8'), shell = True, stdout = subprocess.PIPE)
cmd_result = obj.stdout.read()#以上执行结果
#print(cmd_result)
result_len = bytes(str(len(cmd_result)), 'utf8') conn.sendall(result_len)#发
#先向client发送数据,client若收到则向server发送OK,Server再发送处理结果
#若连续发送,两个发送内容(长度,处理结果)可能会合并。
re = conn.recv(1024)#防止粘包
if str(re, 'utf8') != 'ok':
break
#发
conn.sendall(cmd_result) # conn.sendall(result_len) # 这种方式会发生粘包现象,长度和内容合在一起了
# conn.sendall(cmd_result)
sk.close()#全关

先执行server.py,再执行client.py,在client中输入命令(dir,pwd,ifconfig等)

Python网络通信的更多相关文章

  1. Python网络通信 (一)

    ISO(国际标准化组织)--->网络体系结构标准 OSI模型 OSI 七层模型 应用层 :提供用户服务,具体内容由特定程序规定 表示层 :提供数据的压缩解压和加密等 会话层 :建立程序级的连接, ...

  2. FastNet C++/Python 网络通信库之 协议

    协议可以使用的基础数据类型: UInt8,UInt16,UInt32,UInt64Int8,Int16,Int32,Int64Float,Double,Bool,String [T]  数组,T代表元 ...

  3. Python—网络通信编程之tcp非阻塞通信(socketserver)

    服务端代码 import socketserver # 定义一个类 class MyServer(socketserver.BaseRequestHandler): # 如果handle方法出现报错, ...

  4. Python—网络通信编程之udp通信编程

    服务端代码 import socket # 1.创建实例,即数据报套接字 server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 2.绑 ...

  5. Python—网络通信编程之tcp通信编程

    服务端代码 import socket # 1.创建流式套接字实例 # server = socket.socket() server = socket.socket(socket.AF_INET, ...

  6. python中Socket的使用

    说明 前一段时间学习python网络编程,完成简单的通过python实现网络通信的功能.现在,将python中Socket 通信的基本实现过程做一个记录备份. Socket通信 python 中的so ...

  7. twisted是python实现的基于事件驱动的异步网络通信构架。

    网:https://twistedmatrix.com/trac/ http://www.cnblogs.com/wy-wangyan/p/5252271.html What is Twisted? ...

  8. 百万年薪python之路 -- 网络通信原理

    1. C/S B/S架构 C: Client 客户端 B: Browse 浏览器 S: Server 服务端 C/S架构: 基于客户端与服务端之间的通信 eg: QQ,微信,LOL,DNF等需要安装A ...

  9. python中的网络通信,socket、select、selectors、socketserver

    楔子 网络通信用于获取一个算法在本地运行所需的数据,还可以共享信息实现分布式处理,另外可以用来管理云服务. python的标准库提供了一些模块来创建网络服务以及访问现有服务ipaddress模块提供了 ...

随机推荐

  1. Mininet

    在Coursera SDN开放课程中,编程作业要用Mininet来完成.这里对Mininet做一个简单的介绍. 什么是Mininet Mininet是由一些虚拟的终端节点(end-hosts).交换机 ...

  2. 如何看待阿里 AI 每秒制作 8000 张海报?

    看了其他设计老师们的回答,给了我一些启发,于是更新一波. 设计本质上是产品和服务的一部分,如果只站在设计师角度看这问题,免不了会有一种被取代的危机感. 来源:千锋UI ​但如果站在整个产品和服务的角度 ...

  3. 简单解决 Javascrip 浮点数计算的 Bug(.toFixed(int 小数位数))

    众所周知,Javascript 在进行浮点数运算时,结果会非预期地出现一大长串小数. 解决: 如果变量 result 是计算结果,则在返回时这样写,return result.toFixed(2): ...

  4. Jmeter中控制某一段脚本失败后重复执行,并在每个HTTP Request名字中加上循环次数

    ================================================== 1.While Controller之前有一个BeanShell Sampler,用于Init N ...

  5. Jmeter将HTTP request报文体中的字符串转换为大写

    <awd><client id='${__javaScript("${IndividualID}".toUpperCase())}'><member ...

  6. js中为什么非要alert一下下一步才会执行

    多数原因为界面ajax中动态添加的元素还没被添加上,就执行了js函数(js函数要调用动态元素),解决办法:ajax方法中添加 async:false,同步,作用为,在ajax执行完毕后才执行之后的js ...

  7. 通过电机编码器AB相输出确定电机转向

    AB相输出相差90度,即当A相"正跳变"时如果B相是高电平那么是"正转",反之是"反转" 图片: 正转 反转 #include <Ti ...

  8. MAC安装远程工具Securecrt的破解方式(详细有图)

    想要实现mac的远程连接功能,本来想使用终端的,但是终端的很多功能是欠佳的,所以决定安装一款,像windows的xshell一样好的软件,所以选择了这款Securecrt. 首先准备两个东西,一个是S ...

  9. yersinia的DHCP池耗尽断网攻击

    http://jingyan.baidu.com/article/0eb457e5045bd703f1a9051d.html yersinia -G

  10. QGIS+GH + MapServer

    拒绝描图,如何利用GH+QGIS完爆场地底图?http://www.sohu.com/a/251004986_657084 拒绝描图--爬取OSM数据绘制底图 所用软件 RHINO+GH\QGIS\G ...