基于tcp协议的套接字
版本一:缺陷(输入为空,或者断开链接报错,无法实现通信循环、出现粘包问题、无法并发接受客户端请求)
client
import socket
context=input("请输入要传输的内容:").strip()
client=socket.socket(socket.AF_INET,socket.STREAM)
client.connect("127.0.0.1",8080)
client.send(context.encode("utf-8"))
msg=client.recv(1024)
print(msg.decode("utf-8"))
client.close()
** server**
import socket
server=socket.socket(socket.AF_INET,socket.STREAM)
server.bind(("127.0.0.1",8080))
server.listen(5)
conn,addr=server.accept()
msg=conn.recv(1024)
conn.send(msg.upper())
conn.close()
server.close()
版本二:解决通信循环,断开链接或者输入空格报错的问题
client
import socket
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(("127.0.0.1",8000))
while True:
cmd=input(">>>:").strip()
if len(cmd)==0:continue
if cmd=="q":break
client.send(cmd.encode("cp936"))
print(client.recv(1024).decode("cp936"))
client.close()
server
import socket
import subprocess
server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(("127.0.0.1",8000))
server.listen(3)
while True:
conn,addr=server.accept()
print(conn,addr)
while True:
cmd=conn.recv(1024)
res=subprocess.run(cmd.decode("utf8"),shell=True,
stderr=subprocess.PIPE,
stdout=subprocess.PIPE
)
conn.send(res.stdout)
conn.send(res.stderr)
conn.close()
server.close()
版本三:解决粘包问题、多客户端同时链接的问题
解决粘包问题socketserver模块