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的迭代器和生成器使用实例
Jan 14 Python
利用一个简单的例子窥探CPython内核的运行机制
Mar 30 Python
利用Python绘制数据的瀑布图的教程
Apr 07 Python
Python简单实现子网掩码转换的方法
Apr 13 Python
Windows安装Python、pip、easy_install的方法
Mar 05 Python
Python简单操作sqlite3的方法示例
Mar 22 Python
Python基于递归算法实现的走迷宫问题
Aug 04 Python
在python image 中安装中文字体的实现方法
Aug 22 Python
python多继承(钻石继承)问题和解决方法简单示例
Oct 21 Python
python判断正负数方式
Jun 03 Python
基于python模拟TCP3次握手连接及发送数据
Nov 06 Python
python脚本框架webpy模板控制结构
Nov 20 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转成EXE文件
2006/10/09 PHP
php调用nginx的mod_zip模块打包ZIP文件
2014/06/11 PHP
WAF的正确bypass
2017/01/05 PHP
PHP判断数组是否为空的常用方法(五种方法)
2017/02/08 PHP
解决Laravel 使用insert插入数据,字段created_at为0000的问题
2019/10/11 PHP
js window.onload 加载多个函数的方法
2009/11/02 Javascript
javascript编码的几个方法详细介绍
2013/01/06 Javascript
当自定义数据属性为json格式字符串时jQuery的data api问题探讨
2013/02/18 Javascript
Js注册协议倒计时的小例子
2013/06/24 Javascript
JQuery设置获取下拉菜单某个选项的值(比较全)
2014/08/05 Javascript
浅析AngularJS中的指令
2016/03/20 Javascript
酷炫jQuery全屏3D焦点图动画效果
2016/03/22 Javascript
jQuery 中的 DOM 操作
2016/04/26 Javascript
Bootstrap每天必学之模态框(Modal)插件
2016/04/26 Javascript
老生常谈angularjs中的$state.go
2017/04/24 Javascript
angularjs实现天气预报功能
2020/06/16 Javascript
微信小程序url传参写变量的方法
2018/08/09 Javascript
vue-cli 为项目设置别名的方法
2019/10/15 Javascript
JavaScript前端实现压缩图片功能
2020/03/06 Javascript
echarts实现获取datazoom的起始值(包括x轴和y轴)
2020/07/20 Javascript
Python警察与小偷的实现之一客户端与服务端通信实例
2014/10/09 Python
python fabric实现远程部署
2017/01/05 Python
json跨域调用python的方法详解
2017/01/11 Python
python输入错误密码用户锁定实现方法
2017/11/27 Python
对numpy数据写入文件的方法讲解
2018/07/09 Python
Python字符编码转码之GBK,UTF8互转
2020/02/09 Python
python中查看.db文件中表格的名字及表格中的字段操作
2020/07/07 Python
python 通过exifread读取照片信息
2020/12/24 Python
CSS3 选择器 属性选择器介绍
2012/01/21 HTML / CSS
波兰快递服务:Globkurier.pl
2019/11/08 全球购物
美国乒乓球设备、配件和服装品牌:Killerspin
2020/06/07 全球购物
银行员工犯错检讨书
2014/09/16 职场文书
色戒观后感
2015/06/12 职场文书
初中历史教学反思
2016/02/19 职场文书
导游词之西安骊山
2019/12/03 职场文书
Java并发编程必备之Future机制
2021/06/30 Java/Android