我写了一个基本程序来创建一个带有服务器和客户端的套接字。但问题是,当我运行代码时,它给出了一个错误,说明通常只允许使用每个套接字地址。所以我认为问题是由于端口,我改变了端口,它仍然无法正常工作。我如何让它工作?
这是我的代码:
服务器
import socket
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.bind(('localhost',3200))
sock.listen(1)
print "Server is ready to receive data..."
client, address = sock.accept()
msg = client.recv(1024)
print msg
客户端
import socket
connection_to_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
connection_to_server.bind(('localhost',3200))
msg = raw_input("Please enter a content :")
connection_to_server.send(msg)
感谢您的帮助!
答案 0 :(得分:2)
我认为这里对套接字的工作方式存在根本性的误解。
socket.bind()
调用用于绑定特定接口上的特定端口,该对使用网络地址指定(绑定到8080
上的端口127.0.0.1)
。您需要执行此操作这可以在服务器端开始读取传入数据,即"在特定套接字上监听。只有服务器需要这样做。客户端将使用socket.connect
连接到此套接字。
正如Spectras在评论中指出的那样,当您需要通过特定的接口/端口组合进行通信时,绑定是必要的,这对于服务器来说几乎总是必要的,但对于客户端来说并非总是如此。客户端和服务器 都可以访问/绑定到同一个接口上的同一个端口,这样做是没有意义的。
您的客户端和服务器都尝试开始侦听同一个套接字,这是错误消息建议的,不允许。
在继续进行之前,您应该通过Socket Programming HOWTO。
答案 1 :(得分:0)
而不是
> connection_to_server.bind(('localhost',3200))
你应该
connection_to_server.connect(('localhost',3200))
答案 2 :(得分:0)
对于SOCK_STREAM套接字,您的客户端应该连接,而不是绑定。来自Sockets HOWTO:
import socket
connection_to_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
connection_to_server.connect(('localhost',3200))
msg = raw_input("Please enter a content :")
connection_to_server.send(msg)