簡體   English   中英

Python聊天客戶端和服務器套接字問題

[英]Python chat client & Server sockets issue

我是python的新手,這是我第一次使用套接字,我正在嘗試制作一個具有客戶端和服務器的應用程序,用戶可以輸入客戶端並將其發送到服務器,然后將其發送給所有其他客戶端。 我已將其設置為工作狀態,但是每當嘗試發送第二條消息時,總會收到錯誤消息“錯誤:[Errno 10058],由於套接字已在該方向上被關閉,因此不允許發送或接收數據的請求。先前的關機呼叫”。 我該如何進行這項工作?

嘗試添加套接字關閉並在啟動新套接字或發送新消息之前關閉,嘗試僅再次使用現有套接字,但均無法正常工作,但沒有錯誤,但程序只是在發送至服務器時掛起。

服務器

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





您的服務器在每次向客戶端發送sendto()之后,都會調用__listen__()並由此遞歸地accept() ,即,每條消息發送后,服務器都等待新的連接-無法正常工作。 服務器必須同時等待來自客戶端的連接和數據; 使用select.select()很容易。 __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)

客戶端有一個類似的問題,即不同時等待套接字和終端輸入。 對於有效的客戶端實施,請參見以下答案, 使用select處理多個請求

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM