下面是客户端的示例代码,客户端的输出重定向到套接字,同时使用该套接字作为标准输入,这样通过远端的服务器就可以接受到客户端的输出,也可以通过套接字向客户端输入数据:
import sys
import socket
# 首先窗口一个套接字,连接到某一个服务器
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('192.168.128.100', 50000))
# 得到套接字对应的文件, 可以读写,并且不进行缓冲
f = s.makefile("rw", 0)
# 使用 sys 进行重定向
sys.stdin = f
sys.stdout = f
sys.stderr = f
# 下面是你的程序代码,其中 print 语句以及其他写向控制台的语句都会输出到该套接字中,例如
print ‘abc’
# 如果需要得到标准输入,那么
x = raw_input(">>>")
print "echo:", x
...
# 最后恢复标准输入和输出设备
sys.stdin = sys.__stdin__
sys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__
f.close()
s.close()
##
## 下面是服务器端的代码
def start_server(port):
"""创建套接字"""
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
name = socket.gethostname()
host = socket.gethostbyname(name)
s.bind((host, port))
s.listen(1)
# 等待客户端的连接
s1, addr = s.accept()
# 启动接受数据线程,也就是用来读重定向到标准输出的数据,这里只是简单的把
# 客户端的输出显示在服务器的标准输出上
t = threading.Thread(target=read_stdout_thread, args=(s1,))
t.start()
# 模拟标准输入,向客户端发送数据; 对客户端而言,相当于得到键盘输入 'xyz'
s1.sendall('xyz')
def read_stdout_thread(s):
while 1:
ch = s.recv(1)
sys.stdout.write(ch)
if not ch: break