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从ftp下载数据保存实例
Nov 20 Python
使用python实现拉钩网上的FizzBuzzWhizz问题示例
May 05 Python
Python random模块常用方法
Nov 03 Python
分享给Python新手们的几道简单练习题
Sep 21 Python
Python中的Django基本命令实例详解
Jul 15 Python
详解用python写一个抽奖程序
May 10 Python
PyQt 实现使窗口中的元素跟随窗口大小的变化而变化
Jun 18 Python
Python 的字典(Dict)是如何存储的
Jul 05 Python
基于python进行抽样分布描述及实践详解
Sep 02 Python
使用 Python 遍历目录树的方法
Feb 29 Python
Python selenium抓取虎牙短视频代码实例
Mar 02 Python
Python之字典对象的几种创建方法
Sep 30 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检测useragent版本示例
2014/03/24 PHP
从零开始学YII2框架(四)扩展插件yii2-kartikgii
2014/08/20 PHP
PHP调用wsdl文件类型的接口代码分享
2014/11/19 PHP
mouse_on_title.js
2006/08/25 Javascript
jquery select(列表)的操作(取值/赋值)
2009/08/06 Javascript
Extjs中DisplayField的日期或者数字格式化扩展
2010/09/03 Javascript
Struts2的s:radio标签使用及用jquery添加change事件
2013/04/08 Javascript
javascript操作referer详细解析
2014/03/10 Javascript
jQuery实现的AJAX简单弹出层效果代码
2015/11/26 Javascript
js面向对象的写法
2016/02/19 Javascript
js实现统计字符串中特定字符出现个数的方法
2016/08/02 Javascript
js 创建对象 经典模式全面了解
2016/08/16 Javascript
详解Vue微信公众号开发踩坑全记录
2017/08/21 Javascript
JAVA面试题 static关键字详解
2019/07/16 Javascript
Vue路由管理器Vue-router的使用方法详解
2020/02/05 Javascript
在Python中处理字符串之isdecimal()方法的使用
2015/05/20 Python
python实现查找两个字符串中相同字符并输出的方法
2015/07/11 Python
Python编程之event对象的用法实例分析
2017/03/23 Python
python实现在IDLE中输入多行的方法
2018/04/19 Python
使用Fabric自动化部署Django项目的实现
2019/09/27 Python
Django 实现xadmin后台菜单改为中文
2019/11/15 Python
Pytorch 定义MyDatasets实现多通道分别输入不同数据方式
2020/01/15 Python
python爬取本站电子书信息并入库的实现代码
2020/01/20 Python
django haystack实现全文检索的示例代码
2020/06/24 Python
Python3.7安装PyQt5 运行配置Pycharm的详细教程
2020/10/15 Python
美国知名玩具品牌:Melissa & Doug
2016/08/16 全球购物
SportsDirect.com马来西亚:英国第一体育零售商
2018/11/21 全球购物
Order by的几种用法
2013/06/16 面试题
医院门卫岗位职责
2013/12/30 职场文书
中文专业毕业生自荐书范文
2014/01/04 职场文书
家教广告词
2014/03/19 职场文书
2014年党员公开承诺践诺书
2014/03/25 职场文书
2014年辅导员工作总结
2014/11/18 职场文书
2014年化妆品销售工作总结
2014/12/01 职场文书
农村党支部承诺书
2015/04/30 职场文书
社会实践心得体会范文
2016/01/14 职场文书