在本地电脑上有两个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. ans_rproxy 说明

    ans_rproxy 说明 网络IP资源分配 Windows2008R2:        IP: 172.16.204.50/24        Gateway: 172.16.204.1      ...

  2. Linux必知必会——xargs命令

    1.功能: xargs可以将stdin中以空格或换行符进行分隔的数据,形成以空格分隔的参数(arguments),传递给其他命令.因为以空格作为分隔符,所以有一些文件名或者其他意义的名词内含有空格的时 ...

  3. NOIP2017

    NOIP2017游记 记得开始学OI是今年的6月,那时候纯粹是抱着好玩的心态来学的,但是渐渐地,我发现我好像喜欢上了OI,喜欢敲键盘时的声音,喜欢手指触碰键盘时的手感,喜欢这个奥赛班与其他科目学习气氛 ...

  4. mac下php添加openssl扩展

    进入php源码目录 cd ext/openssl mv config0.m4 config.m4 phpize && ./configure  && make & ...

  5. linux 查看登录日志

    原文:http://www.cnblogs.com/wangkangluo1/archive/2011/09/23/2185976.html linux查看日志: # cd /var/log # le ...

  6. eclipse插件大全(官方)

    eclipse插件大全:http://marketplace.eclipse.org/metrics/successful_installs 各个版本插件: http://download.eclip ...

  7. Python学习笔记(四十一)— 内置模块(10)urllib

    摘抄自:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432688314 ...

  8. bash高级

      重定向 管道:  ps  -ef | grep bash  管道作为命令衔接的 两个都写 ,一个到文件,一个到屏幕   tee  null

  9. php发送get和post请求

    1. Get方式实现 //初始化 $ch = curl_init(); //设置选项,包括URL curl_setopt($ch, CURLOPT_URL, "http://www.abc. ...

  10. 利用PhantomJS生成网站截图

    var page = require('webpage').create(); page.open('http://qq.com', function () { page.render('exampl ...