簡體   English   中英

如何從服務器發送請求斷開連接到所有客戶端和服務器仍然存在(python套接字)

[英]How to send request disconnect from server to all clients and server still live (python socket)

當我斷開服務器中的所有客戶端時,服務器不會繼續直播。 我該如何為生活服務器做些什么

import socket, threading, tkinter

服務器

import socket, threading, tkinter
import time

def sendDisconnectAll(my_clients):
    for client in my_clients:
        conn = client[0]
        conn.sendall('Disconnect'.encode('utf8'))
        conn.close()
    
def handle_client(conn, addr):
    while True:
        try:
            request_from_clients = conn.recv(1024).decode('utf8') #sample request
            print(request_from_clients)
            if request_from_clients == 'SignIn':
                conn.sendall('Accept Sign in'.encode('utf8'))
        except:
            print('Client has been shutdown')
            break

my_clients = []
def live_server():
    global thr
    global s
    while True:
        try:
            conn, addr = s.accept()
            my_clients.append((conn, addr))
            thr = threading.Thread(target=handle_client, args=(conn, addr))
            thr.daemon = True
            thr.start()
        except:
            print("Error")

HOST = '127.0.0.1'
PORT = 8000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen()
print('HOST: ', HOST)
print('PORT: ', PORT)

thr = threading.Thread(target=live_server)
thr.daemon = True
thr.start()
count_time = time.time()
while True:
    now = time.time()
    if (int(now - count_time) + 1) % 10 == 0:       #Disconnect all clients after 10 seconds
        count_time = now
        request = 'Disconnect'
        print('Disconnec all')
        sendDisconnectAll(my_clients)

客戶

import socket, threading
import tkinter as tk
from tkinter import *

def signIn():
    global client
    request = 'SignIn'
    try:
        client.sendall(request.encode('utf8'))
        client.recv(1024).decode('utf8')
    except:
        print('Server has been shutdown')

IP = input("Enter IP: ")
PORT = input("Enter PORT: ")

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
    client.connect((IP, int(PORT)))
except:
    print("Can't connect to server")
    client.close()
def live_client():
    global client
    while True:
        print(client.recv(1024).decode('utf8'))
thr = threading.Thread(target=live_client)
thr.daemon = True
thr.start()
app = Tk()
app.title('CLIENT')
but_connect = tk.Button(app, text="SIGN IN",
                            width=20, command=signIn)
but_connect.pack(pady=6)
app.mainloop()

謝謝!

問題是您只將客戶端添加到my_clients列表中。 讓我們看看服務器中發生了什么:

  • 服務器啟動
  • 它接收一個客戶並將其添加到my_clients
  • 在下一次斷開所有操作時,該客戶端的套接字已關閉,但客戶端仍保留在列表中
  • 在以下斷開所有操作時,服務器的主線程嘗試寫入已關閉的套接字並引發異常
  • 由於所有其他線程都是守護線程,因此應用程序結束。

關閉所有客戶端 sockets 后必須清除my_clients列表:

def sendDisconnectAll(my_clients):
    for client in my_clients:
        conn = client[0]
        conn.sendall('Disconnect'.encode('utf8'))
        conn.close()
    my_clients.clear()

當心:我沒有看客戶端代碼......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM