You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 3.0 Socket聊天室代码求助:缩进错误与功能缺陷

Fixing Your Python 3 Socket Chat Room Issues: Indentation, Sender Names, and Loop Logic

Let’s walk through fixing all the issues with your socket chat room one by one—you’ve got a few indentation bugs, missing sender identification, and broken loop logic to sort out. Here’s how to get everything working smoothly:

1. Fixing Indentation & Core Logic Errors in server.py

Your original server.py had multiple indentation mismatches, undefined variables, and redundant socket setup code. Let’s rewrite it with clean structure and correct logic:

import socket

def handle_client(clientsocket, address):
    print(f"New connection from: {address[0]}:{address[1]}")
    # Keep the connection open to receive multiple messages
    while True:
        # Receive data from the client
        rd = clientsocket.recv(512)
        # If no data is received, the client disconnected
        if not rd:
            print(f"Client {address} disconnected")
            break
        # Decode the received bytes to string
        data = rd.decode()
        print(f"Received from {address[0]}:{address[1]}: {data}")
        # Send a response back with the sender's address as identification
        response = f"[{address[0]}:{address[1]}] {data}"
        clientsocket.send(response.encode())
    # Close the socket when the client disconnects
    clientsocket.close()

def main():
    # Set up the main server socket
    serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    serversocket.bind(('localhost', 8123))
    serversocket.listen()
    print("Server listening on localhost:8123")
    
    # Continuously accept new client connections
    while True:
        clientsocket, address = serversocket.accept()
        # For multi-client support, uncomment the lines below and import threading
        # import threading
        # threading.Thread(target=handle_client, args=(clientsocket, address)).start()
        # For single-client testing, just call handle_client directly
        handle_client(clientsocket, address)

if __name__ == "__main__":
    main()

Key Fixes:

  • Indentation Errors: Moved if not data: break into a proper while loop, fixed misplaced indentation on send/close logic, and removed undefined output references.
  • Redundant Socket Setup: Removed the duplicate serversocket creation inside the accept loop (this was breaking your server after one connection).
  • Proper Connection Handling: Added a dedicated handle_client function to manage each client’s session, with a loop to keep receiving messages until the client disconnects.

2. Adding Sender Names to client.py

Your client was working but couldn’t show who sent messages. With the updated server sending back the client’s address (or username, if you add that), we can clean up the client code to display sender info properly:

import socket

def main():
    clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    clientsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    clientsocket.connect(('localhost', 8123))
    
    # Optional: Let users set a custom username (uncomment to use)
    # username = input("Enter your username: ")
    # clientsocket.send(username.encode())
    
    message = input('Enter your message (type "q" to quit): ')
    while message != 'q':
        clientsocket.send(message.encode())
        # Receive and print the server's response with sender info
        data = clientsocket.recv(512).decode()
        print(f"Received: {data}")
        message = input("Enter your message (type 'q' to quit): ")
    
    # Cleanly close the connection
    clientsocket.close()
    print("Disconnected from server")

if __name__ == "__main__":
    main()

Key Fixes:

  • Removed Broken Code: Deleted the redundant payload lines at the end (your client was already closed when those ran, causing errors).
  • Sender Info Display: Now shows the server’s response, which includes the sender’s IP/port (or username, if you enable that feature).

3. Fixing Server Loop Logic

The original server crashed after 2 messages because it lacked a loop to handle ongoing communication with a client. The updated handle_client function includes a while True loop that keeps listening for messages until the client disconnects (when recv() returns an empty byte string).

If you want to support multiple clients at once, uncomment the threading lines in server.py—this will spawn a new thread for each client, so the main server can accept new connections while handling existing ones.

内容的提问来源于stack exchange,提问作者Rafalski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:09:24