我的任务是创建一个点对点聊天应用程序,但我实际上在发送邮件时遇到了麻烦。
基本上,应该提示用户输入他们想要连接的人的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()
答案 0 :(得分:4)
这是对套接字和端口的误解。服务器(ChatListener)在端口5000上进行LISTENING以进行连接。想象一下127.0.0.1:5000是服务器的电话号码。但是,客户端(ChatSender)可以自由地使用它想要的任何端口,并且通常会选择一个未分配给其他端口的端口。客户将有一个不同的电话号码"它正在呼唤。您打印的内容不是服务器的电话号码" (127.0.0.1:5000)而不是"来电显示"来电(127.0.0.1:2811),它不在同一个端口上。
这是一个澄清的例子。想象一下发送者实际上在不同的机器上,在某个不同的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上执行此操作。如果这个例子不清楚,请告诉我,我会进一步澄清。