[ python ] 网络编程(1)
在本地电脑上有两个python文件 regist.py 、login.py 一个注册,一个登录。这两个python一个是写用户信息,一个是读用户信息,要怎么做呢?
通过之前的知识,我们可以通过 regist.py 序列化一个数据并持久保存到磁盘上,然后 login.py 在取读取这个文件就行。
但是,当这两个文件在不同的主机上时,我们就需要通过网络编程来实现,类似qq、网盘、微信。
osi 七层协议
在这七层中,我们应该明确:
每层运行常用物理设备:
每层运行常见的协议
要记牢:ip是在网络层,tcp、udp等协议是在传输层。
socket概念
理解 socket
从表现形式来讲,socket就是 ip:port,从设计模式来讲,socket其实就是一个门面模式,它把复杂的tcp/ip协议族隐藏在socket接口后面,对用户来说,一组简单的接口就是全部,让socket去组织数据,以符合指定的协议。
从python的角度来看,socket就是一个模块,我们通过调用模块中已经实现的方法建立两个进程之间的连接和通信。socket = ip:port ip 用来标识互联网中的一台主机的位置,而port是用来标识这台主机上的一个应用程序,所以我们只要确立了ip和port就能找到一个应用程序,并且使用socket模块来与之通信。
tcp协议与udp协议
tcp( Transmission Control Protocol ): 可靠的、面向连接的协议、传输效率低全双工通信、面向字节流。使用tcp应用:web浏览器;电子邮件、文件传输程序。
udp( User Datagram Protocol ): 不可靠的、无连接的服务,传输效率高,一对一、一对多、多对一、多对多、面向报文,尽最大努力服务,无拥塞控制。
使用udp的应用:域名系统;视频流;ip语音
套接字(socket)使用
1. 基于tcp协议的socket
tcp是基于链接的,必须先启动服务端,然后再启动客户端去连接服务端
sever端
import socket sock = socket.socket() # 创建 socket 对象
sock.bind(('127.0.0.1', 8080)) # 绑定ip和port
sock.listen(5) # 建立监听链接
conn, addr = sock.accept() # 阻塞,随时准备接收客户端链接
res = conn.recv(1024) # 阻塞,等待接收客户端发送过来的数据
conn.send(b'hello client.') # 向客户端发送信息
conn.close() # 关闭本次链接
sock.close() # 关闭服务器socket
client端
import socket sock = socket.socket() # 创建 socket 对象
sock.connect(('127.0.0.1', 8080)) # 去连接服务端的socket
sock.send(b'hello server.') # 发送信息给服务端的socket
res = sock.recv(1024) # 接收服务端socket发送过来的信息
print(res)
sock.close() # 关闭客户端连接
总结:
server端:
(1)创建socket对象
(2)绑定ip:port, 这里 ip为str类型,port为int类型
(3)建立socket监听
(4)准备接收客户端连接并返回socket连接信息和addr信息
(5)conn.send 发送信息、 conn.recv 接收消息
(6)先关闭连接,再关闭 socket
client端:
(1)创建socket对象
(2)通过 connect 尝试去连接服务端的socket
(3)sock.send 发送消息、sock.recv 接收消息
(4)关闭连接的socket
2. 基于UDP协议的socket
udp是无链接的,启动服务之后可以直接接受消息,不需要提前建立链接
server端
import socket
udp_sk = socket.socket(type=socket.SOCK_DGRAM) # 创建一个服务器的套接字,这里必须要定义 type=socket.SOCK_DGRAM
udp_sk.bind(('127.0.0.1', 8080)) # 绑定服务器套接字
msg, addr = udp_sk.recvfrom(1024) # udp服务器端第一次通信必须是接收信息
print(msg)
udp_sk.sendto(b'hello, client.', addr) # 发送信息
udp_sk.close() # 关闭服务器套接字
client端
import socket
ip_port = ('127.0.0.1', 8080) # 建立ip、port元组
udp_sk = socket.socket(type=socket.SOCK_DGRAM) # 创建一个服务器的套接字,这里必须要定义 type=socket.SOCK_DGRAM
udp_sk.sendto(b'hello server.', ip_port) # 发送消息给服务器端,在udp中第一次交互由客户端发起
back_msg, addr = udp_sk.recvfrom(1024) # 接收数据包括(服务器端数据,套接字信息)
print(back_msg)
udp_sk.close() # 关闭套接字
练习:使用 socket 模块实现 服务端 和 客户端 连接并执行命令。
import socket
import subprocess sk_server = socket.socket() # 创建 socket对象
sk_server.bind(('localhost', 8080)) # 建立socket
sk_server.listen(5) # 开启监听
conn, addr = sk_server.accept() # 接收客户端信息
while True:
command = conn.recv(1024).decode()
cmd_res = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) # 执行命令
stdout = cmd_res.stdout.read()
stderr = cmd_res.stderr.read()
result = stdout if stdout else stderr
res_size = len(result) # 统计命令执行结果大小
print(res_size)
conn.sendall(str(res_size).encode()) # 首先发送命令结果大小
response = conn.recv(1024).decode()
conn.sendall(result) # 发送命令结果
server.py
import socket sk_client = socket.socket()
sk_client.connect(('localhost', 8080))
while True:
cmd = input('>>>').strip()
if not cmd: continue
sk_client.sendall(cmd.encode())
res_size = int(sk_client.recv(1024).decode()) # 接收命令结果大小
sk_client.sendall(b'')
revice_size = 0
while res_size != revice_size: # 通过命令大小循环获取数据
data = sk_client.recv(1024)
revice_size += len(data)
print(data.decode('gbk'))
client.py
[ python ] 网络编程(1)的更多相关文章
- Python 网络编程(二)
Python 网络编程 上一篇博客介绍了socket的基本概念以及实现了简单的TCP和UDP的客户端.服务器程序,本篇博客主要对socket编程进行更深入的讲解 一.简化版ssh实现 这是一个极其简单 ...
- Python 网络编程(一)
Python 网络编程 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. ...
- Python学习(22)python网络编程
Python 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的 ...
- Day07 - Python 网络编程 Socket
1. Python 网络编程 Python 提供了两个级别访问网络服务: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口 ...
- python网络编程-01
python网络编程 1.socket模块介绍 ①在网络编程中的一个基本组件就是套接字(socket),socket是两个程序之间的“信息通道”. ②套接字包括两个部分:服务器套接字.客户机套接字 ③ ...
- 《Python网络编程》学习笔记--使用谷歌地理编码API获取一个JSON文档
Foundations of Python Network Programing,Third Edition <python网络编程>,本书中的代码可在Github上搜索fopnp下载 本 ...
- Python网络编程基础pdf
Python网络编程基础(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1VGwGtMSZbE0bSZe-MBl6qA 提取码:mert 复制这段内容后打开百度网盘手 ...
- python 网络编程(Socket)
# from wsgiref.simple_server import make_server## def RunServer(environ,start_response):# start_resp ...
- python 网络编程 IO多路复用之epoll
python网络编程——IO多路复用之epoll 1.内核EPOLL模型讲解 此部分参考http://blog.csdn.net/mango_song/article/details/4264 ...
- 自学Python之路-Python网络编程
自学Python之路-Python网络编程 自学Python之路[第一回]:1.11.2 1.3
随机推荐
- QoS专题-第5期-QoS实现之队列调度与报文丢弃
QoS实现之队列调度与报文丢弃 前面的专题里面介绍了通过优先级映射或者MQC对报文进行分类和标记,那么分类之后要做什么呢?那就是根据分类结果对报文进行流量控制处理.拥塞管理和拥塞避免就是两种流量控制手 ...
- 前端跨域问题相关知识详解(原生js和jquery两种方法实现jsonp跨域)
1.同源策略 同源策略(Same origin policy),它是由Netscape提出的一个著名的安全策略.同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正 ...
- bzoj2969 矩形粉刷 概率期望
此题在bzoj是权限题,,,所以放另一个oj的链接 题解: 因为期望线性可加,所以可以对每个方格单独考虑贡献.每个方格的贡献就为至少被粉刷过一次的概率×1(每个格子的最大贡献就是1...)每个方格至少 ...
- 解题:POI 2015 Kinoman
题面 发现每种电影只在两场之间产生贡献(只有$pos$的一场的就在$[pos,n]$产生贡献).那么我们针对每个位置$i$求出这场电影下一次出现的位置$nxt[i]$,然后每次更新一下,求整个区间的最 ...
- 解题:APIO 2008 免费道路
题面 我们发现我们可以很容易知道最终完成的生成树中有多少鹅卵石路,但是我们不好得到这棵生成树的结构,所以我们尽量“谨慎”地完成生成树·,最好是一点点加到我们要达到的标准而不是通过删掉一些东西来完成 我 ...
- 图像BMP格式介绍
1 图像BMP格式说明 BMP是一种与硬件设备无关的图像文件格式,使用非常广.它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大.BMP文件的图像深度可选 ...
- poj 1185 状态压缩
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 27926 Accepted: 10805 Descriptio ...
- SpringBoot项目中使用swagger2暴露resftul接口增加JWT来进行安全性验证
首先推荐两篇文章: 关于保护RestAPI的一些介绍: http://www.jianshu.com/p/6307c89fe3fa token与session的一些区别漫谈: http://www.j ...
- mesos+marathon+zookeeper+docker
http://mesosphere.com/docs/mesosphere/getting-started/single-node-install/ mesos-master --zk=zk://lo ...
- mysql cpu 占用高
vi /etc/my.cnf [mysqld]tmp_table_size=200M mysql> show global status like ‘created_tmp%‘; +—————— ...