Python网络编程详解


Posted in Python onOctober 31, 2017

1、服务器就是一系列硬件或软件,为一个或多个客户端(服务的用户)提供所需的“服务”。它存在唯一目的就是等待客户端的请求,并响应它们(提供服务),然后等待更多请求。

2、客户端/服务器架构既可以应用于计算机硬件,也可以应用于计算机软件。

3、在服务器响应客户端之前,首先会创建一个通信节点,它能够使服务器监听请求。

一、套接字:通信端点

1、套接字

套接字是计算机网络数据结构,它体现了上节中所描述的“通信端点”的概念。在任何类型的通信开始之前,网络应用程序必须创建套接字。

有两种类型的套接字:基于文件和面向网络的。

2、套接字地址:主机-端口对

如果一个套接字像一个电话插孔-允许通信的一些基础设施,那么主机名和端口号就像区号和电话号码的组合。有效的端口号范围为0-65535(小于1024的端口号预留给了系统)

3、面向连接的套接字和与无连接的套接字

面向连接,在进行通信之前必须建立一个连接。实现这种连接类型主要协议是TCP(传输控制协议)

无连接,在通信之前并不需要建立连接。主要协议是UDP(用户数据报协议)

二、Python中的网络编程

1、socket()模块函数

为创建TCP/IP套接字:tcpSock = socket.socket(socket.AF_INEF,socket.SOCK_STREAM)

创建UDP/IP套接字:udpSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

2.常见的套接字对象方法和属性

名称 描述
服务器套接字方法  
s.bind()  将地址(主机名、端口号对)绑定到套接字上
s.listen() 设置并启动TCP监听器
s.accept() 被动接受TCP客户端连接,一直等待直到连接到达(阻塞)
客户端套接字方法  
s.connect() 主动发起TCP服务器连接
s.connect_ex() connect的扩展版本,此时会以错误代码的形式返回问题,而不是抛出一个异常
普通的套接字方法  
s.recv() 接受TCP消息
s.send() 发送TCP消息
s.sendall() 完整的发送TCP消息
s.recvfrom() 接收UDP消息
s.shutdown() 关闭连接
s.close() 关闭套接字

3、创建TCP服务器

ss = socket()  #创建服务器套接字
ss.bind()      #套接字与地址绑定
ss.listen()      #监听连接
inf_loop:       #服务器无限循环
  cs = ss.accept()     #接收客户端连接
  comm_loop:        #通信循环
    cs.recv()/cs.send()  #对话(接收、发送)
  cs.close()       #关闭客户端套接字
ss.close()        #关闭服务器套接字(可选)
#!/usr/bin/env python
#TCP时间戳服务器
from socket import *
from time import ctime
HOST = ''
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)
tcpSerSock = socket(AF_INET,SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)
while True:
  print('waiting for connecting...')
  tcpClisock, addr = tcpSerSock.accept()
  print('...connected from:',addr)
  while True:
    data = tcpClisock.recv(BUFSIZ)
    if not data:
      break
    tcpClisock.send('[%s] %s' % (bytes(ctime(),'utf-8'),data))
  tcpClisock.close()
tcpSerSock.close()

4、创建TCP客户端

cs = socket()
cs.connect()
comm_loop:
  cs.send()/cs.recv()
cs.close()
#!/usr/bin/env python
#TCP时间戳客户端
from socket import *
HOST = '127.0.0.1'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)
tcpClisock = socket(AF_INET,SOCK_STREAM)
tcpClisock.connect(ADDR)
while True:
  data = input('> ')
  if not data:
    break
  tcpClisock.send(data)
  data = tcpClisock.recv(BUFSIZ)
  if not data:
    break
  print(data.decode('utf-8'))
tcpClisock.close()

5、创建UDP服务器

ss = socket()
ss.bind()
inf_loop:
  cs = ss.recvfrom()/ss.sendto()
ss.close()
#!/usr/bin/env python
#UDP时间戳服务器
from socket import *
from time import ctime
HOST = ''
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)
udpSerSock = socket(AF_INET,SOCK_DGRAM)
udpSerSock.bind(ADDR)
while True:
  print('waiting for message...')
  data, addr=udpSerSock.recvfrom(BUFSIZ)
  udpSerSock.sendto('[%s] %s' % (ctime(),data),addr)
  print('...received from and returned to:',addr)
udpSerSock.close()

6、创建UDP客户端

cs = socket()
comm_loop:
  cs.send()/cs.recvfrom()
