【问题标题】:Python server chat issue when run运行时的Python服务器聊天问题
【发布时间】:2014-05-08 18:02:52
【问题描述】:

我一直在编写我的聊天程序,但后来我收到一个错误,导致服务器崩溃,所以下次我将无法使用相同的端口,所以当我再次运行它时出现 socket.bind 错误.怎么修? 源代码:

import socket
from threading import Thread

def clientHandler():
    conn, addr = sock.accept()
    print addr, "is Connected"
    while 1:
        data = conn.recv(1024)
        if not data:
            break
        print "Received Message", repr(data)
HOST = ''
PORT = raw_input('PORT: ')
PORT = int(PORT)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((HOST, PORT))
sock.listen(5)

print "Server is running......"

#Thread(target=clientHandler).start()
#Thread(target=clientHandler).start()
#Thread(target=clientHandler).start()

for i in range(5):
    Thread(target=clientHandler).start()


sock.close()

会发生这样的事情:

    Server is running......
Exception in thread Thread-5:
Traceback (most recent call last):
  File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:\Python27\lib\threading.py", line 763, in run
    self.__target(*self.__args, **self.__kwargs)
  File "C:/Users/Judicaël/Desktop/server_test.py", line 5, in clientHandler
    conn, addr = sock.accept()
  File "C:\Python27\lib\socket.py", line 202, in accept
    sock, addr = self._sock.accept()
  File "C:\Python27\lib\socket.py", line 170, in _dummy
    raise error(EBADF, 'Bad file descriptor')
error: [Errno 9] Bad file descriptor

>>> ==================================================== RESTART ====================================================
>>> 

Traceback (most recent call last):
  File "C:/Users/Judicaël/Desktop/server_test.py", line 15, in <module>
    sock.bind((HOST, PORT))
  File "C:\Python27\lib\socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
error: [Errno 10048] Only one usage of each socket address (protocol/network address/port) is normally permitted

我用的是Win7 64bit python 2.7.6 64bit版本 有没有办法恢复被阻塞的端口,或者重启comp时自动恢复?

************由 Daniel************修复

固定代码:

import socket, sys
from threading import Thread

def clientHandler(conn, addr):
    print addr, "is Connected"
    while 1:
        data = conn.recv(1024)
        if data == 'Admin: /server shutdown':
            sock.close()
            print 'quitting...'
            quit()

        if not data:
            break
        conn.sendall(data) # only sends to original sender
        print "Received Message", repr(data)
HOST = ''
PORT = int(raw_input('PORT: '))

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((HOST, PORT))
sock.listen(999999)

print "Server is running......"

#Thread(target=clientHandler).start()
#Thread(target=clientHandler).start()
#Thread(target=clientHandler).start()

for i in range(999999):
    conn, addr = sock.accept()
    Thread(target=clientHandler, args=(conn, addr)).start()

sock.close()

我现在如何将收到的消息发送给所有客户端?

【问题讨论】:

    标签: python sockets python-2.7 networking network-programming


    【解决方案1】:

    您必须在服务器端调用的函数如下: - 创建一个套接字 - 将其绑定到端口 - 听 - 接受 - 处理客户端通信

    您有多个接受线程。然后你关闭套接字,所以所有接受都失败了。 正确的做法是

    while True:
        client, addr = sock.accept()
        Thread(target=clientHandler, args=(client, addr)).start()
    

    【讨论】:

    • 您可以在一段时间后重新使用该端口。一次重用它:sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    • 非常有用!我会添加什么来向所有客户发送收到的消息? @丹尼尔
    猜你喜欢
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 2015-03-11
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多