python socket多線程實(shí)現(xiàn)客戶端與服務(wù)器連接
python socket多線程實(shí)現(xiàn)客戶端與服務(wù)器連接,供大家參考,具體內(nèi)容如下
之前因?yàn)橐恍┳鳂I(yè)需要完成一個(gè)服務(wù)器監(jiān)聽(tīng)多個(gè)客戶端的程序,于是就用python寫(xiě)了這樣的程序。話不多說(shuō),直接上代碼。
server代碼:
import json import socket import threading import time import struct class Server(): def __init__(self): self.g_conn_pool = {} # 連接池 # 記錄客戶端數(shù)量 self.num =0 # 服務(wù)器本地地址 self.address = ('0.0.0.0', 8000) # 初始化服務(wù)器 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) # 給每個(gè)客戶端創(chuàng)建一個(gè)獨(dú)立的線程進(jìn)行管理 thread = threading.Thread(target=self.recv_msg, args=(client_socket,info)) thread.setDaemon(True) thread.start() def recv_msg(self,client,info): # 提示服務(wù)器開(kāi)啟成功 print('服務(wù)器已準(zhǔn)備就緒!') client.sendall("connect server successfully!".encode(encoding='utf8')) # 持續(xù)接受客戶端連接 while True: try: client.sendall(b'Success') while True: msg = client.recv(1024) msg_recv = msg.decode('utf-8') if not msg_recv: continue else: 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('客戶端斷開(kāi)連接...') exit(-1) break def start_new_thread(self): """啟動(dòng)新線程來(lái)接收信息""" thread = threading.Thread(target=self.accept_client, args=()) thread.setDaemon(True) thread.start()
server服務(wù)器類,主要是監(jiān)聽(tīng)以及接收客戶端的信息。
#實(shí)例化一個(gè)Flask節(jié)點(diǎn) app = Flask(__name__) @app.route('/') def hello(): return 'hello' if __name__ == '__main__': #創(chuàng)建解析器 from argparse import ArgumentParser parser = ArgumentParser() parser.add_argument('-p', '--port', default=5030, type=int, help='port to listen on') args = parser.parse_args() #獲取端口號(hào) port = args.port #實(shí)例化一個(gè)server類 并啟動(dòng) py_server = Server() py_server.start_new_thread() #啟動(dòng)Flask節(jié)點(diǎn) app.run(host='127.0.0.1',port=port)
Client代碼
class Client(): def __init__(self): #服務(wù)器ip與端口 self.server_address = ('127.0.0.1', 8000) self.num = 0 def recv_msg(self): print("正在連接服務(wù)器....") # 客戶端連接服務(wù)器 while True: try: self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #連接服務(wù)器 self.client_socket.connect(self.server_address) num = self.num # 制作報(bào)頭 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('客戶端已與服務(wù)器成功建立連接...') elif not msg_recv: continue else: recv_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) print( '服務(wù)器 ' + recv_time + ':\n') print(' ' + msg_recv + '\n') except: print('與服務(wù)器斷開(kāi)連接...') break def start_new_thread(self): """啟動(dòng)新線程來(lái)接收信息""" 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()
以上為客戶端程序的代碼。
下面是運(yùn)行的結(jié)果:
服務(wù)器端:
多個(gè)客戶端:
代碼實(shí)現(xiàn)還是蠻容易的,具體可以自行修改使用。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解決pandas .to_excel不覆蓋已有sheet的問(wèn)題
今天小編就為大家分享一篇解決pandas .to_excel不覆蓋已有sheet的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12pytorch加載語(yǔ)音類自定義數(shù)據(jù)集的方法教程
這篇文章主要給大家介紹了關(guān)于pytorch加載語(yǔ)音類自定義數(shù)據(jù)集的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Python檢測(cè)一個(gè)對(duì)象是否為字符串類的方法
這篇文章主要介紹了Python檢測(cè)一個(gè)對(duì)象是否為字符串類的方法,即檢測(cè)是一個(gè)對(duì)象是否是字符串對(duì)象,本文還講解了一個(gè)有趣的判斷方法,需要的朋友可以參考下2015-05-05