溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python中socket多線程怎么讓客戶端與服務(wù)器連接

發(fā)布時間:2021-09-06 10:40:46 來源:億速云 閱讀:267 作者:chen 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“python中socket多線程怎么讓客戶端與服務(wù)器連接”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“python中socket多線程怎么讓客戶端與服務(wù)器連接”吧!

python socket多線程實現(xiàn)客戶端與服務(wù)器連接,供大家參考,具體內(nèi)容如下

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)
            # 給每個客戶端創(chuàng)建一個獨立的線程進行管理
            thread = threading.Thread(target=self.recv_msg, args=(client_socket,info))
            thread.setDaemon(True)
            thread.start()
    def recv_msg(self,client,info):
        # 提示服務(wù)器開啟成功
        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('客戶端斷開連接...')
                exit(-1)
                break
    def start_new_thread(self):
        """啟動新線程來接收信息"""
        thread = threading.Thread(target=self.accept_client, args=())
        thread.setDaemon(True)
        thread.start()

server服務(wù)器類,主要是監(jiān)聽以及接收客戶端的信息。

#實例化一個Flask節(jié)點
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()
    #獲取端口號
    port = args.port
    #實例化一個server類 并啟動
    py_server = Server()
    py_server.start_new_thread()
    #啟動Flask節(jié)點
    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

                # 制作報頭
                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ù)器斷開連接...')
                break
    def 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()

以上為客戶端程序的代碼。

下面是運行的結(jié)果:

服務(wù)器端:

python中socket多線程怎么讓客戶端與服務(wù)器連接

多個客戶端:

python中socket多線程怎么讓客戶端與服務(wù)器連接

python中socket多線程怎么讓客戶端與服務(wù)器連接

代碼實現(xiàn)還是蠻容易的,具體可以自行修改使用。

到此,相信大家對“python中socket多線程怎么讓客戶端與服務(wù)器連接”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI