本次實驗設計兩個方面的代碼,第一個是客戶端,代碼如下:
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)
