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中请使用isinstance()判断变量类型
Aug 25 Python
python中pycurl库的用法实例
Sep 30 Python
10种检测Python程序运行时间、CPU和内存占用的方法
Apr 01 Python
Python中的sort()方法使用基础教程
Jan 08 Python
Python函数中参数是传递值还是引用详解
Jul 02 Python
python实现图片上添加图片
Nov 26 Python
tensorflow实现tensor中满足某一条件的数值取出组成新的tensor
Jan 04 Python
使用Keras加载含有自定义层或函数的模型操作
Jun 10 Python
记录模型训练时loss值的变化情况
Jun 16 Python
解决redis与Python交互取出来的是bytes类型的问题
Jul 16 Python
如何用Python编写一个电子考勤系统
Feb 08 Python
Python进程间的通信之语法学习
Apr 11 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替换超长文本中的特殊字符的函数代码
2012/05/22 PHP
关于PHP实现异步操作的研究
2013/02/03 PHP
Laravel框架学习笔记(一)环境搭建
2014/10/15 PHP
PHP is_array() 检测变量是否是数组的实现方法
2016/06/13 PHP
浅谈php(codeigniter)安全性注意事项
2017/04/06 PHP
javascript模拟select,jselect的方法实现
2012/11/08 Javascript
基于JavaScript实现继承机制之构造函数方法对象冒充的使用详解
2013/05/07 Javascript
textarea 控制输入字符字节数(示例代码)
2013/12/27 Javascript
javascript中setTimeout的问题解决方法
2014/05/08 Javascript
JS+JSP通过img标签调用实现静态页面访问次数统计的方法
2015/12/14 Javascript
JavaScript中setTimeout的那些事儿
2016/11/14 Javascript
Vue实现百度下拉提示搜索功能
2017/06/21 Javascript
es6学习之解构时应该注意的点
2017/08/29 Javascript
JS中实现隐藏部分姓名或者电话号码的代码
2018/07/17 Javascript
JS算法题之查找数字在数组中的索引位置
2019/05/15 Javascript
详解vue或uni-app的跨域问题解决方案
2020/02/21 Javascript
用Python设计一个经典小游戏
2017/05/15 Python
Python自动化运维之IP地址处理模块详解
2017/12/10 Python
Numpy 改变数组维度的几种方法小结
2018/08/02 Python
python 利用for循环 保存多个图像或者文件的实例
2018/11/09 Python
对Python Class之间函数的调用关系详解
2019/01/23 Python
详解Python连接MySQL数据库的多种方式
2019/04/16 Python
PyQt 实现使窗口中的元素跟随窗口大小的变化而变化
2019/06/18 Python
详解python 利用echarts画地图(热力图)(世界地图,省市地图,区县地图)
2019/08/06 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
2020/03/14 Python
python3 sleep 延时秒 毫秒实例
2020/05/04 Python
记一次django内存异常排查及解决方法
2020/08/07 Python
瑞士香水购物网站:Parfumcity.ch
2017/01/14 全球购物
个人自我评价分享
2013/12/20 职场文书
学生党支部先进事迹
2014/02/04 职场文书
理财学专业自荐书
2014/06/28 职场文书
竞选班干部演讲稿500字
2014/08/20 职场文书
离婚协议书该怎么写
2014/10/04 职场文书
小学师德师风整改措施
2014/10/27 职场文书
大学副班长竞选稿
2015/11/21 职场文书
HR必备:超全面的薪酬待遇管理方案!
2019/07/12 职场文书