簡體   English   中英

Python socket問題-ConnectionRefusedError: [WinError 10061]

[英]Python socket problem-ConnectionRefusedError: [WinError 10061]

我想在 python 中創建一個服務器-客戶端聊天室,多個客戶端可以在聊天框中發送消息。

這是服務器代碼

import threading
import socket

#setting up the local host and the local port
host = '127.0.0.1'
port = 9879

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((host, port)) #hosting the server to the host
server.listen() #server listen to incoming connection

#list for client and their nicknames
clients = []
nicknames = []

#broadcast method to send message to all the clients connected to the server
def broadcast(message):
    for client in clients:
        client.send(message)

def handle (client):
    while True:
        try:
            message = client.recv(1024)
            broadcast(message)
        except: #if the connection is lost, discard the client
            index = clients.index(client)
            clients.remove(client)
            client.close()
            nickname = nicknames[index]
            broadcast(f'{nickname} already left the chat!'.encode('ascii'))
            nicknames.remove(nickname)
            break

#function to receive connection
def receive():
    while True:
        client, address = server.accept()
        print(f"Conncected with {str(address)}")
        client.send('NICKNAME'.encode('ascii'))
        nickname = client.recv(1024).decode('ascii')
        nicknames.append(nickname)
        clients.append(client)
        
        print(f'The nickname of the client is {nickname}')
        broadcast(f'{nickname} joined the chat!'.encode('ascii'))
        client.send('Connected to the server!'.encode('ascii'))
        
        #making thread for every client
        thread = threading.Thread(target = handle, args = (client,))
        thread.start()
print("Server is waiting for client...")

這是客戶端代碼

import socket
import threading 

#nickname prompt
nickname = input("Input your nickname: ")
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#binding the client to the port
client.connect(('127.0.0.1', 9879))

def receive():
    while True:
        try:
            message = client.recv(1024).decode('ascii')
            if message == 'NICKNAME':
                client.send(nickname.encode('ascii'))
            else:
                print(message)
        except:
            print("An error occurred!")
            client.close()
            break

def write():
    while True:
        message = f'{nickname}: {input("")}'
        client.send(message.encode('ascii'))

#making the thread
receive_thread = threading.Thread(target = receive)
receive_thread.start()

write_thread = threading.Thread(target = write)
write_thread.start()

但是,每當我在命令提示符中輸入昵稱時,都會出現錯誤

Traceback (most recent call last):
  File "C:\Users\march\Documents\Programming\Pyhton\client.py", line 8, in <module>
    client.connect(('127.0.0.1', 9879))
ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it

我想知道是什么問題,因為服務器和客戶端的端口相同並且端口可用。

在您的服務器代碼上,您缺少對運行 while 循環並將服務器置於接受連接的接收函數的調用。

代碼變成

import threading
import socket

#setting up the local host and the local port
host = '127.0.0.1'
port = 9879

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((host, port)) #hosting the server to the host
server.listen() #server listen to incoming connection

#list for client and their nicknames
clients = []
nicknames = []

#broadcast method to send message to all the clients connected to the server
def broadcast(message):
    for client in clients:
        client.send(message)

def handle (client):
    while True:
        try:
            message = client.recv(1024)
            broadcast(message)
        except: #if the connection is lost, discard the client
            index = clients.index(client)
            clients.remove(client)
            client.close()
            nickname = nicknames[index]
            broadcast(f'{nickname} already left the chat!'.encode('ascii'))
            nicknames.remove(nickname)
            break

#function to receive connection
def receive():
    while True:
        client, address = server.accept()
        print(f"Conncected with {str(address)}")
        client.send('NICKNAME'.encode('ascii'))
        nickname = client.recv(1024).decode('ascii')
        nicknames.append(nickname)
        clients.append(client)
        
        print(f'The nickname of the client is {nickname}')
        broadcast(f'{nickname} joined the chat!'.encode('ascii'))
        client.send('Connected to the server!'.encode('ascii'))
        
        #making thread for every client
        thread = threading.Thread(target = handle, args = (client,))
        thread.start()
print("Server is waiting for client...")

receive() # runs the function that accepts for incoming connections


客戶端代碼應該在主線程而不是另一個線程上運行write()函數,因為它需要來自標准輸入的輸入。 您可以按如下方式更改代碼,以便在另一個線程上運行接收例程,並在主線程上運行“寫入”函數。


import socket
import threading 

#nickname prompt
nickname = input("Input your nickname: ")
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#binding the client to the port
client.connect(('127.0.0.1', 9879))

def receive():
    while True:
        try:
            message = client.recv(1024).decode('ascii')
            if message == 'NICKNAME':
                client.send(nickname.encode('ascii'))
            else:
                print(message)
        except:
            print("An error occurred!")
            client.close()
            break

def write():
    while True:
        message = f'{nickname}: {input("")}'
        client.send(message.encode('ascii'))

#making the thread
receive_thread = threading.Thread(target = receive)
receive_thread.start()

# on the main thread
write()

連接被拒絕錯誤的原因是由於從未實際調用接收函數,服務器代碼立即退出。

暫無
暫無

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

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