今日内容大纲
- 单次通信
- 通信循环
- 链接、通信循环
- 执行远端命令
1.单次通信
-
listen(n)
import socket # 基于网络的TCP协议 server = socket.socket() server.bind(('127.0.0.1',8848))# 8848为端口号计算机共有65535个端口号。 # 127.0.0.1回环地址,只允许本机自己连接 # 待机等待其他人连接 server.listen(5) conn, addr = server.accept() # 阻塞,当有客户端连接,将运行之后代码 print(111)
listen(n) 是控制客户端链接服务端的具体数量,也就是控制的进入半链接池的客户端的数量。
具体运行时,连入数量为(n+1)个,一个与服务端正常通信,n和与服务端处于半连接状态,等待第一个与服务端通信完成后,第二个再与服务端通信,排队顺序为客户端的连入顺序。-
没有启动服务端,而先启动客户端会报错
-
先启动服务端,在启动客户端
-
服务端代码
import socket server = socket.socket() server.bind(('127.0.0.1',8848)) server.listen(5) print(1111) ret = server.accept() conn, addr = ret #分别赋值, conn指代的是管道,addr客户端地址 from_client_data = conn.recv(1024) print(f'{addr}客户端的消息:{from_client_data.decode("utf-8")}') conn.send(from_client_data.upper()) conn.close() server.close()客户端
-
客户端代码
import socket client = socket.socket() client.connect(('127.0.0.1',8848)) client.send('hello'.encode('utf-8')) from_server_data = client.recv(1024) print(from_server_data) client.close()
-
-
2. 通信循环
-
服务端代码
import socket server = socket.socket() server.bind('127.0.0.1',8848) server.listen(5) conn, addr = server.accept() while 1: try: from_client_data = conn.recv(1024) if from_client_data.upper() ==b'Q': break print(f'{addr}客户端的消息:{from_client_data.decode("utf-8")}') to_client_data = input('>>') conn.send(to_client_data.encode('utf-8')) except ConnectionResetError: break conn.close() server.close()
-
客户端代码
import socket client = socket.socket() client.connect(('127.0.0.1',8848)) while 1: to_server_data = input('>>') client.send(to_server_data.encode('utf-8')) if to_server_data.upper() == 'Q': break from_server_data = client.recv(1024) print(f"服务端说:{from_server_data.decode('utf-8')}") client.close()
3. 链接+ 通讯循环
-
服务端代码
import socket server = socket.socket() server.bind(('127.0.0.1',8848)) server.listen(5) while 1: conn, addr = server.accept() while 1: try: from_client_data = conn.recv(1024) if from_client_data.upper() == b'Q': break print(f'{addr[1]}客户端的消息:{from_client_data.decode("utf-8")}) to_client_data = input('>>') conn.send(to_client_data.encode('utf-8')) except ConnectionResetError: break conn.close() server.close()
-
客户端代码
import socket client = socket.socket() client.connect(('127.0.0.1',8848)) while 1: to_server_data = input('>>') client.send(to_server_data.encode('utf-8')) if to_server_data.upper() == 'Q': break from_server_data = client.recv(1024) print(f"服务端说:{from_server_data.decode('utf-8')}") client.close()
4. 执行远端命令
-
subprocess
执行命令,获取结果
import subprocess obj = subprocess.Popen('ipconfig', shell = True, stdout = subprocess.PIPE, stderr = subprocess.PIPE) print(obj.stdout.read().decode('gbk')) # 正确命令 print(obj.stderr.read().decode('gbk')) # 错误命令
-
服务端代码
import socket import subprocess server = socket.socket() server.bind(('127.0.0.1',8848)) server.listen(5) while 1: conn, addr = server.accept() while 1: try: from_client_cmd = conn.recv(1024) if from_client_cmd.upper() == b'Q' break obj = subprocess.Popen(from_client_cmd.decode('utf-8'), shell = True, stdout = subprocess.PIPE, stderr = subprocess.PIPE) result = obj.stdout.read().decode('gbk') + obj.stderr.read().decode('gbk') conn.send(result.encode('utf-8')) except ConnectionResetError: break conn.close() server.close()
-
客户端代码
import socket client = socket.socket() client.connect(('127.0.0.1',8848)) while 1: to_server_data = input('请输入命令>>') client.send(to_server_data.encode('utf-8')) if to_server_data.upper() == 'Q': break from_server_data = client.recv(1024) print(f'结果:{from_server_data.decode("utf-8")') client.close()