通常只允许Python使用每个套接字地址的一种用法

时间:2016-09-12 10:54:13

标签: python sockets

我写了一个基本程序来创建一个带有服务器和客户端的套接字。但问题是,当我运行代码时,它给出了一个错误,说明通常只允许使用每个套接字地址。所以我认为问题是由于端口,我改变了端口,它仍然无法正常工作。我如何让它工作?

这是我的代码:

服务器

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) 

感谢您的帮助!

3 个答案:

答案 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)