【Python】网络编程
1、TCP编程
2、SocketServer模块
3、Twisted框架
4、UDP编程
1、TCP编程——TCP是面向连接的,其一般的设计如下:

# encoding:utf-8
'''
Created on 2014-6-20 @author: Administrator
''' from socket import \
socket, \
AF_INET, \
SOCK_STREAM import time
import threading class SockServer(object):
def __init__(self, port):
self.HOST = "localhost"
self.PORT = port
self.SOCK = (self.HOST, self.PORT)
self.BUF = 1024
self._init() def _init(self):
self.sock_server = socket(AF_INET, SOCK_STREAM)
self.sock_server.bind(self.SOCK)
self.sock_server.listen(100) def __thread_process(self, sock_client, client_addr):
print "connected :", sock_client.getpeername() while True:
data = sock_client.recv(self.BUF)
if not data:
continue
elif data == "bye":
print "<< %s" % data
break
else:
sock_client.send('[%s] %s' % (time.ctime(), data))
print "%s << %s: %s" % (sock_client.getsockname(), client_addr, data)
sock_client.close() """多线程并发服务器"""
def process(self):
while True:
print "waiting for connection..."
(sock_client, client_addr) = self.sock_server.accept()
threading.Thread(target=self.__thread_process, args=(sock_client, client_addr)).start() def __del__(self):
self.sock_server.close() if __name__ == "__main__":
port = 12345
server = SockServer(port)
server.process()
客户端一般设计:

# encoding:utf-8
'''
Created on 2014-6-20 @author: Administrator
'''
from socket import socket, AF_INET, SOCK_STREAM class SockClient(object):
def __init__(self, ip, port):
self.IP = ip
self.PORT = port
self.SOCK = (ip, port)
self.BUF = 1024
self._init() def _init(self):
self.sock_client = socket(AF_INET, SOCK_STREAM) def process(self):
print "connecting server..."
self.sock_client.connect(self.SOCK)
while True:
data = raw_input(">>")
self.sock_client.send(data)
if data.strip() == "bye":
break
recv_data = self.sock_client.recv(self.BUF)
if not recv_data:
print "no recv!"
else:
print recv_data def __del__(self):
self.sock_client.close() if __name__ == "__main__":
ip = "localhost"
port = 12345
client = SockClient(ip, port)
client.process()
2、SocketServer模块——用于简化实现网络编程客户端与服务器所需要的大量样板代码。
2.1 创建一个SocketServerTCP服务器:
# encoding:utf-8
'''
Created on 2014-6-23 @author: Administrator
'''
from time import ctime
from SocketServer import TCPServer, StreamRequestHandler """
SocketServer 的请求处理器默认行为时接收连接,得到请求,然后关闭连接,这使得我们不能
在程序运行时,一直保持连接状态,而是每次发送数据到服务器的时候创建一个新的套接字
"""
class MyRequestHandle(StreamRequestHandler):
"""
客户端有消息发来时,handle函数会被调用
"""
def handle(self):
print "...connecting from :", self.client_address
self.wfile.write('[%s] %s' % (ctime(), self.rfile.readline())) if __name__ == "__main__":
ip = "localhost"
port = 12345
tcpServ = TCPServer((ip, port), MyRequestHandle)
print "waiting for connection..."
tcpServ.serve_forever()
说明:
1、这里的主要工作是从SocketServer的StreamRequestHandler类派生出一个子类,并重写handle()函数。
在有客户端消息近来的时候,handle()函数就会被调用,如上是一个使用SocketServer模块的回射服务器例子。
2、SocketServer的请求处理器的默认行为时接收连接,得到请求,然后关闭连接,这使得我们不能再程序运行时,一致保持连接状态,
而是每次发送数据到服务器的时候都要创建一个新的套接字。
2.2 创建一个SocketServerTCP客户端:
# encoding:utf-8
'''
Created on 2014-6-23 @author: Administrator
'''
from socket import socket, AF_INET, SOCK_STREAM class SocketClient(object):
def handle(self, ADDR):
BUF = 1024
while True:
self.client = socket(AF_INET, SOCK_STREAM)
self.client.connect(ADDR)
data = raw_input(">>")
if not data:
break
self.client.send("%s\r\n" % data) #服务端使用的是readline,为了保持一致,发送添加了换行
rcv_data = self.client.recv(BUF)
if not rcv_data:
break
else:
print rcv_data.strip()
self.client.close() self.client.close() if __name__ == "__main__":
ip = "localhost"
port = 12345
client = SocketClient()
client.handle((ip, port))
说明:
1、本例子是针对使用SocketServer的服务端的例子,其中send()函数需要添加”\r\n”换行符,对应于服务器端的readline()函数
2、发送数据之后,断开连接,因为SocketServer的默认行为使得不能再程序运行时,一致保持连接状态
运行结果:
服务端:

