在本地电脑上有两个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)的更多相关文章

  1. Python 网络编程(二)

    Python 网络编程 上一篇博客介绍了socket的基本概念以及实现了简单的TCP和UDP的客户端.服务器程序,本篇博客主要对socket编程进行更深入的讲解 一.简化版ssh实现 这是一个极其简单 ...

  2. Python 网络编程(一)

    Python 网络编程 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. ...

  3. Python学习(22)python网络编程

    Python 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的 ...

  4. Day07 - Python 网络编程 Socket

    1. Python 网络编程 Python 提供了两个级别访问网络服务: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口 ...

  5. python网络编程-01

    python网络编程 1.socket模块介绍 ①在网络编程中的一个基本组件就是套接字(socket),socket是两个程序之间的“信息通道”. ②套接字包括两个部分:服务器套接字.客户机套接字 ③ ...

  6. 《Python网络编程》学习笔记--使用谷歌地理编码API获取一个JSON文档

    Foundations of Python Network Programing,Third Edition <python网络编程>,本书中的代码可在Github上搜索fopnp下载 本 ...

  7. Python网络编程基础pdf

    Python网络编程基础(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1VGwGtMSZbE0bSZe-MBl6qA 提取码:mert 复制这段内容后打开百度网盘手 ...

  8. python 网络编程(Socket)

    # from wsgiref.simple_server import make_server## def RunServer(environ,start_response):# start_resp ...

  9. python 网络编程 IO多路复用之epoll

    python网络编程——IO多路复用之epoll 1.内核EPOLL模型讲解     此部分参考http://blog.csdn.net/mango_song/article/details/4264 ...

  10. 自学Python之路-Python网络编程

    自学Python之路-Python网络编程 自学Python之路[第一回]:1.11.2 1.3

随机推荐

  1. poj2299——Ultra-QuickSort

    Description In this problem, you have to analyze a particular sorting algorithm. The algorithm proce ...

  2. React Native工程中TSLint静态检查工具的探索之路

    建立的代码规范没人遵守,项目中遍地风格迥异的代码,你会不会抓狂? 通过测试用例的程序还会出现Bug,而原因仅仅是自己犯下的低级错误,你会不会抓狂? 某种代码写法存在问题导致崩溃时,只能全工程检查代码, ...

  3. Jsp遍历后台传过来的List

    1:使用jstl标签 (可以和自定义标签配合使用) 首先引用jstl标签 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" ...

  4. Unity3D手游开发日记(7) - 适合移动平台的天气效果

    腾讯的天涯明月刀的天气很棒,以前我也在CE3的基础上做了一个效果差不多的,但是在手机上,还是斜下固定视角的游戏,是否还需要一个天气系统? 而且没有G-Buffer的支持,很多牛逼效果实现不了,比如角色 ...

  5. 【cdq分治】【CF1093E】 Intersection of Permutations

    传送门 果然前两天写完咕咕咕那个题的题解以后博客就开始咕咕咕了-- Description 给定整数 \(n\) 和两个 \(1~\sim~n\) 的排列 \(A,B\). \(m\) 个操作,操作有 ...

  6. EA画时序图初试

    1.步骤: 1. 新建一个项目: 2. Use Case Model右键-->添加图-->左边选择UML Behavioral,右边选择Sequence: 3. 选择工具栏中的工具,点击工 ...

  7. 多线程中join方法的含义

    1.作用:调用这个方法的时候,主进程会在这里停住,等待该线程进行完毕再继续往下执行. 如:不使用join的情况: <?php class Join extends Thread { public ...

  8. Android缓存

    一个利用内存缓存和磁盘缓存图片的例子 public class BitmapCache { public static final String TAG = "debug"; pr ...

  9. OpenCV---模板匹配matchTemplate

    作用有局限性,必须在指定的环境下,才能匹配成功,是受到很多因素的影响,所以有一定的适应性 模板匹配是一种最原始.最基本的模式识别方法,研究某一特定对象物的图案位于图像的什么地方,进而识别对象物,这就是 ...

  10. JVM调优总结(3):垃圾回收面临的问题

    如何区分垃圾 上面说到的“引用计数”法,通过统计控制生成对象和删除对象时的引用数来判断.垃圾回收程序收集计数为0的对象即可.但是这种方法无法解决循环引用.所以,后来实现的垃圾判断算法中,都是从程序运行 ...