python 网络编程详解及简单实例


Posted in Python onApril 25, 2017

python 网络编程详解

网络编程的专利权应该属于Unix,各个平台(如windows、Linux等)、各门语言(C、C++、Python、Java等)所实现的符合自身特性的语法都大同小异。在我看来,懂得了Unix的socket网络编程,其他的形式的网络编程方法也就知道了。这句话说得还不太严谨。准确的应该说成懂得了socket编程的原理,网络编程也就知道了,不同之处就在于每个平台,每个语言都有自己专享的语法,我们直接灵活套用就行了。

下面是用python实现的最基本的网络编程的例子,即依托于客户端-服务器的架构,实现客户端与服务器之间的单向“数据流通”。我们分别用两个方法来实现,一个方法是最原始的socket编程,另一个方法是利用python的面向对象对第一种方法进行封装实现,目的是减少实现透明性,便于快速开发。

要求:客户端输入数据,发送到服务端,服务器端生成(时间戳+数据)的封装数据回应客户端。由于socket编程包括两种:面向连接的和无连接的,这两种分别对应TCP数据流和UDP数据报文。所以,我们两种方法都进行实现。

一、Python socket编程

面向连接的TCP socket编程:

# -*- coding: utf-8 -*-
 3 from socket import *
from time import ctime 

# Address and Port
HOST = ''
PORT = 21567
ADDR = (HOST, PORT)

# BuffSize
BUFSIZ = 1024

# build socket
tcpSerSock = socket(AF_INET, SOCK_STREAM)
# bind socket
tcpSerSock.bind(ADDR)
# listen 5 client 
tcpSerSock.listen(5)

try:
  while True:
    print 'waiting for connection...'
    # build client socket
    tcpCliSock, addr = tcpSerSock.accept()
    print '...connect from:', addr

    # accept data and process
    while True:
      data = tcpCliSock.recv(BUFSIZ)
      if not data:
        break
      tcpCliSock.send('[%s] %s' % (ctime(), data))

      # close client socket 
      tcpCliSock.close()
except EOFError, KeyboardInterrupt:
  tcpSerSock.close()
# -*- coding:utf-8 -*-

from socket import *

# Address and Port 
HOST = '127.0.0.1'
PORT = 21567
ADDR = (HOST, PORT)

# BufferSize
BUFSIZ = 1024

#build socket 
tcpCliSocket = socket(AF_INET, SOCK_STREAM)
tcpCliSocket.connect(ADDR)

while True:
  data = raw_input('> ')
  if not data:
    break
  # send data
  tcpCliSocket.send(data)
  # recv data
  data = tcpCliSocket.recv(BUFSIZ)
  if not data:
    break
  # show data
  print data
tcpCliSocket.close()

无连接的UDP socket编程

# -*- coding: utf-8 -*-

from socket import *
from time import ctime 

# Address and Port 
HOST = ''
PORT = 8000
ADDR = (HOST, PORT)

# BufferSize
BUFFSIZE = 1024
# build socket
udpSerSock = socket(AF_INET, SOCK_DGRAM)
# bind socket
udpSerSock.bind(ADDR)

try:
  while True:
    print 'waiting the message...'
    data, addr = udpSerSock.recvfrom(BUFFSIZE)
    print 'received the message: '+data+' from: ', addr
    udpSerSock.sendto('[%s] %s' % (ctime(), data), addr)
except EOFError, KeyboardInterrupt:
  udpSerSock.close()
# -*- coding: utf-8 -*-

from socket import *

# Address and Port 
HOST = 'localhost'
PORT = 8000
ADDR = (HOST, PORT)

# BufferSize
BUFSIZ = 1024

# build socket 
udpCliSock = socket(AF_INET, SOCK_DGRAM)

while True:
  data = raw_input('> ')
  udpCliSock.sendto(data, ADDR)
  data = udpCliSock.recvfrom(BUFSIZ)
  if not data:
    break
  print data 
udpCliSock.close()

二、基于封装类SocketServer的网络编程

# -*- coding: utf-8 -*-

from SocketServer import TCPServer as TCP, StreamRequestHandler as SRH 
from time import ctime 

# Address and Port
HOST = ''
PORT = 21567
ADDR = (HOST, PORT)

# BuffSize
BUFSIZ = 1024

# build RequestHandler
class MyRequestHandler(SRH):
  def handle(self):
    print '...connected from: ', self.client_address
    self.wfile.write('[%s] %s' % (ctime(), self.rfile.readline()))

# build TCPServer
TCPServ = TCP(ADDR, MyRequestHandler)
print 'waiting for connection...'
# loop to process
TCPServ.serve_forever()
# -*- coding:utf-8 -*-

from socket import *

