python网络编程初级
网络编程的专利权应该属于Unix,各个平台(如windows、Linux等)、各门语言(C、C++、Python、Java等)所实现的符合自身特性的语法都大同小异。在我看来,懂得了Unix的socket网络编程,其他的形式的网络编程方法也就知道了。这句话说得还不太严谨。准确的应该说成懂得了socket编程的原理,网络编程也就知道了,不同之处就在于每个平台,每个语言都有自己专享的语法,我们直接灵活套用就行了。
下面是用python实现的最基本的网络编程的例子,即依托于客户端-服务器的架构,实现客户端与服务器之间的单向“数据流通”。我们分别用两个方法来实现,一个方法是最原始的socket编程,另一个方法是利用python的面向对象对第一种方法进行封装实现,目的是减少实现透明性,便于快速开发。
要求:客户端输入数据,发送到服务端,服务器端生成(时间戳+数据)的封装数据回应客户端。由于socket编程包括两种:面向连接的和无连接的,这两种分别对应TCP数据流和UDP数据报文。所以,我们两种方法都进行实现。
我的公众号 「Linux云计算网络」(id: cloud_dev),号内有 10T 书籍和视频资源,后台回复 「1024」 即可领取,分享的内容包括但不限于 Linux、网络、云计算虚拟化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++编程技术等内容,欢迎大家关注。
一、Python socket编程
面向连接的TCP socket编程:
# -*- coding: utf-8 -*- 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 网络编程(二)
Python 网络编程 上一篇博客介绍了socket的基本概念以及实现了简单的TCP和UDP的客户端.服务器程序,本篇博客主要对socket编程进行更深入的讲解 一.简化版ssh实现 这是一个极其简单 ...
- Python 网络编程(一)
Python 网络编程 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. ...
- Python学习(22)python网络编程
Python 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的 ...
- Day07 - Python 网络编程 Socket
1. Python 网络编程 Python 提供了两个级别访问网络服务: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口 ...
- python网络编程-01
python网络编程 1.socket模块介绍 ①在网络编程中的一个基本组件就是套接字(socket),socket是两个程序之间的“信息通道”. ②套接字包括两个部分:服务器套接字.客户机套接字 ③ ...
- 《Python网络编程》学习笔记--使用谷歌地理编码API获取一个JSON文档
Foundations of Python Network Programing,Third Edition <python网络编程>,本书中的代码可在Github上搜索fopnp下载 本 ...
- Python网络编程基础pdf
Python网络编程基础(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1VGwGtMSZbE0bSZe-MBl6qA 提取码:mert 复制这段内容后打开百度网盘手 ...
- python 网络编程(Socket)
# from wsgiref.simple_server import make_server## def RunServer(environ,start_response):# start_resp ...
- python 网络编程 IO多路复用之epoll
python网络编程——IO多路复用之epoll 1.内核EPOLL模型讲解 此部分参考http://blog.csdn.net/mango_song/article/details/4264 ...
随机推荐
- AC自动机解题记录
1.HDU 2222 Keywords Search 模板题 #include <bits/stdc++.h> #define fir first #define sec second # ...
- python数据类型分类
python数据分为可变类型和不可变类型,其中:可变类型:列表,字典不可变类型:布尔值,数字,字符串,元组 specidal:集合作为set是可变的,而作为frozenset是不可变集合 可变类型和不 ...
- 你确定你真的懂Nginx与PHP的交互?
Nginx是俄国人最早开发的Webserver,现在已经风靡全球,相信大家并不陌生.PHP也通过二十多年的发展来到了7系列版本,更加关注性能.这对搭档在最近这些年,叱咤风云,基本上LNMP成了当下的标 ...
- TZOJ 5101 A Game(区间DP)
描述 Consider the following two-player game played with a sequence of N positive integers (2 <= N & ...
- [leetcode]59. Spiral Matrix II螺旋遍历矩阵2
Given a positive integer n, generate a square matrix filled with elements from 1 to n^2 in spiral or ...
- java_20 LinkedList类
LinkedList类特有的方法 (1)addLast() 将指定元素添加到此列表的结尾. addFirst() 将指定元素添加到此列表的开始. public static void main(St ...
- cookie、sesstion、strorage
1. cookie 第一:每个特定的域名下最多生成20个cookie (数量上) <IE6: 20 | >ie7:50 | firefox: 50 | IE ...
- wget(转)
wget(转) wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上.它有以下功能和特点:(1)支持断点下传功能:这一点 ...
- Error while executing: am start -n
单纯clean project是不行的,选择File-Invalidate Caches/Restart,清除缓存,重启AS Android NDK 是在SDK前面又加上了"原生" ...
- mybatis进阶-5resultMap总结
resultType: 作用: 将查询结果按照sql列名pojo属性名一致性映射到pojo中. 场合: 常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用re ...