套接字Python交换

时间:2017-01-18 22:44:41

标签: python python-3.x sockets chat

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

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()

0 个答案:

没有答案
相关问题