客户端关闭时服务器崩溃

问题描述 投票:2回答:2

我今天早些时候遇到过这个问题。这是我的第一个网络应用程序。

server.朋友

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

import socket

s = socket.socket()
host = socket.gethostname()

# Reserve a port for your service.
port = 12345
# Bind to the port
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host, port))

# Now wait for client connection.
s.listen(1)
conn, addr = s.accept()
try:
    while True:
        # connection, address
        content = conn.recv(1024)
        if content in ('status', 'stop', 'start', 'reload', 'restart'):
            conn.send('%s received' % content)
        else:
            conn.send('Invalid command')
except KeyboardInterrupt:
    conn.close()
    s.shutdown(socket.SHUT_RDWR)
    s.close()

client.朋友

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

import socket

s = socket.socket()
host = socket.gethostname()
port = 12345

s.connect((host, port))
try:
    while True:
        print ''
        value = raw_input('Enter a command:\n')
        if value != '':
            s.send(value)
            print s.recv(1024)
except KeyboardInterrupt:
    s.shutdown(socket.SHUT_RDWR)
    s.close()

它是一个非常基本的客户端/服务器应用程序服务器启动,等待客户端发送命令。客户端连接到服务器,要求用户键入命令。然后将命令发送到回复<command> receivedInvalid command的服务器。代码运行正常,直到我点击CTRL + C。服务器崩溃了。这是为什么 ?

例:

python client.py 

Enter a command:
stop
stop received

Enter a command:
status
status received

Enter a command:
bla
Invalid command

Enter a command:
^C

在服务器端:

python server.py 
Traceback (most recent call last):
  File "server.py", line 25, in <module>
    conn.send('Invalid command')
socket.error: [Errno 32] Broken pipe
python sockets networking client-server
2个回答
5
投票

把你的accept放在一个while循环中。就像是:

while True:
    conn, addr = s.accept()        # accept one connection.
    while True:                    # Receive until client closes.
        content = conn.recv(1024)  # waits to receive something.
        if not content:            # Receive nothing? client closed connection,
            break                  #   so exit loop to close connection.
        if content in ('status', 'stop', 'start', 'reload', 'restart'):
            conn.send('%s received' % content)
        else:
            conn.send('Invalid command')
    conn.close()                   # close the connection 

另请注意,当客户端关闭连接时recv返回空字符串,因此if not content: break


2
投票

基本上,我没有在我的服务器上为新的未来客户端重新创建一个新的连接,然后,当它击中conn.send('Invalid command')线时,它崩溃了。要解决这个问题:

我刚换了:

conn.send('Invalid command')

有:

try:
    conn.send('Invalid command')
except socket.error:
    conn, addr = s.accept()
© www.soinside.com 2019 - 2024. All rights reserved.