socket 简单通信

一.基于socket简单通信:

服务端:
1.创建一个服务端:
import socket
phone = socket.socket()
###括号内不输入,默认为family = AddressFamily.AF_INET
type = SocketKind.SOCK_STREAM
proto = 0
2.为服务端创建IP地址及端口号
phone.bind((‘127.0.0.1’,8080))
###ip地址应为服务端ip,127.0.0.1是本地回环地址

3.为服务端创建半链接池
phone.listen(5)
###括号内是半链接池内的个数
4.等待接收客户端的链接
conn,client_address = phone.accept()
###conn为tcp协议中的双层链接,client_address 是客户端ip地址及端口
5.收发消息
data = conn.recv(1024) ### 括号内是单次最多接收的字符数
print(‘收到客户端信息:’,data.decode(‘utf-8’)) ###客户端传过来的是二进制,需要解码
conn.send(‘要发给客户端的字符’.encode(‘utf-8’)) ###发送给客户端也需要编码成二进制
6.关闭
conn.close()
phone.close()

客户端:
1.创建一个客户端
phone = socket.socket()
2.与服务端建立链接
phone.connet((‘127.0.0.1’,8080))
3.发/收消息
phone.send(‘你好’.encode(‘utf-8’))
data = phone.recv(1024)
print(‘服务端发来的信息:’,data.decode(‘utf-8’))
4.关闭
phone.close()

二.加上循环

在通话中,并不是接收一次信息就直接关闭的,故需要加上循环,让其不被关闭,服务端需要在第4,5步加入while True循环,客户端在第三步加入while True循环.
另一个问题,加好循环后,服务端默认conn链接已经建好了,若客户端突然非正常的关闭,如断网等,服务端就会报错,
ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。此时就需要添加一个异常处理
异常处理时,在windows系统中,用try…except…在linux系统中,用if len(data) == 0:break即可
服务端格式:

import socket
phone = socket.socket()
phone.bind(('127.0.0.1',8080))
phone.listen(5)

while True:
    conn, addr = phone.accept()
    while True:
        try:
            data = conn.recv(1024)
            print('接收到%s信息:'%addr[0],data.decode('utf-8'))
            conn.send('信息已收到'.encode('utf-8'))
        except Exception:
            break
        conn.close()
phone.close()

三.远程执行命令

要使客户端发的信息让服务端执行系统命令,需要用到subprocess模块
obj = subprocess.Popen(data.decode(‘utf-8’),
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
res=obj.stdout.read()+obj.stderr.read()
解析:客户端将二进制data传入服务端,服务端调用subprocess模块,先将data解码成原格式,shell= True 是输入shell中运行,将运行正确的结果存为stdout ,将运行错误的结果存为stderr,返回称为obj对象,res 是运行失败还有成功的结果(gbk编码)
此时,传回客户端的信息是gbk编译的,所以解码也需要gbk

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值