套接字Python交换

套接字Python交换,python,python-3.x,sockets,chat,Python,Python 3.x,Sockets,Chat,我正在尝试构建一个多线程的TCP聊天程序。到目前为止,我认为大多数功能都设置得很好。启动服务器并与客户端连接时,只有从服务器发送的响应才会广播到所有连接的客户端。我想我找到了原因,它来自我的连接列表数组。服务器将所有客户机添加到此列表中,我认为对于客户机也有相同的操作,但客户机实例从未看到此列表,因此在发送消息时,它们不会将消息发送到任何地方。我基本上需要一种方法将连接列表从服务器实例复制到连接的客户端。我整天都在想怎么做,这让我发疯 import socket import platform

我正在尝试构建一个多线程的TCP聊天程序。到目前为止,我认为大多数功能都设置得很好。启动服务器并与客户端连接时,只有从服务器发送的响应才会广播到所有连接的客户端。我想我找到了原因,它来自我的连接列表数组。服务器将所有客户机添加到此列表中,我认为对于客户机也有相同的操作,但客户机实例从未看到此列表,因此在发送消息时,它们不会将消息发送到任何地方。我基本上需要一种方法将连接列表从服务器实例复制到连接的客户端。我整天都在想怎么做,这让我发疯

import socket
import platform
import threading
import sys
import time
import os

'''Define Globals'''
HOST = ""
PORT = 25000
ADDR = (HOST, PORT)
CONNECTION_LIST = []
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

'''Connect Client to the Server'''
def client_connect():

    server_ip = input("[+] Server's IP to connect to: ")
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    try:
        client.connect((server_ip, PORT))
        print("[+] Connected to Server at address: %s" %client.getpeername()[0])
    except ConnectionRefusedError:
        print("[*] No Server Listening at Specified Address")
        sys.exit()

    communicate(client)


'''Threaded loop to continue listening for new connections'''
def server_loop():

    server.bind(ADDR)
    server.listen(10)

    print("[*] Server started on %s" %platform.node())

    while True:
        client_socket, client_addr = server.accept()
        CONNECTION_LIST.append(client_socket)
        print("\r[+] New Connection from: %s" %client_addr[0])


'''Broadcast data to all clients except sender'''
def broadcast_data(sock, message):

    for socket in CONNECTION_LIST:
        if socket != server and socket != sock:
            try:
                socket.send(str.encode("[%s] => %s" %(os.getlogin(),message)))
            except:
                socket.close()
                CONNECTION_LIST.remove(socket)


'''Server Host Connect Back'''
def self_connect():

    sc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sc.connect(("localhost", 25000))
    CONNECTION_LIST.append(sc)
    communicate(sc)


def communicate(client):

    dump_thread = threading.Thread(target=dump, args=(client,))
    dump_thread.start()

    while True:
        try:
            time.sleep(0.5)
            data = input("> ")
            broadcast_data(client, data)
        except:
            print("[*] Error - Program Terminating")
            client.close()
            sys.exit()

def dump(client):
    while True:
        print(client.recv(1024).decode("utf-8"))


def main():

   server_thread = threading.Thread(target=server_loop)

   while True:

       try:
            print("Select Operating Mode")
            print("---------------------")
            print("1. Server Mode")
            print("2. Client Mode")
            mode = int(input("Enter mode of operation: "))
            print("\n\n")
            if mode in [1,2]:
                break
            else:
                raise ValueError
       except ValueError:
           print("Enter either (1) for Server or (2) for Client")


   if mode == 1:
        server_thread.start()
        time.sleep(1)
        self_connect()
   elif mode == 2:
       client_connect()


main()

你做错了。每个客户机应该只与服务器通信,而不是与对等机通信。我认为,既然是这样,服务器不应该只向客户端发送数据,然后服务器打印出它从客户端接收到的数据。