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实现电子词典
Apr 23 Python
python编写朴素贝叶斯用于文本分类
Dec 21 Python
Python遍历某目录下的所有文件夹与文件路径
Mar 15 Python
django中的HTML控件及参数传递方法
Mar 20 Python
python排序函数sort()与sorted()的区别
Sep 18 Python
pytorch 模拟关系拟合——回归实例
Jan 14 Python
Tensorflow实现多GPU并行方式
Feb 03 Python
Python中文分词库jieba,pkusegwg性能准确度比较
Feb 11 Python
python读取配置文件方式(ini、yaml、xml)
Apr 09 Python
Python如何在main中调用函数内的函数方式
Jun 01 Python
python里的单引号和双引号的有什么作用
Jun 17 Python
Opencv 图片的OCR识别的实战示例
Mar 02 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中将数组转成XML格式的实现代码
2011/08/08 PHP
php数组删除元素示例
2014/03/21 PHP
PHP中使用sleep造成mysql读取失败的案例和解决方法
2014/08/21 PHP
php获得文件大小和文件创建时间的方法
2015/03/13 PHP
PHP开发Apache服务器配置
2015/07/15 PHP
PHP框架Laravel中实现supervisor执行异步进程的方法
2017/06/07 PHP
php7新特性的理解和比较总结
2019/04/14 PHP
textarea中的手动换行处理的jquery代码
2011/02/26 Javascript
javascript复制对象使用说明
2011/06/28 Javascript
8个实用的jQuery技巧
2014/03/04 Javascript
javascript中AJAX用法实例分析
2015/01/30 Javascript
原生js实现的贪吃蛇网页版游戏完整实例
2015/05/18 Javascript
javascript中sort排序实例详解
2016/07/24 Javascript
动态统计当前输入内容的字节、字符数的实例详解
2017/10/27 Javascript
Vue.js实现的购物车功能详解
2019/01/27 Javascript
如何解决js函数防抖、节流出现的问题
2019/06/17 Javascript
Python对两个有序列表进行合并和排序的例子
2014/06/13 Python
用于统计项目中代码总行数的Python脚本分享
2015/04/21 Python
Python爬取qq music中的音乐url及批量下载
2017/03/23 Python
一个基于flask的web应用诞生 flask和mysql相连(4)
2017/04/11 Python
python实现excel读写数据
2021/03/02 Python
Python中如何导入类示例详解
2019/04/17 Python
python程序 创建多线程过程详解
2019/09/23 Python
超实用的 30 段 Python 案例
2019/10/10 Python
python中删除某个元素的方法解析
2019/11/05 Python
Python 中的pygame安装与配置教程详解
2020/02/10 Python
利用python对excel中一列的时间数据更改格式操作
2020/07/14 Python
详解background属性的8个属性值(面试题)
2020/11/02 HTML / CSS
澳大利亚第一旅行车和房车配件店:Caravan RV Camping
2020/12/26 全球购物
法学专业自我鉴定
2014/02/05 职场文书
会计演讲稿范文
2014/05/23 职场文书
销售员态度差检讨书
2014/10/26 职场文书
2015年教研工作总结
2015/05/23 职场文书
信息技术研修心得体会
2016/01/08 职场文书
vue首次渲染全过程
2021/04/21 Vue.js
分享python函数常见关键字
2022/04/26 Python