Python聊天客户端和服务器套接字

2024-04-27 04:09:39 发布

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

我对python有点陌生,这是我第一次使用sockets,我尝试创建一个有客户机和服务器的应用程序,用户可以在客户机中键入内容,然后将其发送到服务器,然后服务器将其发送到所有其他客户机。我已将其设置为工作状态,但每当我尝试发送第二条消息时,总会收到一个错误“error:[Errno 10058]发送或接收数据的请求被拒绝,因为套接字已在该方向上通过上次关闭调用关闭。”。我怎样才能做到这一点

尝试在启动新套接字或发送新消息之前添加套接字shutdown和close,尝试再次使用现有的套接字,两种方法都不起作用,但程序在发送到服务器时挂起

服务器

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

def __init__():
    HOST = '0.0.0.0'    
    PORT = 50012
    print("Initialising..")
    print("Initialized.")
    print("Binding..")
    s.bind((HOST, PORT))
    print("Bound.")
    print("Listener started")

    __listen__(HOST, PORT)


def __broadcast__(list_clients, conn, addr, HOST, PORT):
    print("broadcasting")
    while 1:
        data = conn.recv(1024)
        if not data: break
        print "{} Recieved from {}".format(data, addr)
        for x in list_clients:
            conn.sendto(data, x)
            __listen__(HOST, PORT)


def __listen__(HOST, PORT):
    print("listening")
    s.listen(1)
    conn, addr = s.accept()
    list_clients=[]
    list_clients.append(addr)
    print 'Connected by', addr
    __broadcast__(list_clients, conn, addr, HOST, PORT)


def ext():
    conn.close()

def __main__():
    print("Initialising..")
    __init__()
    print("Initialized.")
    print("Listener starting..")
    __listen__()

__init__()

客户

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

def __init__():
    HOST = '127.0.0.1'
    PORT =  50012
    __connect__(HOST, PORT)

def __connect__(HOST, PORT):
    s.connect((HOST, PORT))
    __sendmessage__(HOST, PORT)

def __sendmessage__(HOST, PORT):
    s.sendall(raw_input("You $: "))
    while 1:
        data = s.recv(1024)
        print data
        __sendmessage__(HOST, PORT)

def __exit__():
    s.shutdown(0)
__init__()    






Tags: 服务器hostdata客户机initportdefconnect
1条回答
网友
1楼 · 发布于 2024-04-27 04:09:39

您的服务器每次调用__listen__()并因此accept()递归地调用sendto()客户机,即。e。它在每一条消息发送后等待一个新的连接-这无法工作。 服务器必须同时等待来自客户端的连接和数据;这对于^{}来说很简单。将__init__()__broadcast__()__listen__()替换为

    from select import select
    HOST = '0.0.0.0'    
    PORT = 50012
    s.bind((HOST, PORT))
    s.listen(1)
    list_clients = []
    for reads in iter(lambda: select([s]+list_clients, [], [])[0], []):
        for ready in reads: # each time select reports something is ready
            if s == ready:  # accept new client if it's the server socket
                conn, addr = s.accept()
                list_clients.append(conn)   # store the connection socket
                print 'connected by', addr
            else:           # data from a client
                try: data = ready.recv(1024)
                except socket.error: data = ''
                if not data:                # client disconnected, remove
                    list_clients.remove(ready)
                    ready.close()
                    continue
                print "{} received from {}".format(data, ready.getpeername())
                print("broadcasting")
                for x in list_clients: x.send(data)

客户端也有一个类似的问题,即不能同时等待套接字和终端输入。对于工作的客户机实现,请参阅Handle multiple requests with select的答案

相关问题 更多 >