python网络编程初级

网络编程的专利权应该属于Unix,各个平台(如windows、Linux等)、各门语言(C、C++、Python、Java等)所实现的符合自身特性的语法都大同小异。在我看来,懂得了Unix的socket网络编程,其他的形式的网络编程方法也就知道了。这句话说得还不太严谨。准确的应该说成懂得了socket编程的原理,网络编程也就知道了,不同之处就在于每个平台,每个语言都有自己专享的语法,我们直接灵活套用就行了。

下面是用python实现的最基本的网络编程的例子,即依托于客户端-服务器的架构,实现客户端与服务器之间的单向“数据流通”。我们分别用两个方法来实现,一个方法是最原始的socket编程,另一个方法是利用python的面向对象对第一种方法进行封装实现,目的是减少实现透明性,便于快速开发。

要求:客户端输入数据,发送到服务端,服务器端生成(时间戳+数据)的封装数据回应客户端。由于socket编程包括两种:面向连接的和无连接的,这两种分别对应TCP数据流和UDP数据报文。所以,我们两种方法都进行实现。

一、Python socket编程

面向连接的TCP socket编程:

 1 # -*- coding: utf-8 -*-
 2
 3 from socket import *
 4 from time import ctime
 5
 6 # Address and Port
 7 HOST = ‘‘
 8 PORT = 21567
 9 ADDR = (HOST, PORT)
10
11 # BuffSize
12 BUFSIZ = 1024
13
14 # build socket
15 tcpSerSock = socket(AF_INET, SOCK_STREAM)
16 # bind socket
17 tcpSerSock.bind(ADDR)
18 # listen 5 client
19 tcpSerSock.listen(5)
20
21 try:
22     while True:
23         print ‘waiting for connection...‘
24         # build client socket
25         tcpCliSock, addr = tcpSerSock.accept()
26         print ‘...connect from:‘, addr
27
28         # accept data and process
29         while True:
30             data = tcpCliSock.recv(BUFSIZ)
31             if not data:
32                 break
33             tcpCliSock.send(‘[%s] %s‘ % (ctime(), data))
34
35             # close client socket
36             tcpCliSock.close()
37 except EOFError, KeyboardInterrupt:
38     tcpSerSock.close()
 1 # -*- coding:utf-8 -*-
 2
 3 from socket import *
 4
 5 # Address and Port
 6 HOST = ‘127.0.0.1‘
 7 PORT = 21567
 8 ADDR = (HOST, PORT)
 9
10 # BufferSize
11 BUFSIZ = 1024
12
13 #build socket
14 tcpCliSocket = socket(AF_INET, SOCK_STREAM)
15 tcpCliSocket.connect(ADDR)
16
17 while True:
18     data = raw_input(‘> ‘)
19     if not data:
20         break
21     # send data
22     tcpCliSocket.send(data)
23     # recv data
24     data = tcpCliSocket.recv(BUFSIZ)
25     if not data:
26         break
27     # show data
28     print data
29 tcpCliSocket.close()

无连接的UDP socket编程

 1 # -*- coding: utf-8 -*-
 2
 3 from socket import *
 4 from time import ctime
 5
 6 # Address and Port
 7 HOST = ‘‘
 8 PORT = 8000
 9 ADDR = (HOST, PORT)
10
11 # BufferSize
12 BUFFSIZE = 1024
13 # build socket
14 udpSerSock = socket(AF_INET, SOCK_DGRAM)
15 # bind socket
16 udpSerSock.bind(ADDR)
17
18 try:
19     while True:
20         print ‘waiting the message...‘
21         data, addr = udpSerSock.recvfrom(BUFFSIZE)
22         print ‘received the message: ‘+data+‘ from: ‘, addr
23         udpSerSock.sendto(‘[%s] %s‘ % (ctime(), data), addr)
24 except EOFError, KeyboardInterrupt:
25     udpSerSock.close()
 1 # -*- coding: utf-8 -*-
 2
 3 from socket import *
 4
 5 # Address and Port
 6 HOST = ‘localhost‘
 7 PORT = 8000
 8 ADDR = (HOST, PORT)
 9
10 # BufferSize
11 BUFSIZ = 1024
12
13 # build socket
14 udpCliSock = socket(AF_INET, SOCK_DGRAM)
15
16 while True:
17     data = raw_input(‘> ‘)
18     udpCliSock.sendto(data, ADDR)
19     data = udpCliSock.recvfrom(BUFSIZ)
20     if not data:
21         break
22     print data
23 udpCliSock.close()

二、基于封装类SocketServer的网络编程

 1 # -*- coding: utf-8 -*-
 2
 3 from SocketServer import TCPServer as TCP, StreamRequestHandler as SRH
 4 from time import ctime
 5
 6 # Address and Port
 7 HOST = ‘‘
 8 PORT = 21567
 9 ADDR = (HOST, PORT)
