TCP服务器
所有的套接字都用 socket.socket()函数来创建。服务器需要“坐在某个端口上”等待请求。所
以它们必需要“绑定”到一个本地的地址上。由于 TCP 是一个面向连接的通讯系统,在 TCP 服务器
可以开始工作之前,要先完成一些设置。TCP 服务器必需要“监听”(进来的)连接,设置完成之后,
服务器就可以进入无限循环了。
一个简单的(单线程的)服务器会调用 accept()函数等待连接的到来。默认情况下,accept()
函数是阻塞式的,即程序在连接到来之前会处于挂起状态。
HOST 变量为空,表示 bind()函数可以绑定在所有有效的地址上。我们还选用了一个随机生成的
未被占用的端口号。在程序中,我们把缓冲的大小设定为 1K。你可以根据你的网络情况和应用的需
要来修改这个大小。
from socket import *
from time import ctime
HOST=''
PORT=21567
BUFSIZ=1024
ADDR=(HOST,PORT)
tcpSerSock = socket(AF_INET,SOCK_STREAM) # 创建一个服务器套接字
tcpSerSock.bind(ADDR) # 把地址绑定到套接字
tcpSerSock.listen(5) # 监听连接 ,listen()函数的参数只是表示最多允许多少个连接同时连进来,后来的连接就会被拒绝掉。
while True: # 服务器无限循环
print 'waiting for connection...'
tcpCliSock,addr=tcpSerSock.accept() # 接受客户的连接
print '...connection from',addr
while True:
data=tcpCliSock.recv(BUFSIZ) # 对话(接收)
if not data:
break
tcpCliSock.send('[%s] %s' %(ctime(),data)) # 对话(发送)
print [ctime()],':',data
tcpCliSock.close()
tcpSerSock.close()
TCP客户端
在客户有了套接字之后,马上就可
以调用 connect()函数去连接服务器。连接建立后,就可以与服务器开始对话了。在对话结束后,客
户就可以关闭套接字,结束连接。
HOST 和 PORT 变量表示服务器的主机名与端口号。由于我们在同一台电脑上进行测试,所以 HOST
里放的是本机的主机名(如果你的服务器运行在其它电脑上,要做相应的修改)。端口号要与服务器
上的设置完全相同(不然就没办法通讯了)。
from socket import *
from time import ctime
HOST='localhost'
PORT=21567
BUFSIZ=1024
ADDR=(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:
break
print data
tcpCliSock.close()
socketserver服务器
SocketServer 是标准库中一个高级别的模块。封装起来了。
from SocketServer import (TCPServer as TCP,
StreamRequestHandler as SRH)
from time import ctime
HOST = ''
PORT = 12346
ADDR = (HOST, PORT)
class MyRequestHandler(SRH):
def handle(self):
print '...connected from:', self.client_address
self.wfile.write('[%s] %s' % (ctime(), self.rfile.readline()))
tcpServ = TCP(ADDR, MyRequestHandler)
print 'waiting for connection...'
tcpServ.serve_forever()
socketserver客户端
from socket import *
HOST = 'localhost'
PORT = 12346
BUFSIZE = 1024
ADDR = (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(BUFSIZE)
if not data:
break
print data.strip()
tcpCliSock.close()