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 专题三 字符串的基础知识
Mar 19 Python
python 连接sqlite及简单操作
Jun 30 Python
Python实现将Excel转换成xml的方法示例
Aug 25 Python
YUV转为jpg图像的实现
Dec 09 Python
Python魔法方法 容器部方法详解
Jan 02 Python
Python Tensor FLow简单使用方法实例详解
Jan 14 Python
Python求平面内点到直线距离的实现
Jan 19 Python
tensorflow模型转ncnn的操作方式
May 25 Python
Python自定义sorted排序实现方法详解
Sep 18 Python
python按照list中字典的某key去重的示例代码
Oct 13 Python
python实现磁盘日志清理的示例
Nov 05 Python
python制作抽奖程序代码详解
Jan 15 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/02/25 PHP
Javascript的闭包
2009/12/31 Javascript
js控制CSS样式属性语法对照表
2012/12/11 Javascript
JS图片切换的具体方法(带缩略图版)
2013/11/12 Javascript
jquery操作select详解(取值,设置选中)
2014/02/07 Javascript
javascript操作excel生成报表示例
2014/05/08 Javascript
Javascript基础教程之if条件语句
2015/01/18 Javascript
javascript中Array()数组函数详解
2015/08/23 Javascript
AngularJS 所有版本下载地址
2016/09/14 Javascript
JavaScript中的call和apply的用途以及区别
2017/01/11 Javascript
jquery如何实现点击空白处隐藏元素
2017/12/05 jQuery
JavaScript原型链与继承操作实例总结
2018/08/24 Javascript
微信小程序实现form表单本地储存数据
2019/06/27 Javascript
vue自定义表单生成器form-create使用详解
2019/07/19 Javascript
详解VUE中的插值( Interpolation)语法
2020/10/18 Javascript
400多行Python代码实现了一个FTP服务器
2012/05/10 Python
python3 shelve模块的详解
2017/07/08 Python
浅谈配置OpenCV3 + Python3的简易方法(macOS)
2018/04/02 Python
Python设计模式之外观模式实例详解
2019/01/17 Python
Pytorch中index_select() 函数的实现理解
2019/11/19 Python
Python 面向对象部分知识点小结
2020/03/09 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
2020/04/26 Python
Python性能分析工具py-spy原理用法解析
2020/07/27 Python
各大浏览器 CSS3 和 HTML5 兼容速查表 图文
2010/04/01 HTML / CSS
HTML5仿微信聊天界面、微信朋友圈实例代码
2018/01/29 HTML / CSS
Lee牛仔裤澳大利亚官网:美国著名牛仔裤品牌
2017/09/02 全球购物
自我鉴定的范文
2013/10/03 职场文书
关于保护环境的标语
2014/06/09 职场文书
2014国庆节主题活动方案:快乐的国庆节
2014/09/16 职场文书
学校领导班子四风问题整改意见
2014/10/02 职场文书
个人自查自纠材料
2014/10/14 职场文书
初中优秀学生评语
2014/12/29 职场文书
《少年闰土》教学反思
2016/02/18 职场文书
教你怎么用python爬取爱奇艺热门电影
2021/05/20 Python
mysql 数据插入优化方法之concurrent_insert
2021/07/01 MySQL
Mysql中mvcc各场景理解应用
2022/08/05 MySQL