客户端:

3、Twisted框架
简介——Twisted是一个完全事件驱动的网络框架,允许使用和开发完全异步的网络应用程序和协议。
3.1 安装Twisted扩展(Windows)
下载:Twisted和zope
http://twistedmatrix.com/trac/wiki/Downloads
安装Twisted扩展(Linux)
命令:easy_install twisted

eclipse pydev添加twisted模块:
系统已经安装twisted模块,导入twisted,引用其中的方法时,出现如下情况:

解决方法是:
在Eclipse的Window—Preferences—PyDev—Interpreter-Python 窗口下的Forced Buildins添加twisted

即可正常引用twisted包
3.2 Twisted服务端:
# encoding:utf-8
'''
Created on 2014-6-23 @author: Administrator
''' from twisted.internet import reactor, protocol
from time import ctime """
Twisted 是一个完全事件驱动的网络框架,允许使用和开发完全异步的网络应用程序和协议
""" class TwistedServer(protocol.Protocol): """
重写connectionMade函数,该函数在有客户端连接时被调用
"""
def connectionMade(self):
client = self.client = self.transport.getPeer().host
print "...connected from ", client, ":", self.transport.getPeer().port """
该函数在客户端通过网络发送数据过来时被调用
"""
def dataReceived(self, data):
self.transport.write("[%s] %s" % (ctime(), data)) if __name__ == "__main__":
port = 12345
factory = protocol.Factory()
factory.protocol = TwistedServer
print "waiting for connection..."
reactor.listenTCP(port, factory)
reactor.run()
说明:
Twistede服务端从Protocol类派生子类,然后重写connectionMade()函数,这个函数在有客户端连接的时候被调用,dataReceived()函数,这个函数在客户端
通过网络发送数据过来的时候被调用,reactor把数据当成参数传到这个函数中
3.3 Twisted客户端
# encoding:utf-8
'''
Created on 2014-6-23 @author: Administrator
'''
from twisted.internet import protocol, reactor class TwistedClient(protocol.Protocol): def _senddata(self):
data = raw_input(">>")
if data:
print "...sending %s..." % data
self.transport.write(data)
else:
self.transport.loseConnection() #连接建立之后,调用自定义_senddata函数
def connectionMade(self):
self._senddata() def dataReceived(self, data):
print data
self._senddata() class TClientFactory(protocol.ClientFactory):
protocol = TwistedClient
clientConnectionLost = clientConnectionFailed = \
lambda self, connector, reason:reactor.stop() if __name__ == "__main__":
host = "localhost"
port = 12345
reactor.connectTCP(host, port, TClientFactory())
reactor.run()
说明:
Twisted客户端也从Protocol派生子类,重写connectionMade()和dataReceived()函数,当用户没有任何输入时(参考如上代码中_senddata()函数中else部分),连接结束,结束时,调用loseConnection关闭套接字,这时工厂的clientConnectionLost函数会被调用,同时reactor就被关闭,脚本执行就结束了,由于某些原因,clientConnectionFailed()被调用时,reactor也会被关闭。
4. UDP 编程
UDP是无连接的,服务器一般设计如下:

