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)
更改后,它将正常工作。
问题
- 当您使用 TCP 连接时,您应该使用
recv()
而不是 recvfrom()
。 recvfrom()
用于 UDP 套接字。
- 您应该使用新创建的 TCP
clientSocket
。 而不是从 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
作为 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)
更改后,它将正常工作。
问题
- 当您使用 TCP 连接时,您应该使用
recv()
而不是recvfrom()
。recvfrom()
用于 UDP 套接字。 - 您应该使用新创建的 TCP
clientSocket
。 而不是从
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