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 09 Python
跟老齐学Python之编写类之三子类
Oct 11 Python
Python使用email模块对邮件进行编码和解码的实例教程
Jul 01 Python
Python中不同进制的语法及转换方法分析
Jul 27 Python
Django实现快速分页的方法实例
Oct 22 Python
tensorflow入门之训练简单的神经网络方法
Feb 26 Python
Python 实现递归法解决迷宫问题的示例代码
Jan 12 Python
Python文件操作基础流程解析
Mar 19 Python
Python基于gevent实现高并发代码实例
May 15 Python
python如何代码集体右移
Jul 20 Python
python实现简单猜单词游戏
Dec 24 Python
python用tkinter开发的扫雷游戏
Jun 01 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的error_reporting错误级别变量对照表
2014/07/08 PHP
php实现webservice实例
2014/11/06 PHP
PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析
2016/10/11 PHP
javascript &&和||运算法的另类使用技巧
2009/11/28 Javascript
基于Jquery的$.cookie()实现跨越页面tabs导航实现代码
2011/03/03 Javascript
jquery 实现上下滚动效果示例代码
2013/08/09 Javascript
jquery 字符串切割函数substring的用法说明
2014/02/11 Javascript
node.js中的fs.statSync方法使用说明
2014/12/16 Javascript
Nodejs初级阶段之express
2015/11/23 NodeJs
javascript实现无缝上下滚动特效
2015/12/16 Javascript
JS模拟实现方法重载示例
2016/08/03 Javascript
webpack热模块替换(HMR)/热更新的方法
2018/04/05 Javascript
小程序云开发初探(小结)
2018/10/24 Javascript
用jQuery将JavaScript对象转换为querystring查询字符串的方法
2018/11/12 jQuery
Nuxt.js SSR与权限验证的实现
2018/11/21 Javascript
Bootstrap Paginator+PageHelper实现分页效果
2018/12/29 Javascript
微信小程序新手教程之页面打开数量限制
2019/03/03 Javascript
js数组中去除重复值的几种方法
2020/08/03 Javascript
vue axios封装httpjs,接口公用配置拦截操作
2020/08/11 Javascript
由Python运算π的值深入Python中科学计算的实现
2015/04/17 Python
实例探究Python以并发方式编写高性能端口扫描器的方法
2016/06/14 Python
Python enumerate函数功能与用法示例
2019/03/01 Python
python添加菜单图文讲解
2019/06/04 Python
Python中的单下划线和双下划线使用场景详解
2019/09/09 Python
Python 使用threading+Queue实现线程池示例
2019/12/21 Python
使用PyTorch实现MNIST手写体识别代码
2020/01/18 Python
opencv 图像加法与图像融合的实现代码
2020/07/08 Python
Python基于字典实现switch case函数调用
2020/07/22 Python
欧铁通票官方在线销售网站:Eurail.com
2017/10/14 全球购物
千禧酒店及度假村官方网站:Millennium Hotels and Resorts
2019/05/10 全球购物
中科软笔试题和面试题
2014/10/07 面试题
国家励志奖学金个人先进事迹材料
2014/05/04 职场文书
年终工作总结范文2014
2014/11/27 职场文书
英语邀请函范文
2015/02/02 职场文书
奥巴马开学演讲观后感
2015/06/12 职场文书
先进个人主要事迹怎么写
2015/11/04 职场文书