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中的yield浅析
Jun 16 Python
Python获取电脑硬件信息及状态的实现方法
Aug 29 Python
Python常用知识点汇总
May 08 Python
python结合selenium获取XX省交通违章数据的实现思路及代码
Jun 26 Python
python设计模式大全
Jun 27 Python
python模块简介之有序字典(OrderedDict)
Dec 01 Python
Python获取当前路径实现代码
May 08 Python
Python机器学习之K-Means聚类实现详解
Feb 22 Python
django ajax json的实例代码
May 29 Python
Django框架登录加上验证码校验实现验证功能示例
May 23 Python
Python Scrapy框架:通用爬虫之CrawlSpider用法简单示例
Apr 11 Python
python爬虫之selenium库的安装及使用教程
May 23 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
抓取YAHOO股票报价的类
2009/05/15 PHP
简单的php数据库操作类代码(增,删,改,查)
2013/04/08 PHP
VIM中设置php自动缩进为4个空格的方法详解
2013/06/14 PHP
火狐textarea输入法的bug的触发及解决
2013/07/24 Javascript
什么是Node.js?Node.js详细介绍
2014/06/01 Javascript
JQuery中serialize() 序列化
2015/03/13 Javascript
javascript事件委托的方式绑定详解
2015/06/10 Javascript
ajax如何实现页面局部跳转与结果返回
2015/08/24 Javascript
jquery基于layui实现二级联动下拉选择(省份城市选择)
2017/06/20 jQuery
JS 组件系列之Bootstrap Table的冻结列功能彻底解决高度问题
2017/06/30 Javascript
详解基于node的前端项目编译时内存溢出问题
2017/08/01 Javascript
Vue实现typeahead组件功能(非常靠谱)
2017/08/26 Javascript
angular 数据绑定之[]和{{}}的区别
2018/09/25 Javascript
vue-router权限控制(简单方式)
2018/10/29 Javascript
js使用Promise实现简单的Ajax缓存
2018/11/14 Javascript
图片文字识别(OCR)插件Ocrad.js教程
2018/11/26 Javascript
node实现socket链接与GPRS进行通信的方法
2019/05/20 Javascript
python命令行参数sys.argv使用示例
2014/01/28 Python
python使用arp欺骗伪造网关的方法
2015/04/24 Python
浅谈Python中的私有变量
2018/02/28 Python
CentOS7下python3.7.0安装教程
2018/07/30 Python
win10系统下Anaconda3安装配置方法图文教程
2018/09/19 Python
python 中的列表生成式、生成器表达式、模块导入
2019/06/19 Python
python 爬虫 实现增量去重和定时爬取实例
2020/02/28 Python
解决django中form表单设置action后无法回到原页面的问题
2020/03/13 Python
使用tensorflow根据输入更改tensor shape
2020/06/23 Python
用60行代码实现Python自动抢微信红包
2021/02/04 Python
python爬虫如何解决图片验证码
2021/02/14 Python
浅谈cookie和localStorage那些事
2019/08/27 HTML / CSS
欧洲领先的火车票和大巴票预订平台:Trainline
2018/12/26 全球购物
校本教研工作方案
2014/01/14 职场文书
乡镇信息公开实施方案
2014/03/23 职场文书
讲文明知礼仪演讲稿
2014/09/13 职场文书
党员批评与自我批评思想汇报(集锦)
2014/09/14 职场文书
民事赔偿协议书
2014/11/02 职场文书
慰问信的写作格式及范文!
2019/06/24 职场文书