cs.close()
#!/usr/bin/env python
#UDP时间戳客户端
from socket import *
HOST = 'localhost'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)
udpClisock = socket(AF_INET,SOCK_DGRAM)
while True:
  data = input('> ')
  if not data:
    break
  udpClisock.sendto(data,ADDR)
  data, ADDR=udpClisock.recvfrom(BUFSIZ)
  if not data:
    break
  print(data)
udpClisock.close()

以上就是本文关于Python网络编程详解的全部内容,希望对大家有所帮助。欢迎参阅:Python中enumerate函数代码解析、python数据类型判断type与isinstance的区别实例解析、python中requests库session对象的妙用详解等,有什么问题可以随时留言,有问题我就改。。。

Python 相关文章推荐
python通过pil将图片转换成黑白效果的方法
Mar 16 Python
python中for语句简单遍历数据的方法
May 07 Python
在Python的Django框架下使用django-tagging的教程
May 30 Python
使用Python实现BT种子和磁力链接的相互转换
Nov 09 Python
老生常谈python之鸭子类和多态
Jun 13 Python
python+Splinter实现12306抢票功能
Sep 25 Python
对python的unittest架构公共参数token提取方法详解
Dec 17 Python
简单了解django索引的相关知识
Jul 17 Python
python实现获取单向链表倒数第k个结点的值示例
Oct 24 Python
tensorflow 环境变量设置方式
Feb 06 Python
关于多元线性回归分析——Python&SPSS
Feb 24 Python
Django使用echarts进行可视化展示的实践
Jun 10 Python
Python中enumerate函数代码解析
Oct 31 #Python
python数据类型判断type与isinstance的区别实例解析
Oct 31 #Python
python中requests库session对象的妙用详解
Oct 30 #Python
Python编程之黑板上排列组合,你舍得解开吗
Oct 30 #Python
Python数据结构与算法之列表(链表,linked list)简单实现
Oct 30 #Python
Python进程间通信之共享内存详解
Oct 30 #Python
import的本质解析
Oct 30 #Python
You might like
PHPMailer 中文使用说明小结
2010/01/22 PHP
php使用NumberFormatter格式化货币的方法
2015/03/21 PHP
PHP支付系统设计与典型案例分享
2016/08/02 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
2019/06/25 PHP
laravel-admin的多级联动方法
2019/09/30 PHP
基于Jquery的表格隔行换色,移动换色,点击换色插件
2010/12/22 Javascript
URL地址中的#符号使用说明
2011/02/12 Javascript
js编码之encodeURIComponent使用介绍(asp,php)
2012/03/01 Javascript
浅析js中取绝对值的2种方法
2013/07/09 Javascript
如何判断微信内置浏览器(通过User Agent实现)
2014/09/01 Javascript
javascript 实现map集合
2015/04/03 Javascript
JavaScript变量的作用域全解析
2015/08/14 Javascript
BootStrap智能表单实战系列(六)表单编辑页面的数据绑定
2016/06/13 Javascript
微信小程序使用第三方库Immutable.js实例详解
2016/09/27 Javascript
基于jquery二维码生成插件qrcode
2017/01/07 Javascript
详解Vue使用命令行搭建单页面应用
2017/05/24 Javascript
layer.open回调获取弹出层参数的实现方法
2019/09/10 Javascript
JavaScript实现留言板案例
2020/03/17 Javascript
Vue 组件复用多次自定义参数操作
2020/07/27 Javascript
微信小游戏中three.js离屏画布的示例代码
2020/10/12 Javascript
[04:22]DOTA2大事件之护国神翼
2020/08/14 DOTA
Python探索之ModelForm代码详解
2017/10/26 Python
python基础教程项目二之画幅好画
2018/04/02 Python
pygame游戏之旅 添加游戏介绍
2018/11/20 Python
python使用Thread的setDaemon启动后台线程教程
2020/04/25 Python
python如何输出反斜杠
2020/06/18 Python
Python配置pip国内镜像源的实现
2020/08/20 Python
全球性的在线时尚男装零售商:boohooMAN
2016/12/17 全球购物
德国户外商店:eXXpozed
2020/07/25 全球购物
简述索引存取方法的作用和建立索引的原则
2013/03/26 面试题
肯尼迪就职演说稿
2013/12/31 职场文书
经贸韩语专业大学生职业规划
2014/02/14 职场文书
酒店管理求职信
2014/06/09 职场文书
远程教育集中轮训基层干部培训班学习心得体会
2016/01/09 职场文书
Go 语言中 20 个占位符的整理
2021/10/16 Golang
一次线上mongo慢查询问题排查处理记录
2022/03/18 MongoDB