python之socket小程序案例

一,基于tcp协议通信的套接字程序(加上通信循环和连接循环)

A 服务端

import socket

#1、买手机
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #流式协议指的就是tcp协议
# print(phone)
# phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #就是它,在bind前加

#2、插手机卡
phone.bind((\'127.0.0.1\',8081)) #端口范围0-65535

#3、开机
phone.listen(5) #限制的是请求数,而非链接数

#4、等待电话连接
print(\'服务的启动......\')

while True: # 连接循环
    conn,client_addr=phone.accept() #(tcp的连接对象,客户端的ip和端口)
    # print(conn)
    print(client_addr)

    # 通信循环
    while True:
        try: #针对的是windows系统
            #5、收消息
            data=conn.recv(1024) #最大接收1024bytes
            if not data:break #针对的linux系统
            print(\'客户端数据:%s\' %data)
            #6、发消息
            conn.send(data.upper())
        except ConnectionResetError:
            break

    #7、挂电话
    conn.close()

#9、关机
phone.close()

B 客户端(可以多个,但是每次服务端只能处理一个,只有一个客户端断了才处理第二个客户端请求

import socket

#1、买手机
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #流式协议指的就是tcp协议

#2、打电话,建电话连接
phone.connect((\'127.0.0.1\',8081)) #ip和端口都是服务端的

while True:
    msg=input(\'>>>: \').strip() #msg=\'\'
    if not msg:continue
    #3、发消息
    phone.send(msg.encode(\'utf-8\'))
    print(\'has send====>\')

    #4、收消息
    data=phone.recv(1024)
    print(\'has recv====>\')
    print(data.decode(\'utf-8\'))

#5、挂电话
phone.close()

二,模拟ssh远程执行命令

A 服务端

from socket import *
import subprocess

phone=socket(AF_INET,SOCK_STREAM)
phone.bind((\'127.0.0.1\',8081))
phone.listen(5)

print(\'服务的启动......\')
# 连接循环
while True:
    conn,client_addr=phone.accept()
    print(client_addr)

    # 通信循环
    while True:
        try:
            cmd=conn.recv(1024)
            if not cmd:break

            obj=subprocess.Popen(cmd.decode(\'utf-8\'),shell=True,
                             stdout=subprocess.PIPE,
                             stderr=subprocess.PIPE
                             )

            stdout=obj.stdout.read()
            stderr=obj.stderr.read()

            # conn.send(stdout+stderr)
            print(len(stdout)+len(stderr))
            conn.send(stdout)
            conn.send(stderr)
        except ConnectionResetError:
            break
    conn.close()

phone.close()

B 客户端

from socket import *

phone=socket(AF_INET,SOCK_STREAM)
phone.connect((\'127.0.0.1\',8081))

while True:
    cmd=input(\'>>>: \').strip()
    if not cmd:continue
    phone.send(cmd.encode(\'utf-8\'))

    res=phone.recv(1024) #1024 * 8
    print(res.decode(\'gbk\'))


phone.close()