一、使用内置标准库
TCP服务端
#coding:utf-8from socket import *from time import ctimeHOST = ''PORT = 9998BUFSIZ = 1024ADDR = (HOST, PORT)tcpSerSock = socket(AF_INET, SOCK_STREAM)tcpSerSock.bind(ADDR)tcpSerSock.listen(5)while True: print 'wating for connection...' tcpCliSock, addr = tcpSerSock.accept() print '...connected from :',addr while True: data = tcpCliSock.recv(BUFSIZ) if not data: break tcpCliSock.send('[%s] %s'%(ctime(),data)) tcpCliSock.close()tcpSerSock.close()
TCP客户端
#coding:utf-8from socket import *HOST = '127.0.0.1'PORT = 9998BUFSIZ = 1024ADDR = (HOST, PORT)tcpCliSock = socket(AF_INET, SOCK_STREAM)tcpCliSock.connect(ADDR)while True: data = raw_input('> ') if not data: break tcpCliSock.send(data) data = tcpCliSock.recv(BUFSIZ) if not data: breaktcpCliSock.close()
UDP服务端
#coding:utf-8from socket import *from time import ctimeHOST = ''PORT = 9997BUFSIZ = 1024ADDR = (HOST,PORT)udpSerSock = socket(AF_INET, SOCK_DGRAM)udpSerSock.bind(ADDR)while True: print 'wating for message...' data, addr = udpSerSock.recvfrom(BUFSIZ) udpSerSock.sendto('[%s] %s'%(ctime(),data),addr) print '...received from and returned to :',addrudpSerSock.close()
UDP客户端
#coding:utf-8from socket import *HOST = 'localhost'PORT = 9997BUFSIZ = 1024ADDR = (HOST, PORT)udpCliSock = socket(AF_INET, SOCK_DGRAM)while True: data = raw_input('> ') if not data: break udpCliSock.sendto(data, ADDR) data, ADDR = udpCliSock.recvfrom(BUFSIZ) if not data: break print dataudpCliSock.close()
二、使用SocketServer模块
SocketServer是标准库中的一个高级模块,它的目标是简化很多样板代码,它们是创建网络客户端和服务器所必须的代码。
应用程序现在是事件驱动的,这意味着只有在系统中的事件发生时,它们才会工作。
事件包括信息的发送和接受
TCP服务端
#coding:utf-8from SocketServer import TCPServerfrom SocketServer import StreamRequestHandlerfrom time import ctimeHOST = ''PORT = 9989ADDR = (HOST, PORT)class MyRequestHandler(StreamRequestHandler): def handle(self): print '...connected from:',self.client_address self.wfile.write('[%s]%s'%(ctime(),self.rfile.readline()))tcpServ = TCPServer(ADDR, MyRequestHandler)print 'waiting for connection...'tcpServ.serve_forever()
TCP客户端
#coding:utf-8from socket import *HOST = 'localhost'PORT = 9989BUFSIZ = 1024ADDR = (HOST, PORT)while True: tcpCliSock = socket(AF_INET, SOCK_STREAM) tcpCliSock.connect(ADDR) 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()
三、使用Twisted框架
Twisted是一个完整的事件驱动的网络框架,利用他既能使用也能开发完整的异步网络应用程序和协议。
TCP服务端
#coding:utf-8from twisted.internet import protocol,reactorfrom time import ctimePORT = 9987class TSServProtocol(protocol.Protocol): def connectionMade(self): clnt = self.clnt = self.transport.getPeer().host print '...connected from ',clnt def dataReceived(self, data): self.transport.write('[%s]%s'%(ctime(),data))factory = protocol.Factory()factory.protocol = TSServProtocolprint 'waiting for connection...'reactor.listenTCP(PORT, factory)reactor.run()
TCP客户端
from twisted.internet import protocol,reactorHOST = 'localhost'PORT = 9987class TSClntProtocol(protocol.Protocol): def sendData(self): data = raw_input('> ') if data: print '...sending %s...'%data self.transport.write(data) else: self.transport.loseConnection() def connectionMade(self): self.sendData() def dataReceived(self, data): print data self.sendData()class TSClnFactory(protocol.ClientFactory): protocol = TSClntProtocol clientConnectionLost = clientConnectionFailed = \ lambda self,connector,reason:reactor.stop()reactor.connectTCP(HOST,PORT,TSClnFactory())reactor.run()