Python 正确关闭插座

Python 正确关闭插座,python,sockets,Python,Sockets,我正在尝试使用套接字建立服务器/客户端连接。但它们不能正常关闭,我也不知道为什么 更新1 我已经纠正了下面我愚蠢的错误,没有在问题中真正调用s.close函数。 但事实证明这不是我的问题 更新结束 这是我的服务器代码: #!/usr/bin/env python # -*- coding: utf-8 -*- import socket import sys if __name__ == '__main__': # Server connection s = socket.s

我正在尝试使用套接字建立服务器/客户端连接。但它们不能正常关闭,我也不知道为什么

更新1 我已经纠正了下面我愚蠢的错误,没有在问题中真正调用s.close函数。 但事实证明这不是我的问题

更新结束 这是我的服务器代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import socket
import sys

if __name__ == '__main__':
    # Server connection
    s = socket.socket()          # Create a socket object
    host = socket.gethostname()  # Get local machine name
    port = 12345                 # Reserve a port for your service.

    print 'Server started!'
    print 'Waiting for clients...'

    s.bind((host, port))        # Bind to the port
    s.listen(5)                 # Now wait for client connection.
    c, addr = s.accept()     # Establish connection with client.
    print 'Got connection from', addr
    msg = c.recv(1024)

    print addr, ' >> ', msg

    if msg == 'close':
        print 'Closing down'
        c.send('SENT: Closing down')

    c.shutdown(socket.SHUT_RDWR)
    c.close()
这是我的客户代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import socket

if __name__ == '__main__':
    # Server
    s = socket.socket()          # Create a socket object
    host = socket.gethostname()  # Get local machine name
    port = 12345                 # Reserve a port for your service.

    print 'Connecting to ', host, port
    s.connect((host, port))

    msg = raw_input('CLIENT >> ')
    s.send(msg)
    msg = s.recv(1024)
    print 'SERVER >> ', msg

    s.close()                     # Close the socket when done
这是它产生的错误消息:

In [13]: %run cjboxd.py
Server started!
Waiting for clients...
---------------------------------------------------------------------------
error                                     Traceback (most recent call last)
/usr/lib/python2.7/dist-packages/IPython/utils/py3compat.pyc in execfile(fname, *where)
    173             else:
    174                 filename = fname
--> 175             __builtin__.execfile(filename, *where)

/home/nine/slask/cjboxd.py in <module>()
     19     print 'Waiting for clients...'
     20 
---> 21     s.bind((host, port))        # Bind to the port
     22     s.listen(5)                 # Now wait for client connection.
     23     c, addr = s.accept()     # Establish connection with client.

/usr/lib/python2.7/socket.pyc in meth(name, self, *args)
    222 
    223 def meth(name,self,*args):
--> 224     return getattr(self._sock,name)(*args)
    225 
    226 for _m in _socketmethods:

error: [Errno 98] Address already in use
[13]中的
:%运行cjboxd.py
服务器启动了!
正在等待客户。。。
---------------------------------------------------------------------------
错误回溯(最近一次呼叫上次)
/execfile(fname,*其中)中的usr/lib/python2.7/dist-packages/IPython/utils/py3compat.pyc
173.其他:
174 filename=fname
-->175 _uu内置_uuu.execfile(文件名,*其中)
/home/nine/slask/cjboxd.py in()
19打印“等待客户…”
20
--->21 s.bind((主机,端口))#绑定到端口
22 s.听(5)#现在等待客户端连接。
23 c,addr=s.accept()#与客户端建立连接。
/meth中的usr/lib/python2.7/socket.pyc(名称,self,*args)
222
223 def meth(名称、自身、*args):
-->224返回getattr(self._sock,name)(*args)
225
226对于_min _socketmethods:
错误:[Errno 98]地址已在使用中
一分钟后就可以用了

s.close                     # Close the socket when done

因为你实际上没有调用任何东西,所以你应该尝试调用
s.close()

你调用的是
s.close
,而不是
s.close()


如果希望客户端终止连接,则需要调用socket.close()方法。`

您需要
socket.socket.setsockopt
,即
s.setsockopt(socket.SOL\u socket,socket.SO\u REUSEADDR,1)

虽然进程结束时,操作系统将关闭套接字,但显式调用close()是一种良好的行为。 但是,在此之后,本地地址(本地ip、本地端口)在2
MSL(最大段生存期)
过去之前不可用。为什么?我们能做什么?您可以阅读以下内容:


我很难发布比他们更清晰的内容:)。

还有什么程序绑定到端口12345?好的。现在它是官方的。我瞎了我曾经试图找出我的
不工作的原因,然后我意识到我写了
def
反正我也没工作。但我很感激你抓住了我这个愚蠢的失误。但我相信马库斯能解释我的问题。无论如何+1哈?你在说什么about@JakobBowyer该问题是由套接字状态TIME_WAIT引起的,当服务器程序退出时,套接字关闭,但端口未释放,因此无法执行绑定操作。或者您只是idk关闭套接字?让python处理与操作系统的清理system@JakobBowyer,我没有看到
s.close
,但我相信这里讨论的问题是,当服务器重新启动时,它可能无法绑定端口,错误消息为
error:[Errno 98]地址已在使用
@Marcus您应该在主要答案中添加一些链接中的解释。不久前,我还被操作系统没有关闭套接字所困扰。