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的字节编译详解
Sep 20 Python
python list删除元素时要注意的坑点分享
Apr 18 Python
Python3使用turtle绘制超立方体图形示例
Jun 19 Python
对numpy数据写入文件的方法讲解
Jul 09 Python
PowerBI和Python关于数据分析的对比
Jul 11 Python
Python的log日志功能及设置方法
Jul 11 Python
python移位运算的实现
Jul 15 Python
10个Python面试常问的问题(小结)
Nov 20 Python
使用Django和Postgres进行全文搜索的实例代码
Feb 13 Python
Django中的session用法详解
Mar 09 Python
Python内存泄漏和内存溢出的解决方案
Sep 26 Python
opencv深入浅出了解机器学习和深度学习
Mar 17 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
简单的页面缓冲技术
2006/10/09 PHP
TP5(thinkPHP5)框架基于ajax与后台数据交互操作简单示例
2018/09/03 PHP
自制轻量级仿jQuery.boxy对话框插件代码
2010/10/26 Javascript
javascript定时保存表单数据的代码
2011/03/17 Javascript
Javascript学习笔记-详解in运算符
2011/09/13 Javascript
常用Extjs工具:Extjs.util.Format使用方法
2012/03/22 Javascript
根据表格中的某一列进行排序的javascript代码
2013/11/29 Javascript
[原创]Javascript 实现广告后加载 可加载百度谷歌联盟广告
2016/05/11 Javascript
利用纯Vue.js构建Bootstrap组件
2016/11/03 Javascript
selenium 与 chrome 进行qq登录并发邮件操作实例详解
2017/04/06 Javascript
jQuery使用zTree插件实现可拖拽的树示例
2017/09/23 jQuery
jQuery中ajax获取数据赋值给页面的实例
2017/12/31 jQuery
nodejs使用http模块发送get与post请求的方法示例
2018/01/08 NodeJs
vue3.0 CLI - 1 - npm 安装与初始化的入门教程
2018/09/14 Javascript
浅谈angular表单提交中ng-submit的默认使用方法
2018/09/30 Javascript
JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例
2018/12/14 Javascript
websocket4.0+typescript 实现热更新的方法
2019/08/14 Javascript
[01:43]倾听DOTA2英雄之声 魅惑魔女国服配音鉴赏
2013/06/06 DOTA
Python中扩展包的安装方法详解
2017/06/14 Python
Python处理命令行参数模块optpars用法实例分析
2018/05/31 Python
Python selenium根据class定位页面元素的方法
2019/02/26 Python
python opencv图片编码为h264文件的实例
2019/12/12 Python
python numpy库linspace相同间隔采样的实现
2020/02/25 Python
python实现爱奇艺登陆密码RSA加密的方法示例详解
2020/05/27 Python
如何利用Python matplotlib绘制雷达图
2020/12/21 Python
会计工作心得体会
2014/01/13 职场文书
学生会个人自荐书范文
2014/02/12 职场文书
党员承诺书怎么写
2014/05/20 职场文书
学校安全防火方案
2014/06/07 职场文书
班主任师德师风自我剖析材料
2014/10/02 职场文书
2014年测量员工作总结
2014/12/12 职场文书
师德承诺书
2015/01/20 职场文书
幼儿教师个人总结
2015/02/05 职场文书
毕业生个人自荐书
2015/03/05 职场文书
挂职锻炼个人总结
2015/03/05 职场文书
高二英语教学反思
2016/03/03 职场文书