# Address and Port 
HOST = '127.0.0.1'
PORT = 21567
ADDR = (HOST, PORT)

# BufferSize
BUFSIZ = 1024

while True:
  # note: SocketServer 的请求处理器的默认行为是接受连接,
  # 得到请求,然后就关闭连接,所以需要多次连接
  tcpCliSock = socket(AF_INET, SOCK_STREAM)
  tcpCliSock.connect(ADDR)

  # process data
  data = raw_input('> ')
  if not data:
    break
  tcpCliSock.send('%s\r\n' % data)

  data = tcpCliSock.recv(BUFSIZ)
  if not data:
    break
  print data.strip()
  tcpCliSock.close()

感谢阅读,希望能帮助大家,谢谢大家对本站的支持!

Python 相关文章推荐
python测试驱动开发实例
Oct 08 Python
10个易被忽视但应掌握的Python基本用法
Apr 01 Python
python使用append合并两个数组的方法
Apr 28 Python
Python标准库sched模块使用指南
Jul 06 Python
利用selenium 3.7和python3添加cookie模拟登陆的实现
Nov 20 Python
修复CentOS7升级Python到3.6版本后yum不能正确使用的解决方法
Jan 26 Python
使用python Fabric动态修改远程机器hosts的方法
Oct 26 Python
PyQt5 实现给窗口设置背景图片的方法
Jun 13 Python
Python3批量移动指定文件到指定文件夹方法示例
Sep 02 Python
实现ECharts双Y轴左右刻度线一致的例子
May 16 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
Sep 14 Python
python 实现图片裁剪小工具
Feb 02 Python
python 全文检索引擎详解
Apr 25 #Python
window下eclipse安装python插件教程
Apr 24 #Python
Python处理PDF及生成多层PDF实例代码
Apr 24 #Python
python爬虫框架scrapy实战之爬取京东商城进阶篇
Apr 24 #Python
python爬虫实战之爬取京东商城实例教程
Apr 24 #Python
python中urllib.unquote乱码的原因与解决方法
Apr 24 #Python
Python面向对象特殊成员
Apr 24 #Python
You might like
php中的静态变量的基本用法
2014/03/20 PHP
php实现Session存储到Redis
2015/11/11 PHP
在laravel中使用Symfony的Crawler组件分析HTML
2017/06/19 PHP
jquery api参考 visualjquery 中国线路 速度快
2007/11/30 Javascript
判断脚本加载是否完成的方法
2009/05/26 Javascript
JSON 入门指南 想了解json的朋友可以看下
2009/08/26 Javascript
window.location.reload()方法刷新页面弹出要再次显示该网页对话框
2013/04/24 Javascript
document.getElementById获取控件对象为空的解决方法
2013/11/20 Javascript
jquery基础教程之数组使用详解
2014/03/10 Javascript
jQuery控制div实现随滚动条滚动效果
2016/06/07 Javascript
js将table的每个td的内容自动赋值给其title属性的方法
2016/10/13 Javascript
Angular.js中用ng-repeat-start实现自定义显示
2016/10/18 Javascript
解决vue 按钮多次点击重复提交数据问题
2018/05/10 Javascript
详解easyui基于 layui.laydate日期扩展组件
2018/07/18 Javascript
JS中注入eval, Function等系统函数截获动态代码
2019/04/03 Javascript
JavaScript实现无限轮播效果
2020/11/19 Javascript
python将多个文本文件合并为一个文本的代码(便于搜索)
2011/03/13 Python
零基础学Python(一)Python环境安装
2014/08/20 Python
在Python中操作时间之mktime()方法的使用教程
2015/05/22 Python
Python 读写文件和file对象的方法(推荐)
2016/09/12 Python
Python实现判断并移除列表指定位置元素的方法
2018/04/13 Python
对Python中Iterator和Iterable的区别详解
2018/10/18 Python
python 自定义装饰器实例详解
2019/07/20 Python
python 计算两个列表的相关系数的实现
2019/08/29 Python
Python代理IP爬虫的新手使用教程
2019/09/05 Python
法国发饰品牌:Alexandre De Paris
2018/12/04 全球购物
美国美食礼品篮网站:Gourmet Gift Baskets
2019/12/15 全球购物
网络工程专业毕业生推荐信
2013/10/28 职场文书
房产销售经理职责
2013/12/20 职场文书
高中毕业生自我鉴定例文
2013/12/29 职场文书
经济管理毕业生求职信
2014/03/15 职场文书
优秀驾驶员先进事迹材料
2014/05/04 职场文书
教师党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
2015教师年度思想工作总结
2015/04/30 职场文书
家长反馈意见及建议
2015/06/03 职场文书
小学毕业感言100字
2015/07/30 职场文书