10
11 # BuffSize
12 BUFSIZ = 1024
13
14 # build RequestHandler
15 class MyRequestHandler(SRH):
16     def handle(self):
17         print ‘...connected from: ‘, self.client_address
18         self.wfile.write(‘[%s] %s‘ % (ctime(), self.rfile.readline()))
19
20 # build TCPServer
21 TCPServ = TCP(ADDR, MyRequestHandler)
22 print ‘waiting for connection...‘
23 # loop to process
24 TCPServ.serve_forever()
 1 # -*- coding:utf-8 -*-
 2
 3 from socket import *
 4
 5 # Address and Port
 6 HOST = ‘127.0.0.1‘
 7 PORT = 21567
 8 ADDR = (HOST, PORT)
 9
10 # BufferSize
11 BUFSIZ = 1024
12
13 while True:
14     # note: SocketServer 的请求处理器的默认行为是接受连接,
15     # 得到请求,然后就关闭连接,所以需要多次连接
16     tcpCliSock = socket(AF_INET, SOCK_STREAM)
17     tcpCliSock.connect(ADDR)
18
19     # process data
20     data = raw_input(‘> ‘)
21     if not data:
22         break
23     tcpCliSock.send(‘%s\r\n‘ % data)
24
25     data = tcpCliSock.recv(BUFSIZ)
26     if not data:
27         break
28     print data.strip()
29     tcpCliSock.close()
时间: 2024-10-08 22:16:01

python网络编程初级的相关文章

python 网络编程 (二)---tcp

异常 python的socket模块实际上定义了4种可能出现的异常: 1)与一般I/O 和通信问题有关的socket.error; 2)与查询地址信息有关的socket.gaierror; 3)与其他地址错误有关的socket.herror; 4)与在一个socket上调用settimeout()后,处理超时有关的socket.timeout; import socket, sys, time host = sys.argv[1] textport = sys.argv[2] filename

[Python网络编程] DNS缓存解决方案

记得以前写爬虫的时候为了防止dns多次查询,是直接修改/etc/hosts文件的,最近看到一个优美的解决方案,修改后记录如下: import socket _dnscache={} def _setDNSCache(): """ Makes a cached version of socket._getaddrinfo to avoid subsequent DNS requests. """ def _getaddrinfo(*args, **

Python 网络编程

Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法. 高级别的网络服务模块 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发. 什么是 Socket? Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. socket()函数 Pyt

[Python网络编程]gevent httpclient以及网页编码

之前看到geventhttpclient这个项目,https://github.com/gwik/geventhttpclient,官方文档说非常快,由于响应使用了C的解析,所以我一直想把这玩意用到项目中, 这两天一直在纠结这玩意,说实在一句话,比较难用,封装的不给力,最大缺陷如下: 1.不支持重定向,重定向需要自己来写,很费事 2.新建的httpclient对象只能发送同域名的请求 这相当的蛋疼,我花了一点时间封装了一下,解决了上面的两个问题,还增加了自动编解码问题,代码如下: #!/usr/

[python] 网络编程之套接字Socket、TCP和UDP通信实例

很早以前研究过C#和C++的网络通信,参考我的文章: C#网络编程之Tcp实现客户端和服务器聊天 C#网络编程之套接字编程基础知识 C#网络编程之使用Socket类Send.Receive方法的同步通讯 Python网络编程也类似.同时最近找工作笔试面试考察Socket套接字.TCP\UDP区别比较多,所以这篇文章主要精简了<Python核心编程(第二版)>第16章内容.内容包括:服务器和客户端架构.套接字Socket.TCP\UDP通信实例和常见笔试考题. 最后希望文章对你有所帮助,如果有不

python 网络编程(五)---DNS域名系统

1.域名系统定义 DNS计算机域名系统由域名服务器和域名解析器组成.通常输入的是网址就是一个域名. 2.域名查询 查询方式包括: 1)正向查询:由域名查找对应的IP(如:119.75.218.77">www.baidu.com->119.75.218.77 ) 2)反向查询:由IP查找域名(如:119.75.218.77 –> www.baidu.com) 查询方式包括: 1)递归查询:当DNS服务器接收到客户端的查询请求时,会做出相应的反应(本地DNS服务器查询.其他服务器查

Python -- 网络编程 -- 抓取网页图片 -- 图虫网

字符串(str)编码成字节码(bytes),字节码解码为字符串 获取当前环境编码:sys.stdin.encoding url编码urllib.parse.quote() url解码urllib.parse.unquote() 列表去重:pages = list(set(pages)) 创建文件夹(可多级创建):os.makedirs(folder)  os.mkdir()只能单级创建 首先分析网页(图虫网)的URL规律: 根网页地址形如: http://tuchong.com/tags/人像/

Python 网络编程(一)

Python 网络编程 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者. socket和file的区别: file模块是针对某个指定文件进行[打开][读写][关闭] socket模块是针对 服务器端 和 客户端Socket 进行[打开][读写][关闭] socket服务端和客户端的网

Python 网络编程(二)

Python 网络编程 上一篇博客介绍了socket的基本概念以及实现了简单的TCP和UDP的客户端.服务器程序,本篇博客主要对socket编程进行更深入的讲解 一.简化版ssh实现 这是一个极其简单的仿ssh的socket程序,实现的功能为客户端发送命令,服务端接收到客户端的命令,然后在服务器上通过subrocess模块执行命令,如果命令执行有误,输出内容为空,则返回"command error"的语句给客户端,否则将命令执行的结果返回给客户端 服务端 1 2 3 4 5 6 7 8