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 设置文件编码格式的实现方法
Dec 21 Python
Python pymongo模块用法示例
Mar 31 Python
python与caffe改变通道顺序的方法
Aug 04 Python
详解python中TCP协议中的粘包问题
Mar 22 Python
Python实现FLV视频拼接功能
Jan 21 Python
解决Python图形界面中设置尺寸的问题
Mar 05 Python
Python3 filecmp模块测试比较文件原理解析
Mar 23 Python
python爬虫数据保存到mongoDB的实例方法
Jul 28 Python
基于Python的一个自动录入表格的小程序
Aug 05 Python
Python requests上传文件实现步骤
Sep 15 Python
用Python 执行cmd命令
Dec 18 Python
对Keras自带Loss Function的深入研究
May 25 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
世界上第一台立体声收音机
2021/03/01 无线电
php 连接mssql数据库 初学php笔记
2010/03/01 PHP
php xhprof使用实例详解
2019/04/15 PHP
修改Laravel自带的认证系统的User类的命名空间的步骤
2019/10/15 PHP
JavaScript判断两种格式的输入日期的正确性的代码
2007/03/25 Javascript
JavaScript中yield实用简洁实现方式
2010/06/12 Javascript
神奇的7个jQuery 3D插件整理
2011/01/06 Javascript
一个基于jquery的文本框记数器
2012/09/19 Javascript
基于JQuery模仿苹果桌面的Dock效果(初级版)
2012/10/15 Javascript
JS实现的4种数字千位符格式化方法分享
2015/03/02 Javascript
简介JavaScript中valueOf()方法的使用
2015/06/05 Javascript
JavaScript中join()方法的使用简介
2015/06/09 Javascript
Bootstrap每天必学之表单
2015/11/23 Javascript
移动端 一个简单易懂的弹出框
2016/07/06 Javascript
DOM操作原生js 的bug,使用jQuery 可以消除的解决方法
2016/09/04 Javascript
jQuery通过ajax方法获取json数据不执行success的原因及解决方法
2016/10/15 Javascript
详解ECharts使用心得总结
2016/12/06 Javascript
利用select实现年月日三级联动的日期选择效果【推荐】
2016/12/13 Javascript
JS+CSS实现下拉刷新/上拉加载插件
2017/03/31 Javascript
vue-cli 3 全局过滤器的实例代码详解
2019/06/03 Javascript
vue商城中商品“筛选器”功能的实现代码
2020/07/01 Javascript
[01:56]《DOTA2》中文配音CG
2013/04/22 DOTA
Python专用方法与迭代机制实例分析
2014/09/15 Python
使用rpclib进行Python网络编程时的注释问题
2015/05/06 Python
在Python中获取两数相除的商和余数方法
2018/11/10 Python
python 在指定范围内随机生成不重复的n个数实例
2019/01/28 Python
利用Python实现手机短信监控通知的方法
2019/07/22 Python
python时间日期操作方法实例小结
2020/02/06 Python
电信专业毕业生推荐信
2013/11/18 职场文书
秋季运动会稿件
2014/01/30 职场文书
公立医院改革实施方案
2014/03/14 职场文书
企业党建工作汇报材料
2014/08/19 职场文书
夫妻分居协议书范本(有子女版)
2014/11/01 职场文书
2015年幼儿园后勤工作总结
2015/04/25 职场文书
酒店员工手册范本
2015/05/14 职场文书
Golang: 内建容器的用法
2021/05/05 Golang