纳西妲牌羽毛球 2022-06-06 17:21 采纳率: 75%
浏览 1927
已结题

我在制作聊天室时遇到了问题:ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。

我在网上找了一段聊天室的代码, 然后在经过修改后一段时间发现了一个问题:ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。
很奇怪的室,当我运行修改前的代码时,出现了一样的错误。所以我想这应该不是由于我修改导致的问题。(我只改了tkinter部分)
运行后就开始报错:ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。而且在修改后的几个小时内都没有报错,可以正常运行,但又过了两个小时就不行了。

 import socket
from tkinter import *
import tkinter.messagebox
import threading
import json
import tkinter.filedialog
from tkinter.scrolledtext import ScrolledText

IP = ''
PORT = ''
user = ''
listbox1 = ''  # 用于显示在线用户的列表框
show = 1  # 用于判断是开还是关闭列表框
users = []  # 在线用户列表
chat = '------Group chat-------'  # 聊天对象

# 登陆窗口

root0 = tkinter.Tk()
root0.geometry("300x150")
root0.title('用户登陆窗口')
root0.resizable(0, 0)
one = tkinter.Label(root0, width=300, height=150, bg="#D0EEFF")
one.pack()

IP0 = tkinter.StringVar()
IP0.set('')
USER = tkinter.StringVar()
USER.set('')

labelIP = tkinter.Label(root0, text='IP地址', bg="#D0EEFF")
labelIP.place(x=20, y=20, width=100, height=40)
entryIP = tkinter.Entry(root0, width=60, textvariable=IP0)
entryIP.place(x=120, y=25, width=100, height=30)

labelUSER = tkinter.Label(root0, text='用户名', bg="#D0EEFF")
labelUSER.place(x=20, y=70, width=100, height=40)
entryUSER = tkinter.Entry(root0, width=60, textvariable=USER)
entryUSER.place(x=120, y=75, width=100, height=30)


def Login(*args):
    global IP, PORT, user
    IP, PORT = entryIP.get().split(':')
    user = entryUSER.get()
    if not user:
        tkinter.messagebox.showwarning('warning', message='用户名为空!')
    else:
        root0.destroy()


loginButton = tkinter.Button(root0, text="登录", command=Login, bg="#50BEFF")
loginButton.place(x=135, y=110, width=40, height=25)
root0.bind('<Return>', Login)

root0.mainloop()

# 建立连接
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((IP, int(PORT)))
if user:
    s.send(user.encode())  # 发送用户名
else:
    s.send('用户名不存在'.encode())
    user = IP + ':' + PORT

# 聊天窗口
root1 = tkinter.Tk()
root1.geometry("640x480")
root1.title('群聊')
root1.resizable(0, 0)

photo = tkinter.PhotoImage(file="C://Users//王晓武//Desktop//Liaotian//yyy.png")
listbox = ScrolledText(root1)
listbox.place(x=5, y=0, width=640, height=320)
listbox.tag_config('tag1', foreground='#009FFF', backgroun="#BBECFF")
listbox.insert(tkinter.END, '欢迎进入群聊,大家开始聊天吧!(请在发送的消息后缀~,如要私聊,请在发送的消息的后缀~后加上用户名)', 'tag1', )

INPUT = tkinter.StringVar()
INPUT.set('')
entryIuput = tkinter.Entry(root1, width=120, textvariable=INPUT)
entryIuput.place(x=5, y=320, width=580, height=170)

# 在线用户列表
listbox1 = tkinter.Listbox(root1)
listbox1.place(x=510, y=0, width=130, height=320)


def send(*args):
    message = entryIuput.get() + '~' + user + '~' + chat
    s.send(message.encode())
    INPUT.set('')


photo1 = tkinter.PhotoImage("C://Users//王晓武//Desktop//Liaotian//d.png")
sendButton = tkinter.Button(root1, text="\n发\n\n\n送", anchor='n', command=send, font=('Helvetica', 18), bg='white', image=photo1, compound='center')
sendButton.place(x=585, y=320, width=55, height=300)
root1.bind('<Return>', send)


