Python全栈学习笔记---网络编程(三)
一、客户端/服务器架构
客户端:因特定需求联系服务器,并发送必要的数据,然后等待服务器响应,最后完成请求或给出故障原因。对服务进行一次性请求。
服务器:一组硬件和软件,为一个或多个客户端服务。存在的唯一目的就是等待客户端请求,并响应然后等待更多请求。服务器无限运行,并不断处理请求
- 硬件客户端/服务器架构,例:打印机服务器、文件服务器
- 软件客户端/服务器架构,例:Web服务器、数据库服务器、窗体服务器
二、套接字(socket):通信端点,监听请求
套接字地址:(主机名,端口号)
UDP:成本低廉,不需大量的维护,例如:使用面向连接的协议
1、socket模块函数
创建套接字
1 import socket
2 tco_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
3 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
缩短代码:
1 from socket import * #将socket模块引入命名空间
2 tco_socket = socket(AF_INET, SOCK_STREAM)
3 udp_socket = socket(AF_INET, SOCK_DGRAM)
1.1、套接字的内置方法:
1.2、创建TCP服务器/客户端
1.2.1、创建TCP服务器
1 '''
2 创建TCP服务器,创建TCP服务器,接受客户端发送的字符串,并将其打上时间戳并返回给客户端
3 '''
4 from socket import *
5 from time import ctime
6
7 HOST = '' #主机名
8 PORT = 21567 #端口号
9 BUF_SIZE = 1024 #缓冲区大小
10 ADDR = (HOST, PORT)
11
12 tcp_sersock = socket(AF_INET, SOCK_STREAM)
13 tcp_sersock.bind(ADDR) #套接字绑定服务器地址
14 tcp_sersock.listen(5) #传入连接请求的最大数
15 try:
16 while True:
17 print('Waiting for connection...')
18 tcp_clisock, addr = tcp_sersock.accept() #接受客户端连接,返回客户端套接字,空出原始服务器套接字,使其可等待其它客户端请求
19 print('...connected from:', addr)
20
21 while True:
22 data = tcp_clisock.recv(BUF_SIZE).decode() #客户端套接字接受TCP消息,当一方关闭连接或向对方发送一个空字符串,连接关闭
23 if not data:
24 break
25 tcp_clisock.send(('[%s] %s ' % (ctime(), data)).encode())
26 tcp_clisock.close() #关闭临时客户端套接字
27 except ValueError: #传入一个调用者不期望的值,即使值的类型是正确的
28 tcp_sersock.close() #关闭服务端套接字,但一般服务器应无限循环运行,若服务器要实现智能退出方案,建议使用close()
注:
- 若支持IPv6,创建套接字时为AF_INET6
- 优雅地退出和调用服务器close()方法,使用try-except方法
1.2.2、创建TCP客户端
'''
创建TCP客户端, 连接到服务器,并以逐行数据的形式提示用户,服务器则返回加入时间戳的相同诗句,并通过客户端展示给用户
'''
from socket import * HOST = 'localhost' #服务器主机名 or'127.0.0.1 '
PORT = 21567 #服务器端口号
BUF_SIZE = 1024 #缓冲区大小
ADDR = (HOST, PORT) tcp_clisock = socket(AF_INET, SOCK_STREAM)
tcp_clisock.connect(ADDR) #创建到服务器的连接 while True:
data = input('>')
if not data:
break
tcp_clisock.send(data.encode())
data = tcp_clisock.recv(BUF_SIZE).decode()
if not data:
break
print(data)
tcp_clisock.close()
注:注意编码方式的转换
1.2.3、 执行TCP服务器和客户端
先执行服务器再执行客户端,若修改主机名则服务器在其他电脑上运行
>>>服务器端:
Waiting for connection...
...connected from: ('127.0.0.1', 45529)
>>>客户端:
>lll
[Sun Mar 4 16:27:47 2018] lll
1.3、创建UDP服务器和客户端
1.3.1、创建UDP服务器
1 '''
2 创建UDP服务器,接受客户端发来的消息,并加入时间戳前缀的该消息返回给客户端
3 '''
4
5 from socket import *
6 from time import ctime
7
8 HOST = ''
9 PORT = 21567
10 BUF_SIZE = 1024
11 ADDR = (HOST, PORT)
12
13 udp_sersock = socket(AF_INET, SOCK_DGRAM)
14 udp_sersock.bind(ADDR)
15 try:
16 while True:
17 print('Waiting for message...')
18 data, addr = udp_sersock.recvfrom(BUF_SIZE)
19
20 udp_sersock.sendto(('[%s] %s ' % (ctime(), data.decode())).encode(), addr)
21 print('...received from and returned to:', addr)
22 except ValueError:
23 udp_sersock.close()
1.3.2创建UDP客户端
1 '''
2 创建UDP客户端,提示用户输入发送到服务器的消息,并接受服务器加入时间戳的消息,然后显示给用户
3 '''
4
5 from socket import *
6
7 HOST = 'localhost'
8 PORT = 21567
9 BUF_SIZE = 2014
10 ADDR = (HOST, PORT)
11
12 upd_clisock = socket(AF_INET, SOCK_DGRAM)
13
14 while True:
15 data = input('>')
16 if not data:
17 break
18 upd_clisock.sendto(data.encode(), ADDR)
19 data, ADDR = upd_clisock.recvfrom(BUF_SIZE)
20 if not data:
21 break
22 print(data.decode())
23 upd_clisock.close()
Python全栈学习笔记---网络编程(三)的更多相关文章
- Python全栈【Socket网络编程】
Python全栈[socket网络编程] 本章内容: Socket 基于TCP的套接字 基于UDP的套接字 TCP粘包 SocketServer 模块(ThreadingTCPServer源码剖析) ...
- python全栈学习笔记(三)网络基础之网络设备及架构介绍
- python全栈学习笔记(一)网络基础之网络协议篇
阅读目录 一.操作系统基础 二.网络通信原理 2.1 互联网的本质就是一系列的网络协议 2.2 osi七层协议 2.3 tcp/ip五层模型讲解 2.3.1 物理层 2.3.2 数据链路层 2.3.3 ...
- python全栈学习笔记(二)网络基础之子网划分
阅读目录 一.ip地址基本知识 1.1 ip地址的结构和分类 1.2 特殊ip地址 1.3 子网掩码 1.4 ip地址申请 二.子网划分 2.1 子网划分概念 2.2 c类子网划分初探 2.3 子网划 ...
- Python全栈开发-Day8-Socket网络编程
本节内容 断言 Socket构建框架 ftp构建框架 Socket粘包 Socket介绍 Socket参数介绍 基本Socket实例 通过Socket实现简单SSH SocketServer 支持多用 ...
- python全栈学习路线
python全栈学习路线-查询笔记 查询目录 一,硬件 十一,数据 ...
- python 全栈开发笔记 4
反射 1.通过字符串的形式导入模块 2.通过字符串的形式,去模块中寻找指定函数并执行 ''' def f1(): return 'F1' def f2(): return 'F2' ''' #假设上面 ...
- Python全栈day24(面向对象编程作业作业_定义学校老师课程班级学生类)
面向对象作业 作业_定义学校老师课程班级学生类.py #面向对象编程作业,定义学校老师课程班级学生类 #定义几个类,尽可能定义多的数据属性及函数属性 class School: def __init_ ...
- python全栈开发笔记-----------概要
Python开发 开发: 开发语言: 高级语言:python.Java.php .C# .Go .ruby . C++ .... ===>字节码 低级语言:C.汇编 ...
- Java学习笔记-网络编程
Java提供了网络编程,并且在实际中有着大量运用 网络编程 网络编程概述 网络模型 OSI参考模型 TCP/IP参考模型 网络通讯要素 IP地址 端口号 传输协议 网络参考模型 网络通讯要素 IP地址 ...
随机推荐
- OuputStreamWriter介绍-OuputStreamReader介绍
OuputStreamWriter介绍 java.io.Outputstreamlwriter extends writeroutputStreamwriter:是字符流通向字节流的桥梁:可使用指定的 ...
- 快速入门API Explorer
摘要:华为云API Explorer为开发者提供一站式API解决方案统一平台,集成华为云服务所有开放 API,支持全量快速检索.可视化调试.帮助文档.代码示例等能力,帮助开发者快速查找.学习API和使 ...
- 【转载】JAVA - 解决:Java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
抄:https://www.cnblogs.com/sunylat/p/13339507.html 问题原因: 高版本的JDK中不包含javax.xml.bind包了! 解决方法: 1,如果是mave ...
- .net 多地点计算中心点
1.需求产生 快到周末了,几个远在各个区的朋友想要聚餐,为了照顾到彼此的距离,决定计算一下所有人的中心点,至此需求产生,下面开始编写代码. 2.编写代码 1)新建一个控制台程序 在NuGet程序包管理 ...
- vue + element-ui + vue-clipboard2 实现文字复制粘贴功能与提示
1.在所在项目下安装插件 npm install vue-clipboard2 --save 2.在所在项目的index.js注入vue-clipboard2 import VueClipboard ...
- go语言面试
go面试 基础 = 和 := 的区别? **Go语言中,= 操作符用于赋值,而 := 操作符可以用于声明及赋值. Go 语言支持短变量声明(针对局部变量),以 := 为标志,这里要注意的是,Go 语言 ...
- NETAPP硬盘更换
netapp硬盘新增 一.找到坏盘,插上新盘# 1.登陆到想要点亮的硬盘相对应的控制器上,并进去高级模式. priv set advanced 2.利用disk show -v 查看想要点亮的硬盘名字 ...
- 搭建Git服务器教程(整理自腾讯云开发者实验室)
搭建Git服务器教程(整理自腾讯云开发者实验室) 下载安装 Git Git 是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. 此实验以 CentOS 7.2 x64 的系统 ...
- FTP客户端c代码功能实现
现在市面上有很多免费的FTP软件:如FileZilla ,那如果想自己在代码中实现与ftp服务器的上传下载文件该如何实现那? 本质上ftp协议就是TCP基础上建立的一种协议,具体如下. FTP 概述 ...
- Prometheus&Alertmanager告警推送
前言 尽管可以通过可视化数据监控系统运行状态,但我们无法时刻关注系统运行,因此需要一些实时运行的工具能够辅助监控系统运行,当系统出现运行问题时,能够通知我们,以此确保系统稳定性,告警便是作为度量指标监 ...