最近在读Core Python Application Programming 3rd,讲解很详细,例子也比较丰富,对于入门之后想对python的各种应用有进一步的认识的同学,推荐读这本书。socket编程是本书的第二章,写技术博客的初衷很简单,总结知识,梳理思路,同时也是对大脑信息的整理,方便日后回顾或查阅。本章的编排主要分为三个层次,基础库(module)socket,进阶库SocketServer和第三方库twisted。本篇用的是socket和TCP协议。
Server端代码:
from time import ctime
import os
from socket import *
HOST = ''
PORT = 21789
BUFSIZE = 1024
ADDR = (HOST, PORT)
tcpServSock = socket(AF_INET, SOCK_STREAM)
tcpServSock.bind(ADDR)
tcpServSock.listen(5)
while True:
print 'waiting connection...'
tcpClntSock, addr = tcpServSock.accept()
print 'connected by:', addr
while True:
data = tcpClntSock.recv(BUFSIZE)
if not data:
break
elif data == 'date':
tcpClntSock.send('Server time:%s' % ctime())
elif data == 'os':
tcpClntSock.send('OS info:%s' % os.name)
elif data == 'ls':
tcpClntSock.send('The listing of current dir:%s' % os.listdir(os.curdir))
else:
tcpClntSock.send('You can type "date","os","ls" to get corresponding information on server.')
print 'This is the raw data:', data
tcpClntSock.close()
tcpServSock.close()
Client端代码:
from socket import *
HOST = '127.0.0.1'
PORT = 21789
BUFSIZE = 1024
ADDR = (HOST,PORT)
tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)
while True:
data = raw_input('> ')
if not data:
break
tcpCliSock.send('%s' % data)
data = tcpCliSock.recv(BUFSIZE)
if not data:
break
print data.strip()
tcpCliSock.close()
TCP是面向连接的可靠传输协议,因此先建立连接,才能进行信息传递。注意,由于服务器是被动接受客户端的连接请求,所以服务器一定要先于客户端运行,使之可以处于监听状态,才能接受客户端的请求。
运行结果:
Server
waiting connection...
connected by: ('127.0.0.1', 59222)
waiting connection...
Client:
> adsf
You can type "date","os","ls" to get corresponding information on server.
> date
Server time:Wed May 27 21:07:51 2015
> os
OS info:posix
> ls
The listing of current dir:['.DS_Store', 'ChatClnt.py', 'ChatServ.py', 'tsTclnt.py', 'tsTclntTW.py', 'tsTserv.py', 'tsTservSS.py', 'tsTServTW.py', 'tsUclnt.py']
>
Process finished with exit code 0