本次实验设计两个方面的代码,第一个是客户端,代码如下:
import os from socket import * c = socket(AF_INET,SOCK_STREAM) c.connect(('127.0.0.1',6668)) while 1: cmd = raw_input('please put something :') if cmd=='exit': c.close() break c.send(cmd) data = c.recv(1024) print data
在本次代码中,我们向服务端利用c.connect发送连接请求,端口为6668,之后为了方便多次输入指令,我们使用while 1;然后每次输入的值赋给cmd,之后将cmd的内容发送给接收方,之后收到接收方的回复后输出。
第二个是服务端
而除了客户端,这里最重要的部分就要数服务端了。
在多线程的编程环境下,服务端要实现监听与创建新的线程。所以在这里我放上代码:
#coding:utf-8 from socket import * from os import * from threading import Thread def Threader(sock): cmd = sock.recv(1024) if cmd == 'exit': sock.close() exit() result = popen(cmd).read() sock.send(result) s = socket(AF_INET,SOCK_STREAM) s.bind(('',6668)) s.listen(1) while True: sock,addr = s.accept() print 'Connect by ',addr t = Thread(target=Threader,args=(sock,)) t.start()
在这里,我们调用了thread库,然后将创建新的连接封装成Threader函数,之后利用while,当有请求发送给服务端时,服务端调用Thread函数创建新的线程,然后该线程中创建新的通信函数,这样也就实现了多线程通信,也就是说我可以创建多个客户端与一个服务端,然后实现多个客户端操作同一个服务端的可能。
不过后来我发现,我写的服务端代码有些小的漏洞,在我们进行命令发出的时候,我们不能够多次给服务端发送命令。所以我在源代码函数中添加了while 1;来实现多次命令的发出
def Threader(sock):
while 1:
cmd = sock.recv(1024)
if cmd == 'exit':
sock.close()
exit()
result = popen(cmd).read()
sock.send(result)