python|python socket多线程实现客户端与服务器连接

python socket多线程实现客户端与服务器连接,供大家参考,具体内容如下
之前因为一些作业需要完成一个服务器监听多个客户端的程序,于是就用python写了这样的程序。话不多说,直接上代码。
server代码:

import jsonimport socketimport threadingimport timeimport structclass Server():def __init__(self):self.g_conn_pool = {}# 连接池# 记录客户端数量self.num =0# 服务器本地地址self.address = ('0.0.0.0', 8000)# 初始化服务器self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)self.server_socket.bind(self.address)self.server_socket.listen(128)def accept_client(self):"""接收新连接"""while True:client_socket, info = self.server_socket.accept()# 阻塞,等待客户端连接print(client_socket,port)# 给每个客户端创建一个独立的线程进行管理thread = threading.Thread(target=self.recv_msg, args=(client_socket,info))thread.setDaemon(True)thread.start()def recv_msg(self,client,info):# 提示服务器开启成功print('服务器已准备就绪!')client.sendall("connect server successfully!".encode(encoding='utf8'))# 持续接受客户端连接while True:try:client.sendall(b'Success')while True:msg = client.recv(1024)msg_recv = msg.decode('utf-8')if not msg_recv:continueelse:recv_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())print('客户端 ' + recv_time + ':\n')print(' ' + msg_recv + '\n')except Exception as e:print('客户端断开连接...')exit(-1)breakdef start_new_thread(self):"""启动新线程来接收信息"""thread = threading.Thread(target=self.accept_client, args=())thread.setDaemon(True)thread.start()

server服务器类,主要是监听以及接收客户端的信息。
#实例化一个Flask节点app = Flask(__name__)@app.route('/')def hello():return 'hello'if __name__ == '__main__': #创建解析器from argparse import ArgumentParserparser = ArgumentParser()parser.add_argument('-p', '--port', default=5030, type=int, help='port to listen on')args = parser.parse_args()#获取端口号port = args.port#实例化一个server类 并启动py_server = Server()py_server.start_new_thread()#启动Flask节点app.run(host='127.0.0.1',port=port)

Client代码
class Client():def __init__(self):#服务器ip与端口self.server_address = ('127.0.0.1', 8000)self.num = 0def recv_msg(self):print("正在连接服务器....")# 客户端连接服务器while True:try:self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#连接服务器self.client_socket.connect(self.server_address)num = self.num# 制作报头header_dic = {'filename': num}header_bytes = json.dumps(header_dic).encode('utf-8')self.client_socket.send(struct.pack('i', len(header_bytes)))self.client_socket.send(header_bytes)#接收信息while True:msg_recv = self.client_socket.recv(1024).decode('gbk')print(msg_recv)if msg_recv == 'Success':print('客户端已与服务器成功建立连接...')elif not msg_recv:continueelse:recv_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())print( '服务器 ' + recv_time + ':\n')print(' ' + msg_recv + '\n')except:print('与服务器断开连接...')breakdef start_new_thread(self):"""启动新线程来接收信息"""thread = threading.Thread(target=self.recv_msg, args=())thread.setDaemon(True)thread.start()def main():wf = Client()wf.start_new_thread() while True:a = input()wf.client_socket.send(a.encode('utf-8'))if __name__ == '__main__':main()

以上为客户端程序的代码。
下面是运行的结果:

服务器端:
python|python socket多线程实现客户端与服务器连接
文章图片

多个客户端:
python|python socket多线程实现客户端与服务器连接
文章图片

python|python socket多线程实现客户端与服务器连接
文章图片

代码实现还是蛮容易的,具体可以自行修改使用。
【python|python socket多线程实现客户端与服务器连接】以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    推荐阅读