Python点对点聊天(Sockets)

2024-04-28 21:12:36 发布

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

我的任务是创建一个点对点的聊天应用程序,但是我在实际发送消息时遇到了问题。

实际上,应该提示用户输入他们想要连接的人的IP和端口,然后连续发送/接收消息。

但是,似乎在运行程序后立即建立了“随机”连接。

错误:

Please enter the address you would like to connect on: 127.0.0.1
Please enter the port you would like to connect on: 5000
You: Established connection with:  ('127.0.0.1', 2811)

为什么端口2811上有连接?这几乎就像程序正在连接到它自己。

代码:

import socket
import threading

LOCALHOST = '127.0.0.1'
BUFFER_SIZE = 1024

def main():

    class ChatListener(threading.Thread):

        def __init__(self):
            threading.Thread.__init__(self)
            self.port = None

        def run(self):
            listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            listen_socket.bind((LOCALHOST, self.port))
            listen_socket.listen(1)

            while True:

                connection, address = listen_socket.accept()

                print("Established connection with: ", address)

                message = connection.recv(BUFFER_SIZE)
                print("Them: ", message)

    class ChatSender(threading.Thread):

        def __init__(self):
            threading.Thread.__init__(self)
            self.address = None
            self.port = None

        def run(self):
            send_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            send_socket.connect((self.address, self.port))

            while True:

                message = input("You: ")

                if message.lower() == "quit":
                    break
                else:
                    try:
                        send_socket.sendall(message)
                    except:
                        Exception

    ip = input("Please enter the address you would like to connect on: ")
    port = int(input("Please enter the port you would like to connect on: "))

    chat_listener = ChatListener()
    chat_listener.port = port
    chat_listener.start()

    chat_sender = ChatSender()
    chat_sender.address = ip
    chat_sender.port = port
    chat_sender.start()

if __name__ == "__main__":
    main()

Tags: theselfyoumessageportaddressdefconnect
1条回答
网友
1楼 · 发布于 2024-04-28 21:12:36

这是对套接字和端口的误解。服务器(ChatListener)正在端口5000上侦听连接。假设127.0.0.1:5000是服务器的电话号码。然而,客户端(ChatSender)可以自由地使用它想要的端口,并且通常会选择一个没有分配给其他端口的端口。客户将有一个不同的“电话号码”,它是从。打印出来的不是服务器的“电话号码”(127.0.0.1:5000),而是传入呼叫(127.0.0.1:2811)的“呼叫者ID”,它不在同一端口上。

这里有一个明确的例子。想象一下,发送者实际上在不同的机器上,在不同的IP地址,比如127.0.0.2。客户端启动一个套接字,试图连接到127.0.0.1:5000。它分配了一个杂项端口,比如2811来建立连接。如果成功,服务器将连接到127.0.0.2:2811。任何时候客户端想要发送一些数据,它都会发送到127.0.0.1:5000。但是,任何时候服务器想要将数据发送回客户端,它都会在127.0.0.2:2811上这样做。如果这个例子不清楚,请告诉我,我会进一步澄清。

相关问题 更多 >