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 相关文章推荐
MySQLdb ImportError: libmysqlclient.so.18解决方法
Aug 21 Python
Python开发常用的一些开源Package分享
Feb 14 Python
在Python中使用全局日志时需要注意的问题
May 06 Python
Python中DJANGO简单测试实例
May 11 Python
python多线程之事件Event的使用详解
Apr 27 Python
python tkinter图形界面代码统计工具(更新)
Sep 18 Python
Python中类似于jquery的pyquery库用法分析
Dec 02 Python
Python unittest 自动识别并执行测试用例方式
Mar 09 Python
jupyter notebook实现显示行号
Apr 13 Python
基于Python爬取fofa网页端数据过程解析
Jul 13 Python
Python selenium实现断言3种方法解析
Sep 08 Python
Python 里最强的地图绘制神器
Mar 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
Search Engine Friendly的URL设计
2006/10/09 PHP
PHP 图片上传代码
2011/09/13 PHP
php购物车实现代码
2011/10/10 PHP
基于initPHP的框架介绍
2013/04/18 PHP
php+mysqli使用面向对象方式查询数据库实例
2015/01/29 PHP
prototype Element学习笔记(篇二)
2008/10/26 Javascript
IE和firefox浏览器的event事件兼容性汇总
2009/12/06 Javascript
firefox下frameset取不到值的解决方法
2010/09/06 Javascript
jQuery表格插件ParamQuery简单使用方法示例
2013/12/05 Javascript
Javascript解析URL方法详解
2014/12/05 Javascript
jQuery 遍历函数详解
2015/07/05 Javascript
js实现网页多级级联菜单代码
2015/08/20 Javascript
jQuery实现模仿微博下拉滚动条加载数据效果
2015/12/25 Javascript
三种带箭头提示框总结实例
2016/06/14 Javascript
Highcharts学习之数据列
2016/08/03 Javascript
javascript 玩转Date对象(实例讲解)
2017/07/11 Javascript
详解使用路由延迟加载 Angular 模块
2017/10/12 Javascript
Three.js实现简单3D房间布局
2018/12/30 Javascript
[jQuery] 事件和动画详解
2019/03/05 jQuery
JavaScript的console命令使用实例
2019/12/03 Javascript
JavaScript本地储存:localStorage、sessionStorage、cookie的使用
2020/10/13 Javascript
Python 不同对象比较大小示例探讨
2014/08/21 Python
python实现搜索指定目录下文件及文件内搜索指定关键词的方法
2015/06/28 Python
Python 私有函数的实例详解
2017/09/11 Python
你眼中的Python大牛 应该都有这份书单
2017/10/31 Python
PyTorch线性回归和逻辑回归实战示例
2018/05/22 Python
python爬虫URL重试机制的实现方法(python2.7以及python3.5)
2018/12/18 Python
python自动保存百度盘资源到百度盘中的实例代码
2019/08/26 Python
如果NULL和0作为空指针常数是等价的,那我到底该用哪一个
2014/09/16 面试题
中专自我鉴定范文
2013/10/16 职场文书
美德少年事迹材料500字
2014/08/19 职场文书
运动会稿件100字
2014/09/24 职场文书
2014年保育员个人工作总结
2014/12/02 职场文书
2015年收银员个人工作总结
2015/04/01 职场文书
企业战略合作意向书
2015/05/08 职场文书
如何用RabbitMQ和Swoole实现一个异步任务系统
2021/05/29 PHP