""" '''基于tcp实现ntp服务''' import time from socket import * '''服务端''' ip_port = ('127.0.0.1', 8080) buffer_size = 1024 back_log = 10 tcp_server = socket(AF_INET, SOCK_STREAM) tcp_server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) tcp_server.bind(ip_port) tcp_server.listen(back_log) while True: conn, addr = tcp_server.accept() while True: try: data = conn.recv(buffer_size) # 此处data为编码后形式的数据 # print('客户端发送的消息:', data.decode('utf-8')) back_time = time.strftime(data.decode('utf-8')) # 需要对data进行解码变成字符串 conn.send(back_time.encode('utf-8')) # back_time为字符串形式,发送数据需要进行编码 except Exception: break conn.close() tcp_server.close() """
""" '''基于tcp实现ntp服务''' from socket import * '''客户端''' ip_port = ('127.0.0.1', 8080) buffer_size = 1024 tcp_client = socket(AF_INET, SOCK_STREAM) tcp_client.connect(ip_port) while True: msg = input('请输入:').strip() if not msg: continue tcp_client.send(msg.encode('utf-8')) data = tcp_client.recv(buffer_size) print('服务端发送的消息:', data.decode('utf-8')) tcp_client.colse() """
'''基于tcp实现远程执行命令''' import subprocess from socket import * '''服务端''' ip_port = ('127.0.0.1', 8000) back_log = 10 buffer_size = 1024 tcp_server = socket(AF_INET, SOCK_STREAM) tcp_server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) tcp_server.bind(ip_port) tcp_server.listen(back_log) while True: conn, addr = tcp_server.accept() while True: try: # 当客户端点击左下方stop按钮终止链接会报出异常,所以加入try防止程序崩溃 data = conn.recv(buffer_size) print('客户端发送的消息:', data.decode('utf-8')) if not data: break # 当客户端输入quit断开链接时,不加此判断会进入死循环 res = subprocess.Popen(data.decode('utf-8'), shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE,) # subprocess库中Popen是一个类,能对cmd命令进行执行;stdout是输出信息(命令正确),stderr是错误信息(命令错误),把这些信息放入管道, # 然后再通过管道进行拿取;在终端执行不放入管道的话,那么输出信息是直接给了屏幕,而屏幕也是一个程序; cmd_res = res.stdout.read() # 在管道中读取信息 if cmd_res: conn.send(cmd_res) else: conn.send(res.stderr.read()) except Exception: break conn.close() tcp_server.close()
'''基于tcp实现远程执行命令''' from socket import * '''客户端''' ip_port = ('127.0.0.1', 8000) buffer_size = 1024 tcp_client = socket(AF_INET, SOCK_STREAM) tcp_client.connect(ip_port) while True: msg = input('请输入:').strip() # 当获得的信息量比较多时,一次性展示不完,然后后续输入任何信息都可以再次展示其它未展示信息,不知道为什么--->在tcp这属于粘包现象,udp不会粘包,但也会因为recvfrom(1024)读取信息的大小有关 if not msg: continue if msg == 'quit': break tcp_client.send(msg.encode('utf-8')) data = tcp_client.recv(buffer_size) print('执行命令结果:', data.decode('gbk')) # subprocess.Popen(),由于编码没法设置,所以使用的是系统编码,win系统默认编码是gbk,所以此处解码也应是gbk tcp_client.close()