Python-3 网络编程

  1. 简单的套接字通讯
'''服务端'''

import socket

# 1、买手机
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 2、绑定手机卡
phone.bind(('127.0.0.1', 8080))

# 3、开机
phone.listen(5)

# 4、等电话链接
print('starting======')

conn, client = phone.accept()  # 拿到的是元祖

# 5、收、发消息
data = conn.recv(1024)  # 1、单位是:byte  2、1024代表最大接受1024bytes
print('客户端的数据', data)
conn.send(data.upper())

# 6、挂电话
conn.close()

# 7、关机
phone.close()

 '''客户端'''

import socket

# 1、买手机
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 2、绑定手机卡
phone.connect(('127.0.0.1', 8080))

# 3、发、收消息
phone.send('hello'.encode('utf-8'))
data = phone.recv(1024)
print(data)

# 4、关闭
phone.close()
  1. 加上通讯循环
'''服务端'''

import socket

phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

phone.bind(('127.0.0.1', 8080))

phone.listen(5)

print('starting======')

conn, client = phone.accept()

while True:  #
    data = conn.recv(1024)
    print('客户端的数据', data)
    conn.send(data.upper())

conn.close()

phone.close()
'''客户端'''

import socket

phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

phone.connect(('127.0.0.1', 8080))

while True:
    msg = input('>>').strip()
    phone.send(msg.encode('utf-8'))
    data = phone.recv(1024)
    print(data)

phone.close()
  1. bug修复
'''服务端'''

import socket

phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
phone.bind(('127.0.0.1', 8080))

phone.listen(5)

print('starting======')

conn, client = phone.accept()  # conn是套接字对象

while True:
    # 如果是Windows系统,客户端发来空数据,服务端会报错,所以需要做个异常处理
    try:
        data = conn.recv(1024) # 如果客户端发的是空消息,服务端收不到
        # 如果单方面的把客户端停止运行,linux系统下服务端会进入死循环,所以要做个if判断
        if not data:break
        print('客户端的数据', data)
        conn.send(data.upper())
    except ConnectionResetError:
        break

conn.close()

phone.close()
'''客户端'''

import socket

phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

phone.connect(('127.0.0.1', 8080))

while True:
    msg = input('>>').strip()
    if not msg:continue
    phone.send(msg.encode('utf-8'))
    data = phone.recv(1024)
    print(data.decode('utf-8'))

phone.close()
  1. 机上链接循环
'''服务端'''

import socket

phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
phone.bind(('127.0.0.1', 8085))

phone.listen(5)

print('starting======')
while True:
    conn, client = phone.accept()  # conn是套接字对象

    while True:
        # 如果是Windows系统,客户端发来空数据,服务端会报错,所以需要做个异常处理
        try:
            data = conn.recv(1024) # 如果客户端发的是空消息,服务端收不到
            # 如果单方面的把客户端停止运行,linux系统下服务端会进入死循环,所以要做个if判断
            if not data:break
            print('客户端的数据', data)
            conn.send(data.upper())
        except ConnectionResetError:
            break

    conn.close()

phone.close()

多个客户端

'''客户端1'''

import socket

phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

phone.connect(('127.0.0.1', 8085))

while True:
    msg = input('>>').strip()
    if not msg:continue
    phone.send(msg.encode('utf-8'))
    data = phone.recv(1024)
    print(data.decode('utf-8'))

phone.close()
'''客户端2'''

import socket

phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

phone.connect(('127.0.0.1', 8085))

while True:
    msg = input('>>').strip()
    if not msg:continue
    phone.send(msg.encode('utf-8'))
    data = phone.recv(1024)
    print(data.decode('utf-8'))

phone.close()
  1. 模拟ssh远程执行命令
'''服务端'''

import socket
import subprocess

phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
phone.bind(('127.0.0.1', 8090))

phone.listen(5)

print('starting======')
while True:
    conn, client_addr = phone.accept()  # conn是套接字对象
    print(client_addr)
    while True:  # 通讯循环
        # 如果是Windows系统,客户端发来空数据,服务端会报错,所以需要做个异常处理
        try:
            # 1、收命令
            cmd = conn.recv(1024)  # 如果客户端发的是空消息,服务端收不到
            # 如果单方面的把客户端停止运行,linux系统下服务端会进入死循环,所以要做个if判断
            if not cmd: break
            # 2、执行命令,拿到结果
            obj = subprocess.Popen(cmd.decode('utf-8'), shell=True,
                                   stdout=subprocess.PIPE,
                                   stderr=subprocess.PIPE)
            stdout = obj.stdout.read()
            stderr = obj.stdout.read()
            # 3、把命令的结果返回给客户端
            print(len(stdout) + len(stderr))
            conn.send(stdout + stderr)  # 可以优化
        except ConnectionResetError:
            break

    conn.close()

phone.close()

'''客户端'''

import socket

phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

phone.connect(('127.0.0.1', 8090))

while True:
    # 1、发命令
    cmd = input('>>').strip()
    if not cmd:continue
    phone.send(cmd.encode('utf-8'))
    # 2、拿命令的结果,并打印
    data = phone.recv(1024) # 1024是一个坑
    print(data.decode('GBK'))

phone.close()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值