4.1 服务器端编程
# encoding:utf-8
'''
Created on 2014-6-20 @author: Administrator
''' from socket import \
socket, \
AF_INET, \
SOCK_DGRAM from time import ctime class DgramServer(object):
def __init__(self, port):
self.HOST = "localhost"
self.PORT = port
self.SOCK = (self.HOST, self.PORT)
self.BUF = 1024
self._init() def _init(self):
self.dgram_server = socket(AF_INET, SOCK_DGRAM)
self.dgram_server.bind(self.SOCK) def process(self):
print "waiting for message..."
while True:
data, addr = self.dgram_server.recvfrom(self.BUF)
print "<<",addr, ":%s " % data
if data == "bye":
break
self.dgram_server.sendto("[%s,%s]" % (ctime(), data), addr) def __del__(self):
self.dgram_server.close() if __name__ == "__main__":
port = 12345
dgram = DgramServer(port)
dgram.process()
注意:
UDP服务端,recvfrom会返回连接的地址
4.2 客户端编程
# encoding:utf-8
'''
Created on 2014-6-20 @author: Administrator
'''
from socket import \
socket, \
AF_INET, \
SOCK_DGRAM class DgramClient(object):
def __init__(self, ip, port):
self.HOST = ip
self.PORT = port
self.SOCK = (self.HOST, self.PORT)
self.BUF = 1024
self._init() def _init(self):
self.dgram_client = socket(AF_INET, SOCK_DGRAM) def process(self):
while True:
data = raw_input("<<")
self.dgram_client.sendto(data, self.SOCK)
if data == "bye":
break
recv_data, dgram = self.dgram_client.recvfrom(self.BUF)
if not recv_data:
print "no recv"
else:
print ">>", dgram, ":%s" % recv_data def __del__(self):
self.dgram_client.close() if __name__ == "__main__":
ip = "localhost"
port = 12345
dgram = DgramClient(ip, port)
dgram.process()
运行结果:
服务端:

客户端1:

客户端2:

【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 ...
- 自学Python之路-Python网络编程
自学Python之路-Python网络编程 自学Python之路[第一回]:1.11.2 1.3
随机推荐
- event.preventDefault()
<!doctype html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- mac brew install redis
在mac 下安装redis 执行brew install redis ==> Downloading http://download.redis.io/releases/redis-2.8.19 ...
- Oracle与SQL Server事务处理的比较
事务处理是所有大型数据库产品的一个关键问题,各数据库厂商都在这个方面花费了很大精力,不同的事务处理方式会导致数据库性能和功能上的巨大差异.事务处理也是数据库管理员与数据库应用程序开发人员必须深刻理解的 ...
- Sorl之.net操作
http://www.cnblogs.com/zhangweizhong/category/771055.html 插入: SolrNet.Startup.Init<Movie>(&quo ...
- VM虚拟机无法拖拽、粘贴、复制
VM无法从客户机拖放/复制文件到虚拟机的解决办法: 将这两项取消勾选,点击[确定].再次打开,勾选,点击[确定] 原因分析:可能是VM中默认是不支持该功能的,但是在配置窗体上确实默认打钩打上的. 依据 ...
- STM32F0xx_TIM输入捕获(计算频率)配置详细过程
前言 关于STM32的定时器,可谓是功能强大,估计没有多少人研究完STM32定时器的所有功能(包括我也没有),只是使用常用的一些功能,后续我会推出关于STM32定时器的更多功能. STM32芯片多数为 ...
- 第十七章 调试及安全性(In .net4.5) 之 程序诊断
1. 概述 生产环境中的程序,也是不能保证没有问题的.为了能方便的找出问题,.net提供了一些特性来进行程序诊断. 这些特性包括:logging.tracing .程序性能分析(profiling) ...
- 第十二章 管理类型(In .net4.5) 之 操作字符串
1. 概述 本章包括 字符串基本操作 以及 查找.遍历.格式化字符串. 2. 主要内容 2.1 在.net平台中使用字符串 C#中,string是用来保存文本信息的.是一个被当做值类型使用的引用类型. ...
- 关于EasyUI与富文本编辑器结合使用的问题(kindueditor与uueditor)
最近使用easyui玩玩项目,在结合富文本编辑器时遇到了一些问题,很多人(在网上看到)集成富文本编辑器时常常不能显示, 第一次打开编辑的时候没有问题,但是第二次打开就出错了.为此我进行了一些调试研究. ...
- [terry笔记]Oracle10g/11g安装-redhat5.5
操作系统准备工作 其实真正的进入图形界面安装是简单的,只是前期的配置比较繁琐,如版本.空间.位置.软件包.用户.环境变量.内核参数,这里主要讨论前期配置. 10g与11g的单实例安装基本一样,主要区别 ...