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操作MySQL数据库的方法分享
May 29 Python
在Python中使用NLTK库实现对词干的提取的教程
Apr 08 Python
linux平台使用Python制作BT种子并获取BT种子信息的方法
Jan 20 Python
python3实现ftp服务功能(客户端)
Mar 24 Python
Python实现朴素贝叶斯分类器的方法详解
Jul 04 Python
anaconda中更改python版本的方法步骤
Jul 14 Python
利用python-pypcap抓取带VLAN标签的数据包方法
Jul 23 Python
python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法
Oct 04 Python
python爬虫可以爬什么
Jun 16 Python
Python变量格式化输出实现原理解析
Aug 06 Python
python的launcher用法知识点总结
Aug 07 Python
Anaconda安装pytorch和paddle的方法步骤
Apr 03 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 随机数的深入理解
2013/06/05 PHP
php基于SQLite实现的分页功能示例
2017/06/21 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
2017/12/21 PHP
一次因composer错误使用引发的问题与解决
2019/03/06 PHP
js实现的日期操作类DateTime函数代码
2010/03/16 Javascript
基于JQuery制作的产品广告效果
2010/12/08 Javascript
JS 获取滚动条高度示例代码
2013/10/24 Javascript
jQuery 仿百度输入标签插件附效果图
2014/07/04 Javascript
node.js超时timeout详解
2014/11/26 Javascript
jquery实现标签支持图文排列带上下箭头按钮的选项卡
2015/03/14 Javascript
JavaScript forEach()遍历函数使用及介绍
2015/07/08 Javascript
分享javascript计算时间差的示例代码
2020/03/19 Javascript
JavaScript中使用数组方法汇总
2016/02/16 Javascript
jquery实现上传文件大小类型的验证例子(推荐)
2016/06/25 Javascript
node.js学习之事件模块Events的使用示例
2017/09/28 Javascript
如何用原生js写一个弹窗消息提醒插件
2019/05/24 Javascript
vue实现信息管理系统
2020/05/30 Javascript
前端vue如何使用高德地图
2020/11/05 Javascript
Python读取图片EXIF信息类库介绍和使用实例
2014/07/10 Python
Python修改MP3文件的方法
2015/06/15 Python
在Python的Django框架的视图中使用Session的方法
2015/07/23 Python
Python 2.7中文显示与处理方法
2018/07/16 Python
关于Python 的简单栅格图像边界提取方法
2019/07/05 Python
django中的图片验证码功能
2019/09/18 Python
python中自带的三个装饰器的实现
2019/11/08 Python
Pytorch 多块GPU的使用详解
2019/12/31 Python
Python3爬虫带上cookie的实例代码
2020/07/28 Python
如何在vscode中安装python库的方法步骤
2021/01/06 Python
美国购买肉、鸭、家禽、鹅肝和熟食网站:D’Artagnan
2018/11/13 全球购物
NFL官方在线商店:NFLShop
2020/07/29 全球购物
某公司部分笔试题
2013/11/05 面试题
2014年小学元旦活动方案
2014/02/12 职场文书
党员民主评议自我评价
2014/10/20 职场文书
高中生军训感言
2015/08/01 职场文书
2016党员干部政治学习心得体会
2016/01/23 职场文书
祝福语集锦:送给毕业同学祝福语
2019/11/21 职场文书