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将字符串转换成数组的方法
Apr 29 Python
Python的条件语句与运算符优先级详解
Oct 13 Python
全面了解Python环境配置及项目建立
Jun 30 Python
Python3如何解决字符编码问题详解
Apr 23 Python
python3 读写文件换行符的方法
Apr 09 Python
在Mac下使用python实现简单的目录树展示方法
Nov 01 Python
python 根据网易云歌曲的ID 直接下载歌曲的实例
Aug 24 Python
django配置app中的静态文件步骤
Mar 27 Python
Python3实现个位数字和十位数字对调, 其乘积不变
May 03 Python
python 抓取知乎指定回答下视频的方法
Jul 09 Python
健身房被搭讪?用python写了个小米计时器助人为乐
Jun 08 Python
Python之matplotlib绘制折线图
Apr 13 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
我的论坛源代码(五)
2006/10/09 PHP
ThinkPHP的URL重写问题
2014/06/22 PHP
php中explode的负数limit用法分析
2015/02/27 PHP
redis+php实现微博(一)注册与登录功能详解
2019/09/23 PHP
Jquery 的扩展方法总结
2011/10/01 Javascript
深入剖析JavaScript中的枚举功能
2014/03/06 Javascript
javascript中sort()的用法实例分析
2015/01/30 Javascript
javascript弹出带文字信息的提示框效果
2016/07/19 Javascript
jquery实现图片列表鼠标移入微动
2016/12/01 Javascript
解析预加载显示图片艺术
2016/12/05 Javascript
vue中v-cloak解决刷新或者加载出现闪烁问题(显示变量)
2018/04/20 Javascript
微信小程序使用template标签实现五星评分功能
2018/11/03 Javascript
关于JavaScript 数组你应该知道的事情(推荐)
2019/04/10 Javascript
关于Vue源码vm.$watch()内部原理详解
2019/04/26 Javascript
Node.js API详解之 tty功能与用法实例分析
2020/04/27 Javascript
Vue Render函数创建DOM节点代码实例
2020/07/08 Javascript
vue print.js打印支持Echarts图表操作
2020/11/13 Javascript
简单学习Python多进程Multiprocessing
2017/08/29 Python
Django基于ORM操作数据库的方法详解
2018/03/27 Python
python跳出双层for循环的解决方法
2019/06/24 Python
python的time模块和datetime模块实例解析
2019/11/29 Python
Python函数的默认参数设计示例详解
2019/12/01 Python
Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)
2020/02/17 Python
Python中使用filter过滤列表的一个小技巧分享
2020/05/02 Python
如何防止同一个帐户被多人同时登录
2013/08/01 面试题
应聘自荐信
2013/12/14 职场文书
电气工程及自动化专业自荐书范文
2013/12/18 职场文书
十佳大学生村官事迹
2014/01/09 职场文书
村捐赠仪式答谢词
2014/01/21 职场文书
个人贷款担保书
2014/04/01 职场文书
2014年文学毕业生自我鉴定
2014/04/23 职场文书
平安家庭示范户事迹
2014/06/02 职场文书
2014年英语教师工作总结
2014/12/03 职场文书
世界气象日活动总结
2015/02/27 职场文书
面试通知邮件
2015/04/20 职场文书
常住证明范本
2015/06/23 职场文书