网络编程之socket
网络编程
第一阶段:简单版
客户端
import socket
# 买手机
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 买卡
addr = ('127.0.0.1',8000)
# 手机上安装卡
client.connect(addr)
# 发送消息
client_msg = "hello world"
client.send(bytes(client_msg.encode('utf-8')))
# 接受消息
data = client.recv(1024)
print(data.decode("utf-8"))
# 关闭连接
client.close()
服务端
import socket
# 买手机
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 买卡
addr = ('127.0.0.1',8000)
# 手机上安装卡
server.bind(addr)
# 设置手机最多能同时接五个电话
server.listen(5)
# 开始等待电话
conn,addr = server.accept()
# 接受client的电话
client_msg = conn.recv(1024)
print(client_msg.decode("utf-8"))
# server回复消息给client
msg = "我是服务端"
conn.send(bytes(msg.encode('utf-8')))
# 关闭连接
conn.close()
server.close()
PS:数据在传输的过程中,使用是二进制,所以我们需要将客户端,服务端中的数据转化为二进制传输(客户端:13行,服务端:24行),转化前需要使用utf8格式编码。
第二阶段:交互式发送
客户端
import socket
# 买手机
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 买卡
addr = ('127.0.0.1',8000)
# 手机上安装卡
client.connect(addr)
while True:
# 发送消息
client_msg = input("请输入发送的消息>>>>")
client.send(bytes(client_msg.encode('utf-8')))
# 接受消息
data = client.recv(1024)
print("服务端:",data.decode("utf-8"))
服务端
import socket
# 买手机
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 买卡
addr = ('127.0.0.1',8000)
# 手机上安装卡
server.bind(addr)
# 设置手机最多能同时接五个电话
server.listen(5)
# 开始等待电话
conn,addr = server.accept()
while True:
# 接受client的电话
client_msg = conn.recv(1024)
print(client_msg.decode('utf-8'))
# server回复消息给client
msg = "我是服务端"
conn.send(bytes(msg.encode('utf-8')))
此时我们可以实现客户端与服务端交互式发送消息,但是存在一些问题:
a. 如果此时有另外一个客户端连接到服务端,客户端发送消息不会被接受
b. 当客户端关闭后,服务端会异常退出.
第三阶段:终极版
客户端
import socket
# 买手机
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 买卡
addr = ('127.0.0.1',8000)
# 手机上安装卡
client.connect(addr)
while True:
# 发送消息
client_msg = input("请输入发送的消息>>>>")
client.send(bytes(client_msg.encode('utf-8')))
# 接受消息
data = client.recv(1024)
print("服务端:",data.decode("utf-8"))
服务端
import socket
# 买手机
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 买卡
addr = ('127.0.0.1',8000)
# 手机上安装卡
server.bind(addr)
# 设置手机最多能同时接五个电话
server.listen(5)
while True:
# 开始等待电话
conn, addr = server.accept()
while True:
try:
# 接受client的电话
client_msg = conn.recv(1024)
print(client_msg.decode('utf-8'))
# server回复消息给client
msg = "我是服务端"
conn.send(bytes(msg.encode('utf-8')))
except Exception:
break
此时当客户端退出后,再连接进来一个客户端 服务端也能正常工作!
实现在客户端输入指令,服务端负责执行指令,同时返回结果
客户端
import socket
# 买手机
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 买卡
addr = ('127.0.0.1',8000)
# 手机上安装卡
client.connect(addr)
while True:
# 发送消息
client_msg = input("请输入发送的消息>>>>")
client.send(bytes(client_msg.encode('utf-8')))
# 接受消息
data = client.recv(2048)
print("服务端:",data.decode('gbk')) # 接受的编码为gbk,所以解码需要gbk
服务端
import socket
import subprocess
# 买手机
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 买卡
addr = ('127.0.0.1',8000)
# 手机上安装卡
server.bind(addr)
# 设置手机最多能同时接五个电话
server.listen(5)
while True:
# 开始等待电话
conn, addr = server.accept()
while True:
try:
# 接受client的电话
client_msg = conn.recv(1024)
command = client_msg.decode('utf-8')
# 执行命令的模块
obj = subprocess.Popen(command,
shell=True,
stderr=subprocess.PIPE,
stdout=subprocess.PIPE
)
stdout = obj.stdout.read()
stderr = obj.stderr.read()
print(stderr, stdout)
# server回复消息给client
msg = stdout + stderr
conn.send(msg) # window输出的内容为编码为gbk
except Exception:
break