def receive():
    global uses
    while True:
        data = s.recv(1024)
        data = data.decode()
        print(data)
        try:
            uses = json.loads(data)
            listbox1.delete(0, tkinter.END)
            listbox1.insert(tkinter.END, "当前在线用户")
            listbox1.insert(tkinter.END, "------Group chat-------")
            for x in range(len(uses)):
                listbox1.insert(tkinter.END, uses[x])
            users.append('------Group chat-------')
        except:
            data = data.split('~')
            message = data[0]
            userName = data[1]
            chatwith = data[2]
            message = '\n' + message
            if chatwith == '------Group chat-------':  # 群聊
                if userName == user:
                    listbox.insert(tkinter.END, message)
                else:
                    listbox.insert(tkinter.END, message)
            elif userName == user or chatwith == user:  # 私聊
                if userName == user:
                    listbox.tag_config('tag2', foreground='red')
                    listbox.insert(tkinter.END, message, 'tag2')
                else:
                    listbox.tag_config('tag3', foreground='green')
                    listbox.insert(tkinter.END, message, 'tag3')

            listbox.see(tkinter.END)


r = threading.Thread(target=receive)
r.start()  # 开始线程接收信息

root1.mainloop()
s.close()

#下面是server文件
import socket
import threading
import queue
import json  # json.dumps(some)打包  json.loads(some)解包
import os
import os.path
import sys

IP = '192.168.3.143'
PORT = 9999  # 端口
messages = queue.Queue()
users = []  # 0:userName 1:connection
lock = threading.Lock()


def onlines():  # 统计当前在线人员
    online = []
    for i in range(len(users)):
        online.append(users[i][0])
    return online


class ChatServer(threading.Thread):
    global users, que, lock

    def __init__(self):  # 构造函数
        threading.Thread.__init__(self)
        self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        os.chdir(sys.path[0])

    # 接受来自客户端的用户名,如果用户名为空,使用用户的IP与端口作为用户名。如果用户名出现重复,则在出现的用户名依此加上后缀“2”、“3”、“4”……
    def receive(self, conn, addr):  # 接收消息
        user = conn.recv(1024)  # 用户名称
        user = user.decode()
        if user == '用户名不存在':
            user = addr[0] + ':' + str(addr[1])
        tag = 1
        temp = user
        for i in range(len(users)):  # 检验重名,则在重名用户后加数字
            if users[i][0] == user:
                tag = tag + 1
                user = temp + str(tag)
        users.append((user, conn))
        USERS = onlines()
        self.Load(USERS, addr)
        # 在获取用户名后便会不断地接受用户端发来的消息(即聊天内容),结束后关闭连接。
        try:
            while True:
                message = conn.recv(1024)  # 发送消息
                message = message.decode()
                message = user + ':' + message
                self.Load(message, addr)
            conn.close()
        except:
            j = 0  # 用户断开连接
            for man in users:
                if man[0] == user:
                    users.pop(j)  # 服务器段删除退出的用户
                    break
                j = j + 1

            USERS = onlines()
            self.Load(USERS, addr)
            conn.close()

    # 将地址与数据(需发送给客户端)存入messages队列。
    def Load(self, data, addr):
        lock.acquire()
        try:
            messages.put((addr, data))
        finally:
            lock.release()

          
    def sendData(self):
        while True:
            if not messages.empty():
                message = messages.get()
                if isinstance(message[1], str):
                    for i in range(len(users)):
                        data = ' ' + message[1]
                        users[i][1].send(data.encode())
                        print(data)
                        print('\n')

                if isinstance(message[1], list):
                    data = json.dumps(message[1])
                    for i in range(len(users)):
                        try:
                            users[i][1].send(data.encode())
                        except:
                            pass

    def run(self):
        self.s.bind((IP, PORT))
        self.s.listen(5)
        q = threading.Thread(target=self.sendData)
        q.start()
        while True:
            conn, addr = self.s.accept()
            t = threading.Thread(target=self.receive, args=(conn, addr))
            t.start()
        self.s.close()


if __name__ == '__main__':
    cserver = ChatServer()
cserver.start()

我用cmd启动了python,并且用ipconfig /all查看了自己的ip地址,没有错误。

我想要的效果就是制作一个有图形界面并且可使用ip地址的聊天室。谢谢!

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 6月14日
    • 创建了问题 6月6日

    悬赏问题

    • ¥15 请问有会的吗,用MATLAB做
    • ¥15 phython如何实现以下功能?查找同一用户名的消费金额合并—
    • ¥15 ARIMA模型时间序列预测用pathon解决
    • ¥15 孟德尔随机化怎样画共定位分析图
    • ¥18 模拟电路问题解答有偿速度
    • ¥15 CST仿真别人的模型结果仿真结果S参数完全不对
    • ¥15 误删注册表文件致win10无法开启
    • ¥15 请问在阿里云服务器中怎么利用数据库制作网站
    • ¥60 ESP32怎么烧录自启动程序,怎么查看客户esp32板子上程序及烧录地址
    • ¥50 html2canvas超出滚动条不显示