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中使用copy模块实现列表(list)拷贝
Apr 14 Python
Python基础语法(Python基础知识点)
Feb 28 Python
Python实现读取并保存文件的类
May 11 Python
PyTorch读取Cifar数据集并显示图片的实例讲解
Jul 27 Python
Python创建一个空的dataframe,并循环赋值的方法
Nov 08 Python
Python3.5实现的三级菜单功能示例
Mar 25 Python
Python Django 简单分页的实现代码解析
Aug 21 Python
windows中安装Python3.8.0的实现方法
Nov 19 Python
OpenCV图片漫画效果的实现示例
Aug 18 Python
Django model class Meta原理解析
Nov 14 Python
python 发送邮件的示例代码(Python2/3都可以直接使用)
Dec 03 Python
Python 如何利用ffmpeg 处理视频素材
Nov 27 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数组索引与键值操作技巧实例分析
2015/06/24 PHP
PHP加密解密函数详解
2015/10/28 PHP
laravel5.4生成验证码的实例讲解
2017/08/05 PHP
在laravel中实现ORM模型使用第二个数据库设置
2019/10/24 PHP
基于jQuery实现拖拽图标到回收站并删除功能
2015/11/25 Javascript
jquery移除了live()、die(),新版事件绑定on()、off()的方法
2016/10/26 Javascript
从零学习node.js之文件操作(三)
2017/02/21 Javascript
Bootstrap超大屏幕的实现代码
2017/03/22 Javascript
Angular2.js实现表单验证详解
2017/06/23 Javascript
JavaScript中附件预览功能实现详解(推荐)
2017/08/15 Javascript
JS分页的实现(同步与异步)
2017/09/16 Javascript
ES6 javascript中class类的get与set用法实例分析
2017/10/30 Javascript
微信小程序实现分享到朋友圈功能
2018/07/19 Javascript
[01:00:25]2018DOTA2亚洲邀请赛3月30日 小组赛A组 VG VS Liquid
2018/03/31 DOTA
Python基于回溯法子集树模板实现8皇后问题
2017/09/01 Python
python hook监听事件详解
2018/10/25 Python
在python2.7中用numpy.reshape 对图像进行切割的方法
2018/12/05 Python
DES加密解密算法之python实现版(图文并茂)
2018/12/06 Python
python rsync服务器之间文件夹同步脚本
2019/08/29 Python
python3 简单实现组合设计模式
2020/07/02 Python
带有css3动画效果的兼容多浏览器简单导航条示例
2014/01/26 HTML / CSS
使用html5实现表格实现标题合并的实例代码
2019/05/13 HTML / CSS
Elemental Herbology官网:英国美容品牌
2019/04/27 全球购物
adidas爱尔兰官方网站:阿迪达斯运动鞋和运动服
2019/11/01 全球购物
丝芙兰意大利官方网站:Sephora.it
2019/12/13 全球购物
酒店管理专业毕业生推荐信
2013/11/10 职场文书
清华大学自主招生自荐信
2014/01/29 职场文书
国际贸易毕业生求职信范文
2014/02/21 职场文书
自动一体化专业求职信
2014/03/15 职场文书
社区活动总结报告
2014/05/05 职场文书
计算机毕业生求职信
2014/06/10 职场文书
办护照工作证明
2014/10/01 职场文书
2014年行政助理工作总结
2014/11/19 职场文书
2015年保洁员工作总结
2015/05/04 职场文书
投诉信回复范文
2015/07/03 职场文书
python基础之文件处理知识总结
2021/05/23 Python