- 简单的套接字通讯
'''服务端'''
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()
- 加上通讯循环
'''服务端'''
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()
- 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()
- 机上链接循环
'''服务端'''
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()
- 模拟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()