创建一个tcp服务器
创建一个tcp服务器,步骤:
- 创建一个socket
- socket绑定本地地址和端口
- socket开始监听
- 无限循环随时准备接收消息
- 执行accept()等待客户端请求连接,返回一个专门负责与该客户端通信的socket以及该客户端的地址。
- 用新socket接收客户端发送的数据
- 用新socket发送对接收数据的处理结果
代码如下:
#!/usr/bin python
from socket import *
from time import ctime
import os
HOST=''
PORT=21567
BUFSIZE=1024
ADDR=(HOST, PORT)
#AF_INET表示ipv4,SOCK_STREAM表示TCP
tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)
while True:
print "waiting for connection..."
#接收客户端请求
tcpCliSock, addr = tcpSerSock.accept()
print "...Connected form:", addr
while True:
#接收客户端发送的数据
data = tcpCliSock.recv(BUFSIZE)
if not data:
break
try:
#在服务器上执行客户端发送的命令,并将输出结果发送到客户端
tcpCliSock.send('%s' % os.popen(data).read())
except Exception,e:
raise e
tcpCliSock.close()
tcpSerSock.close()
os.popen的说明
popen()函数是文件对象和system()函数的结合。工作方式和system()相同,但它可以创建一个指向程序的单向连接,并返回该连接。该连接是一个文件对象,这样做的作用是:
- popen执行的命令会重定向到popen要返回的文件对象,我们可以从中读命令的打印结果
- 如果程序要求输入,那么可以用“w”模式写入那个命令来调用popen。
参考服务器代码中popen的使用:
tcpCliSock.send('%s' % os.popen(data).read())
data是要执行的命令;
popen返回文件对象;
调用该对象的读操作,返回命令的打印内容。
创建一个客户端测试该服务器
- 创建一个与服务器socket相同类型的socket
- 连接到服务器地址和端口
- 发送数据,也就是要执行的命令
- 接收服务器的返回结果。
#!/usr/bin python
from socket import *
HOST='localhost'
PORT=21567
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(data)
data = tcpCliSock.recv(BUFSIZE)
if not data:
break
print data
tcpCliSock.close()