为什么一种方法有效而另一种类似的方法无效?

Why one method works but another similar method does not work?

我开始学习套接字,我在 Youtube 上看到一个解释它的视频,我拿了一些代码,但有些行我没看懂。

 import socket
import threading

HOST = 'localhost'
PORT = 9090
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((HOST, PORT))
server.listen()
# Lists For Clients and Their Nicknames
clients = []
nicknames = []
#send message to all clients
def broadcast(message):
    for client in clients:
        client.send(message)
def handle(client):
    while True:
        try:
            # Broadcasting Messages
            message = client.recv(1024)
            broadcast(message)
        except:
            # Removing And Closing Clients
            index = clients.index(client)
            clients.remove(client)
            client.close()
            nickname = nicknames[index]
            broadcast('{} left!'.format(nickname).encode('ascii'))
            nicknames.remove(nickname)
            break 
def receive():
    while True:
        # Accept Connection
        client, address = server.accept()
        print("Connected with {}".format(str(address)))
        # Request And Store Nickname
        client.send('NICK'.encode('ascii'))
        client.send('check it'.encode('ascii'))
        nickname = client.recv(1024).decode('ascii')
        nicknames.append(nickname)
        clients.append(client)
        # Print And Broadcast Nickname
        print("Nickname is {}".format(nickname))
        broadcast("{} joined!".format(nickname).encode('ascii'))
        client.send('Connected to server!'.encode('ascii'))
        # Start Handling Thread For Client
        thread = threading.Thread(target=handle, args=(client,))
        thread.start()
receive()

在 while 循环中,我不明白为什么客户端会得到文本 - “check it” client.send('check it'.encode('ascii')) 但他没有收到文本 - “NICK” - client.send('NICK'.encode('ascii'))

您的客户端代码应该使用 s.recv 来检查 NICK 并发回客户端响应,例如:

s.send(input(s.recv(1024).decode('ascii')).encode('ascii'))
  1. 它接收 NICK,
  2. 提示通过input要求客户输入和
  3. 将用户输入发送回服务器。

这对我来说效果很好。这可能是 OP 未包含的客户端代码的问题。它适用于下面的客户端代码。

import socket
import threading

# separate thread to ask user for input
def send_message(s):
    while True:
        msg = input('message: ')
        if msg == 'exit':
            s.close()
            break
        s.send(msg.encode('ascii'))


def connect():
    s = socket.socket()
    address = '127.0.0.1'
    port = 8080  # port number
    s.connect((address, port))

    # receives 'NICK', prompts user for input, sends input back to server
    s.send(input(s.recv(1024).decode('ascii')).encode('ascii'))

    # starts thread to prompt user for messages to broadcast to other users via server
    thread = threading.Thread(target=send_message, args=(s,))
    thread.start()

    # check for messages from the server and print them
    while True:
        try:
            print(s.recv(1024).decode('ascii'))
        except:
            break


if __name__ == '__main__':
    connect()