通过套接字从列表中发送字符串以实时显示

2024-04-19 10:35:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我的列表包含连接到我的程序的客户端的IP地址和端口号。admin threads角色将每个当前连接的客户机的IP地址和端口号以这种字符串格式发送到管理客户机-例如“172.0.0.1 1234”。我可以有一些建议,如何发送每个地址,使它只显示当前连接的地址和端口号的管理客户端程序。你知道吗

addressList是一个全局变量列表

这是我的密码-

服务器

import threading
import socket
import math
import random
import ssl

addressList = []

def within(guess,goal,n):
    absValue = abs(guess - goal)
    if absValue <= n:
        return True
    else:
        return False

def HandleAdmin(adminSocket,):
    global addressList

    (c,a) = adminSocket.accept()
    ts = ssl.wrap_socket(c, certfile="5cc515_server.crt",
                             keyfile="5cc515_server.key",
                             server_side=True,
                             cert_reqs=ssl.CERT_REQUIRED,
                             ca_certs="5cc515-root-ca.cer")

    if ts.recv(80).decode() == 'Hello\r\n':
        ts.send('Admin-Greetings\r\n'.encode()) 

    if ts.recv(80).decode() == 'Who\r\n':
        for addr in addressList:
            ts.send(addr).encode()
    ts.close()
    return

def HandleClient(c,a):
    global addressList
    address, port = a
    address = str(address) + ' ' + str(port)
    addressList.append(address) 

    scoreCount = 0
    guess = 0
    if(c.recv(80).decode()) == 'Hello\r\n':
        c.send('Greetings\r\n'.encode())

        goal = random.randrange(1,21)

        while guess!= goal:
            guess =c.recv(80).decode()
            guess = int(guess[7:len(guess)-2])

            if guess == goal:
                c.send('Correct\r\n'.encode())
            elif within(guess, goal, 2) == True:
                c.send('Close\r\n'.encode())
            else:
                c.send('Far\r\n'.encode())
    c.close()
    return

clientSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
clientSocket.bind(("127.0.0.1",4000))
clientSocket.listen(5)

adminSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
adminSocket.bind(("127.0.0.1",4001))
adminSocket.listen(5)

handleAdminThread = threading.Thread(target = HandleAdmin,
                                            args = (adminSocket,))
handleAdminThread.start()

while True:
    (c,a) = clientSocket.accept()
    clientThread = threading.Thread(target = HandleClient, args = (c,a))
    clientThread.start()

管理客户端

import ssl
import socket

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

ts = ssl.wrap_socket(s, certfile="100298750.crt",
                        keyfile="100298750.key",
                        ca_certs="5cc515-root-ca.cer")

ts.connect(('127.0.0.1', 4001))

ts.send("Hello\r\n".encode())

addressList = []

if ts.recv(80).decode() == "Admin-Greetings\r\n":

    print("The players currently playing are:\n\n")
    ts.send("Who\r\n".encode())

    while True:
        print(ts.recv(80).decode())

Tags: importsendtruesslreturnifsocketencode
1条回答
网友
1楼 · 发布于 2024-04-19 10:35:32

在HandleClient函数中,c.close()表示客户端已断开连接。 因此,要让您的管理员知道他们这样做了,您必须从“地址列表”中删除该地址(因为当您发送“Who\r\n”时,您的地址列表被引用)。你知道吗

因此,在c.close()之后,您应该写:

addressList.remove(address)

相关问题 更多 >