day 28 socket的简单通信,通信循环,连接循环
什么是socket?
socket是基于tcp协议的网络通信工具,存在与应用层与传输层中间,socket传输的数据类型只能是"bytes"
socket简单的通信
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import socket #socket模式有两种一种是基于udp协议的,一种是基于tcp协议的 #基于tcp协议的socket # phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #造一个手机,括号内可以不写,默认是基于tcp协议的 # socket.AF_INET 网络socket socket.SOCK_STREAM: 基于TCP协议的socket phone.bind(('127.0.0.1',5000)) #绑定ip和端口(绑定电话卡) phone.listen(5) #服务端同一时刻可以接收的N个连接,同时可以回应5个连接 conn,addr = phone.accept() #等待电话 #conn:管道 ,addr:客户端的ip端口 from_client_mss = conn.recv(1024)#管道,用来接收数据,同时可以设置接收数据的大小 print(addr,"对你说:%s" % from_client_mss.decode("utf-8"),end= " ") #打印客户端发送的数据 conn.send("你好啊".encode("utf-8")) #"send" 返回(发送)给客户端消息 conn.close() #关闭tcp连接 phone.close() #关闭服务端
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import socket phone = socket.socket() #跟服务端一样先造一个手机 phone.connect(("127.0.0.1",5000)) phone.send("你好".encode("utf-8")) # conn,addr = phone.accept() #等待电话 from_server_mss = phone.recv(1024) #管道,用来接收数据,同时可以设置接收数据的大小 print(from_server_mss.decode("utf-8")) phone.close() #关闭手机
socket循环通信
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import socket phone = socket.socket() phone.bind(('127.0.0.1',5000)) phone.listen(5) conn,addr = phone.accept() while 1: try: from_client_mss = conn.recv(1024) print(from_client_mss.decode("utf-8")) content = input("请输入你要对客户端说的内容:") if content.upper() == "Q": break conn.send(content.encode("utf-8")) except Exception: break #或者pass略过异常 conn.close() phone.close()
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import socket phone = socket.socket() phone.connect(('127.0.0.1',5000)) while 1: content = input("请输入你要对服务端说的内容:") if content.upper() == "Q": break phone.send(content.encode("utf-8")) from_server_mss = phone.recv(1024) print(from_server_mss.decode("utf-8")) phone.close()
socket连接循环
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import socket phone = socket.socket() phone.bind(("127.0.0.1",5000)) phone.listen(5) while 1: conn,addr = phone.accept() while 1: try: from_client_mss = conn.recv(1024) print(addr,from_client_mss.decode("utf-8")) conn.send(from_client_mss + b'sb') except Exception: break conn.close()
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
client1.py import socket phone = socket.socket() phone.connect(('127.0.0.1',5000)) while 1: content = input("请输入你要对服务端说的内容:") if content.upper() == "Q": break phone.send(content.encode("utf-8")) from_server_mss = phone.recv(1024) print(from_server_mss.decode("utf-8")) phone.close() client2.py import socket phone = socket.socket() phone.connect(('127.0.0.1',5000)) while 1: content = input("请输入你要对服务端说的内容:") if content.upper() == "Q": break phone.send(content.encode("utf-8")) from_server_mss = phone.recv(1024) print(from_server_mss.decode("utf-8")) phone.close() client3.py import socket phone = socket.socket() phone.connect(('127.0.0.1',5000)) while 1: content = input("请输入你要对服务端说的内容:") if content.upper() == "Q": break phone.send(content.encode("utf-8")) from_server_mss = phone.recv(1024) print(from_server_mss.decode("utf-8")) phone.close()
socket远程执行命令
socket远程执行命令需要导入"subprocess"模块
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import socket import subprocess phone = socket.socket() phone.bind(("127.0.0.1",5000)) phone.listen(5) conn,addr = phone.accept() while 1: try: cmd = conn.recv(1024).decode("utf-8") obj = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, ) right_mss = obj.stdout.read() error_mss = obj.stderr.read() print(right_mss.decode("gbk"),error_mss.decode("gbk")) conn.send(right_mss + error_mss) except Exception: break conn.close() # shell: 命令解释器,相当于调用cmd 执行指定的命令。 # stdout:正确结果丢到管道中。 # stderr:错了丢到另一个管道中。 # windows操作系统的默认编码是gbk编码。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import socket phone = socket.socket() phone.connect(('127.0.0.1',5000)) while 1: cmd = input("请输入你要执行的命令:").strip() if cmd.upper() == "Q": break phone.send(cmd.encode("utf-8")) from_server_mss = phone.recv(1024) print(from_server_mss.decode("gbk")) phone.close()