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自动化测试工具Splinter简介和使用实例
May 13 Python
简单介绍Python的轻便web框架Bottle
Apr 08 Python
python实现txt文件格式转换为arff格式
May 31 Python
python开启debug模式的方法
Jun 27 Python
Python转换时间的图文方法
Jul 01 Python
Python秒算24点实现及原理详解
Jul 29 Python
python网络编程之多线程同时接受和发送
Sep 03 Python
python实现与redis交互操作详解
Apr 21 Python
使用Keras构造简单的CNN网络实例
Jun 29 Python
flask开启多线程的具体方法
Aug 02 Python
用python实现监控视频人数统计
May 21 Python
如何使用PyCharm及常用配置详解
Jun 03 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
PHP 组件化编程技巧
2009/06/06 PHP
PHP的加密方式及原理
2012/06/14 PHP
PHP @ at 记号的作用示例介绍
2014/10/10 PHP
php获取根域名方法汇总
2014/10/28 PHP
PDO::exec讲解
2019/01/28 PHP
PHP实现一个按钮点击上传多个图片操作示例
2020/01/23 PHP
通过JS来判断页面控件是否获取焦点
2014/01/03 Javascript
浅谈JavaScript中的Math.atan()方法的使用
2015/06/14 Javascript
jQuery 判断是否包含在数组中Array[]的方法
2016/08/03 Javascript
jQuery插件zTree实现更新根节点中第i个节点名称的方法示例
2017/03/08 Javascript
Bootstrap如何激活导航状态
2017/03/22 Javascript
Vue 2中ref属性的使用方法及注意事项
2017/06/12 Javascript
详解用vue.js和laravel实现微信支付
2017/06/23 Javascript
AngularJS监听ng-repeat渲染完成的两种方法
2018/01/16 Javascript
解决vuejs 使用value in list 循环遍历数组出现警告的问题
2018/09/26 Javascript
Vue一次性简洁明了引入所有公共组件的方法
2018/11/28 Javascript
layui下拉列表select实现可输入查找的方法
2019/09/28 Javascript
浅析VUE防抖与节流
2020/11/24 Vue.js
[46:14]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python获取单个程序CPU使用情况趋势图
2015/03/10 Python
用python写一个windows下的定时关机脚本(推荐)
2017/03/21 Python
Python矩阵常见运算操作实例总结
2017/09/29 Python
Python搜索引擎实现原理和方法
2017/11/27 Python
对python .txt文件读取及数据处理方法总结
2018/04/23 Python
Django框架模板注入操作示例【变量传递到模板】
2018/12/19 Python
解析Python的缩进规则的使用
2019/01/16 Python
python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)
2019/04/18 Python
Python玩转加密的技巧【推荐】
2019/05/13 Python
django中上传图片分页三级联动效果的实现代码
2019/08/30 Python
python爬虫添加请求头代码实例
2019/12/28 Python
Python实现微信表情包炸群功能
2021/01/28 Python
浅谈css3中的前缀
2016/07/20 HTML / CSS
英语教师个人总结
2015/02/09 职场文书
春节慰问信范文
2015/02/15 职场文书
Python中的嵌套循环详情
2022/03/23 Python
html原生table实现合并单元格以及合并表头的示例代码
2023/05/07 HTML / CSS