运行Python服务器聊天时问题

1 投票
1 回答
627 浏览
提问于 2025-04-18 05: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 64位,Python 2.7.6的64位版本。请问有没有办法恢复那些被阻塞的端口,还是说重启电脑后会自动恢复?

*******由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()

那我现在该如何把收到的消息发送给所有客户端呢?

1 个回答

0

在服务器端,你需要调用以下几个步骤:

  • 创建一个套接字(socket)
  • 把它绑定到一个端口上
  • 开始监听请求
  • 接受连接
  • 处理与客户端的通信

如果你有多个线程在处理接受连接的操作,然后又关闭了套接字,这样所有的接受操作都会失败。

正确的做法是:

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

撰写回答