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中的WSGI接口
May 11 Python
Python中str is not callable问题详解及解决办法
Feb 10 Python
python中lambda()的用法
Nov 16 Python
python代码实现ID3决策树算法
Dec 20 Python
matplotlib给子图添加图例的方法
Aug 03 Python
python之super的使用小结
Aug 13 Python
关于Python 的简单栅格图像边界提取方法
Jul 05 Python
numpy中的meshgrid函数的使用
Jul 31 Python
python实现最大优先队列
Aug 29 Python
Python 经典算法100及解析(小结)
Sep 13 Python
实现ECharts双Y轴左右刻度线一致的例子
May 16 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
Mar 03 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
WampServer下安装多个版本的PHP、mysql、apache图文教程
2015/01/07 PHP
php可应用于面包屑导航的递归寻找家谱树实现方法
2015/02/02 PHP
PHP多维数组转一维数组的简单实现方法
2015/12/23 PHP
Yii视图操作之自定义分页实现方法
2016/07/14 PHP
PHP实现的折半查询算法示例
2017/10/09 PHP
PHP如何解决微信文章图片防盗链
2020/12/09 PHP
javascript操作文本框readOnly
2007/05/15 Javascript
php实例分享之实现显示网站运行时间
2014/05/20 Javascript
两种方法基于jQuery实现IE浏览器兼容placeholder效果
2014/10/14 Javascript
javascript实现回到顶部特效
2015/05/06 Javascript
使用jquery.qrcode.min.js实现中文转化二维码
2016/03/11 Javascript
js中 计算两个日期间的工作日的简单实例
2016/08/08 Javascript
关于Jquery中的bind(),on()绑定事件方式总结
2016/10/26 Javascript
Thinkjs3新手入门之添加一个新的页面
2017/12/06 Javascript
jQuery 实现左右两侧菜单添加、移除功能
2018/01/02 jQuery
jquery将json转为数据字典的实例代码
2019/10/11 jQuery
Vue3项目打包后部署到服务器 请求不到后台接口解决方法
2020/02/06 Javascript
vue实现简易图片左右旋转,上一张,下一张组件案例
2020/07/31 Javascript
python单链表实现代码实例
2013/11/21 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
2018/02/11 Python
python实现数据库跨服务器迁移
2018/04/12 Python
详解django+django-celery+celery的整合实战
2019/03/19 Python
美国新蛋IT数码商城:Newegg.com
2016/07/21 全球购物
L’urv官网:精品女性运动服品牌
2019/07/07 全球购物
行政办公员自我评价分享
2013/12/14 职场文书
家具厂厂长岗位职责
2014/01/01 职场文书
《临死前的严监生》教学反思
2014/02/13 职场文书
代理协议书
2014/04/22 职场文书
作文评语集锦大全
2014/04/23 职场文书
项目经理任命书
2014/06/04 职场文书
测控技术自荐信
2014/06/05 职场文书
2014年高中生自我评价范文
2014/09/26 职场文书
2015年科学教研组工作总结
2015/07/22 职场文书
大学生受助感言
2015/08/01 职场文书
如何利用 CSS Overview 面板重构优化你的网站
2021/10/24 HTML / CSS
Python使用DFA算法过滤内容敏感词
2022/04/22 Python