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基础教程之基本数据类型和变量声明介绍
Aug 29 Python
Python中如何获取类属性的列表
Dec 26 Python
Python学习小技巧之列表项的推导式与过滤操作
May 20 Python
python实现自动发送邮件
Jun 20 Python
Django实现一对多表模型的跨表查询方法
Dec 18 Python
selenium+PhantomJS爬取豆瓣读书
Aug 26 Python
详解Python list和numpy array的存储和读取方法
Nov 06 Python
使用python快速在局域网内搭建http传输文件服务的方法
Nov 14 Python
使用python实现回文数的四种方法小结
Nov 24 Python
python 基于opencv去除图片阴影
Jan 26 Python
Python获取百度热搜的完整代码
Apr 07 Python
Python基础之变量的相关知识总结
Jun 23 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中的日期处理方法集锦
2007/01/02 PHP
备份mysql数据库的php代码(一个表一个文件)
2010/05/28 PHP
php顺序查找和二分查找示例
2014/03/27 PHP
php简单的上传类分享
2016/05/15 PHP
javascript import css实例代码
2008/07/18 Javascript
javascript fullscreen全屏实现代码
2009/04/09 Javascript
js实现可折叠展开的手风琴菜单效果
2015/09/07 Javascript
JavaScript仿商城实现图片广告轮播实例代码
2016/02/06 Javascript
微信小程序 教程之注册程序
2016/10/17 Javascript
ES6中Symbol类型用法实例详解
2017/04/06 Javascript
JS实现加载时锁定HTML页面元素的方法
2017/06/24 Javascript
jQuery 实现鼠标画框并对框内数据选中的实例代码
2017/08/29 jQuery
NodeJS爬虫实例之糗事百科
2017/12/14 NodeJs
jquery+css3实现熊猫tv导航代码分享
2018/02/12 jQuery
基于express中路由规则及获取请求参数的方法
2018/03/12 Javascript
Vue.js组件高级特性实例详解
2018/12/24 Javascript
微信小程序实现圆形进度条动画
2020/11/18 Javascript
JavaScript 面向对象程序设计详解【类的创建、实例对象、构造函数、原型等】
2020/05/12 Javascript
python比较两个列表大小的方法
2015/07/11 Python
Python计算斗牛游戏概率算法实例分析
2017/09/26 Python
利用Hyperic调用Python实现进程守护
2018/01/02 Python
对python判断ip是否可达的实例详解
2019/01/31 Python
python实现本地批量ping多个IP的方法示例
2019/08/07 Python
python中wheel的用法整理
2020/06/15 Python
Python Unittest原理及基本使用方法
2020/11/06 Python
PyCharm 光标变成黑块的解决方式
2021/02/06 Python
家长对孩子评语
2014/01/30 职场文书
三年级小学生评语
2014/04/22 职场文书
街道社区活动报告
2015/02/05 职场文书
作弊检讨书范文
2015/05/06 职场文书
2015小学教师年度工作总结
2015/05/12 职场文书
安全守法证明
2015/06/23 职场文书
解除合同协议书范本
2016/03/21 职场文书
Java使用jmeter进行压力测试
2021/07/09 Java/Android
windows10声卡驱动怎么安装?win10声卡驱动安装操作步骤教程
2022/08/05 数码科技
python+pyhyper实现识别图片中的车牌号思路详解
2022/12/24 Python