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实用技巧两则
Aug 29 Python
跟老齐学Python之dict()的操作方法
Sep 24 Python
python web框架学习笔记
May 03 Python
python好玩的项目—色情图片识别代码分享
Nov 07 Python
python求最大连续子数组的和
Jul 07 Python
Python 生成 -1~1 之间的随机数矩阵方法
Aug 04 Python
python3获取当前目录的实现方法
Jul 29 Python
基于Python实现剪切板实时监控方法解析
Sep 11 Python
python构建指数平滑预测模型示例
Nov 21 Python
tensorflow从ckpt和从.pb文件读取变量的值方式
May 26 Python
学习Python爬虫的几点建议
Aug 05 Python
聊聊Python pandas 中loc函数的使用,及跟iloc的区别说明
Mar 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文件上传实例详解!!!
2007/01/02 PHP
PHP中simplexml_load_string函数使用说明
2011/01/01 PHP
php实现监听事件
2013/11/06 PHP
PHP操作MongoDB实现增删改查功能【附php7操作MongoDB方法】
2018/04/24 PHP
thinkPHP+mysql+ajax实现的仿百度一下即时搜索效果详解
2019/07/15 PHP
javascript 学习之旅 (3)
2009/02/05 Javascript
基于jQuery的倒计时插件代码
2011/05/07 Javascript
JavaScript基础语法让人疑惑的地方小结
2012/05/23 Javascript
非html5实现js版弹球游戏示例代码
2013/09/22 Javascript
5秒后跳转到另一个页面的js代码
2013/10/12 Javascript
JS正则验证邮箱的格式详细介绍
2013/11/19 Javascript
javascript无刷新评论实现方法
2015/05/13 Javascript
Bootstrap源码解读导航(6)
2016/12/23 Javascript
VUE axios发送跨域请求需要注意的问题
2017/07/06 Javascript
JS+CSS+HTML实现“代码雨”类似黑客帝国文字下落效果
2020/03/17 Javascript
Python写的Tkinter程序屏幕居中方法
2015/03/10 Python
用Python的Django框架编写从Google Adsense中获得报表的应用
2015/04/17 Python
Python简单网络编程示例【客户端与服务端】
2017/05/26 Python
python快速建立超简单的web服务器的实现方法
2018/02/17 Python
浅谈关于Python3中venv虚拟环境
2018/08/01 Python
python实现统计代码行数的小工具
2019/09/19 Python
python 单线程和异步协程工作方式解析
2019/09/28 Python
python运用sklearn实现KNN分类算法
2019/10/16 Python
pytorch动态网络以及权重共享实例
2020/01/06 Python
详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案
2021/01/29 Python
python lambda的使用详解
2021/02/26 Python
高二美术教学反思
2014/01/14 职场文书
天地会口号
2014/06/17 职场文书
2014年行政部工作总结
2014/11/19 职场文书
爱鸟护鸟的宣传语
2015/07/13 职场文书
二年级作文之动物作文
2019/11/13 职场文书
python实现过滤敏感词
2021/05/08 Python
Anaconda安装pytorch及配置PyCharm 2021环境
2021/06/04 Python
微软PC Health Check电脑健康状况检查应用下载(Win11配置检测工具)
2021/06/26 数码科技
K8s部署发布Golang应用程序的实现方法
2021/07/16 Golang
详解Vue3使用axios的配置教程
2022/04/29 Vue.js