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实现PS滤镜中马赛克效果示例
Jan 20 Python
详解python字节码
Feb 07 Python
学习python中matplotlib绘图设置坐标轴刻度、文本
Feb 07 Python
python+POP3实现批量下载邮件附件
Jun 19 Python
python 内置模块详解
Jan 01 Python
python实现QQ批量登录功能
Jun 19 Python
python多线程扫描端口(线程池)
Sep 04 Python
在keras中获取某一层上的feature map实例
Jan 24 Python
Python使用pyyaml模块处理yaml数据
Apr 14 Python
python装饰器实现对异常代码出现进行自动监控的实现方法
Sep 15 Python
pytorch加载语音类自定义数据集的方法教程
Nov 10 Python
python计算列表元素与乘积详情
Aug 05 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 一个随机字符串生成代码
2010/05/26 PHP
PHP常用特殊运算符号和函数总结(php新手入门必看)
2013/02/02 PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
2014/06/30 PHP
Laravel 5框架学习之数据库迁移(Migrations)
2015/04/08 PHP
WAF的正确bypass
2017/01/05 PHP
Javascript开发包大全整理
2006/12/22 Javascript
JavaScript cookie的设置获取删除详解
2014/02/11 Javascript
详解JavaScript for循环中发送AJAX请求问题
2020/06/23 Javascript
bootstrap switch开关组件使用方法详解
2017/08/22 Javascript
vue 虚拟dom的patch源码分析
2018/03/01 Javascript
bing Map 在vue项目中的使用详解
2018/04/09 Javascript
Vue项目全局配置页面缓存之按需读取缓存的实现详解
2018/08/01 Javascript
JavaScript根据json生成html表格的示例代码
2018/10/24 Javascript
nodejs通过钉钉群机器人推送消息的实现代码
2019/05/05 NodeJs
Vue+Element实现网页版个人简历系统(推荐)
2019/12/31 Javascript
Javascript Symbol原理及使用方法解析
2020/10/22 Javascript
[52:26]完美世界DOTA2联赛决赛 FTD vs Phoenix 第一场 11.08
2020/11/11 DOTA
python 随机数生成的代码的详细分析
2011/05/15 Python
详细讲解用Python发送SMTP邮件的教程
2015/04/29 Python
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
2015/11/07 Python
Python Web程序部署到Ubuntu服务器上的方法
2018/02/22 Python
解决DataFrame排序sort的问题
2018/06/07 Python
在Python中字符串、列表、元组、字典之间的相互转换
2019/11/15 Python
Pycharm自动添加文件头注释和函数注释参数的方法
2020/10/23 Python
Python lxml库的简单介绍及基本使用讲解
2020/12/22 Python
H5最强接口之canvas实现动态图形功能
2019/05/31 HTML / CSS
生物有机护肤品:Aurelia Probiotic Skincare
2018/01/31 全球购物
美国巧克力喷泉品牌:Sephra
2019/05/05 全球购物
C有"按引用传递"吗
2016/09/06 面试题
网络编程中设计并发服务器,使用多进程与多线程,请问有什么区别?
2016/03/27 面试题
绘画设计学生的个人自我评价
2013/09/20 职场文书
三关爱志愿服务活动方案
2014/08/17 职场文书
2014党的群众路线教育实践活动总结报告
2014/10/31 职场文书
民主生活会汇报材料
2014/12/15 职场文书
遗嘱格式范本
2015/08/07 职场文书
pytorch锁死在dataloader(训练时卡死)
2021/05/28 Python