Python TCP 套接字无法连接

Python TCP sockets won't connect

作为 uni 课程的一部分,我必须编写一个简单的 python TCP 客户端-服务器聊天,但我在获取 server.py 和 client.py 中的套接字时遇到问题要连接的程序。

经过多次尝试,我决定真正剥离程序,只尝试连接套接字并让客户端在连接后向服务器发送一条消息。

我运行在同一台计算机 (macOS) 的不同终端 windows 上安装两个程序(server.py 和 client.py)。我已经尝试关闭防火墙并 运行 关闭程序,以防万一以某种方式引起问题。

我的代码如下:

server.py - 这是运行第一个

from socket import *
serverPort = 11500
serverSocket = socket(AF_INET, SOCK_STREAM)
serverSocket.bind(('', serverPort))

print("The server is listening")
serverSocket.listen(1)

clientSocket, clientAddress = serverSocket.accept()

message, clientAddress = serverSocket.recvfrom(2048)

client.py - 一旦 server.py 是 运行ning,然后开始

from socket import *

serverName = "127.0.0.1"
serverPort = 11500

clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect((serverName, serverPort))

message = "Hello"
clientSocket.send(message.encode())

这是我收到的错误:

(base) me@ME python_socket % python3 tcp_server.py
The server is listening
Traceback (most recent call last):
  File "tcp_server.py", line 11, in <module>
    message, clientAddress = serverSocket.recvfrom(2048)
OSError: [Errno 57] Socket is not connected

在此先感谢您的帮助。看起来应该是非常简单的事情,但是即使在网上看了教程之后,我似乎仍然遇到套接字未连接的问题。

问题是,在 server.py 代码中,您应该将 recvfrom 行中的 serverSocket 替换为 clientSocket,因为当您调用 accept 就在该行之前,clientSocket(由 accept 返回)是特定于该连接的新套接字。

clientSocket, clientAddress = serverSocket.accept()

message, clientAddress = clientSocket.recvfrom(2048)

更改后,它将正常工作。

问题

  1. 当您使用 TCP 连接时,您应该使用 recv() 而不是 recvfrom()recvfrom() 用于 UDP 套接字。
  2. 您应该使用新创建的 TCP clientSocket
  3. 而不是从 serverSocket 接收数据

正确的解决方案

服务器

from socket import *

serverPort = 11500
serverSocket = socket(AF_INET, SOCK_STREAM)
serverSocket.bind(("localhost", serverPort))

print("The server is listening")
serverSocket.listen(1)

clientSocket, clientAddress = serverSocket.accept()
message = clientSocket.recv(2048).decode()
print(message)

客户

from socket import *

serverName = "127.0.0.1"
serverPort = 11500

clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect((serverName, serverPort))

message = "Hello"
clientSocket.send(message.encode())

服务器输出:

The server is listening
Hello