当我尝试在Linux终端中执行Python服务器套接字程序和客户端套接字程序(都在同一个linux机器上运行)时,我没有收到任何错误,服务器接受连接并将数据发送到客户端成功。
但是当我在python IDLE中执行相同的程序时,我得到“ [Errno 111]连接拒绝”错误。
两次执行有什么区别?
我在服务器中使用serversock.bind(('',port#))
在客户端我正在使用clientsock.connect(('localhost',port#))
Server.py
import socket
serversock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host = ''
print host
port = 5800
serversock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
serversock.bind((host,port))
serversock.listen(2)
try:
while True:
csock,addr = serversock.accept()
print 'Recieved address from %s '% str(addr)
csock.send('hello')
csock.close()
except Exception,e:
print e
client.py
import socket
try:
c = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host = 'localhost'
port = 5800
c.connect((host,port))
data = c.recv(1024)
print data
except Exception,e:
print e
finally:
c.close()
答案 0 :(得分:1)
服务器端必须使用:
serversock.bind(('',port#)) # binds to port
serversock.listen(5) # actually listen to port and allow 5 incoming calls
conv = serversock.accept() # accept first incoming call
只有listen
之后才会接受连接,在此之前,您只绑定了一个套接字,但尚未声明您已准备好接受来电,因此拒绝接听。
添加代码后,另一个可能的错误原因是您在发送数据后立即关闭连接(服务器端)。这很糟糕:关闭条件可能会在数据实际发送之前销毁套接字。
您应该使用graceful shutdown:
服务器端:
csock.send('hello')
csock.shutdown(socket.SHUT_WR) # shutdown the socket
csock.read() # wait the close from peer
csock.close()
客户端:您可以将代码保留在用例中,不要向服务器发送任何内容,因此当客户端完成读取后,可以安全地关闭套接字
无论如何,你应该在一切都完成后关闭serversock
try:
...
except ...:
...
finally:
serversock.close()