TCP/IP 传输 分服务器端和客户端。
要实现一个支持高并发、高性能的server服务器其实很难。
但原理上就这么6步:本文简而示之,给大家一个参考吧。
针对多客户端的处理,我这只写了个while循环。
1.创建socket实例
2.绑定 bind(,)
3.监听 listen()
4.接收 accept()
5.连接 conn
6.关闭 close()
import socket
import os,subprocess
def socketServerTest():
myserver = socket.socket() #1.创建socket实例
myserver.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
myserver.bind(("localhost",9090)) #2.绑定ip port
myserver.listen() #3.监听
while True:
print("等待客户端的连接...")
conn,addr = myserver.accept() # 4.接受并建立与客户端的连接,程序在此处开始阻塞,只到有客户端连接进来...
print("新连接:", addr)
while True:
data = conn.recv(1024) #5.连接并接收数据
if not data:
print("客户端断开了...")
break
# 如果想让服务器做处理,就在这里加点代码 比如SSH 把接收到的数据再返回去
##############################################################
# res = os.popen(data.decode()).read() #py3 里socket发送的只有bytes,os.popen又只能接受str,所以要decode一下
res = subprocess.Popen(data, shell=True, stdout=subprocess.PIPE).stdout.read() # 跟上面那条命令的效果是一样的
if len(res) == 0:
res = "cmd exec success,has not output!".encode("utf-8")
conn.send(str(len(res)).encode("utf-8")) # 发送数据之前,先告诉客户端要发多少数据给它
print("等待客户ack应答...")
client_final_ack = conn.recv(1024) # 等待客户端响应
print("客户应答:", client_final_ack.decode())
print(type(res))
conn.sendall(res) # 发送端也有最大数据量限制,所以这里用sendall,相当于重复循环调用conn.send,直至数据发送完毕
##############################################################
print("收到消息:", data)
conn.send(data.upper())
myserver.close() #6.关闭
def main():
print("socketServerTest")
socketServerTest()
if __name__ == '__main__':
main()