【问题标题】:How to make a server that is always listening with socket?如何制作始终使用套接字侦听的服务器?
【发布时间】:2018-02-12 00:41:30
【问题描述】:

建立一个基本的命令服务器:

import socket
import time
import random

server_socket = socket.socket()
server_socket.bind(('0.0.0.0', 8821))

server_socket.listen(1)

(client_socket, client_address) = server_socket.accept()

client_input = client_socket.recv(1024)
client_input = client_input.upper()


if client_input == 'TIME':
    client_socket.send(time.strftime("%c"))
elif client_input == 'RAND':
    client_socket.send(str(random.randrange(0, 11)))
elif client_input == 'NAME':
    client_socket.send("My master called me \"Arik\". Funny, ha?")
else:
    client_socket.send("Unknown command")

if len(client_input) > 4 or len(client_input) < 4:
    client_socket.send("The length of your messege\nneeds to be 4 chracters.\nI know only 4 commands.\nRAND, TIME, NAME & EXIT.\nThanks.")


client_socket.close()
server_socket.close()

和一个基本的客户:

import socket
my_socket = socket.socket()
my_socket.connect(('127.0.0.1', 8820))

message = raw_input("Insert Command\n")
my_socket.send(message)

data = my_socket.recv(1024)
print "Answer Sent: " + data

my_socket.close()

现在我想让服务器一直听命令,直到他得到一个“退出”命令。我不太明白这样做的方法,所以我希望你能帮助我。非常感谢!

【问题讨论】:

  • 检查socket module example。基本上,只需循环运行它并在套接字服务器上继续运行accept(),在套接字上继续运行recv()

标签: python python-2.7 sockets server


【解决方案1】:

我自己从未使用过 python 网络,但我认为这会起作用。 你可以把你的服务器监听器放在一个循环中,如果它收到 EXIT 则打破循环。

while(true):
    server_socket.listen(1)

    (client_socket, client_address) = server_socket.accept()

    client_input = client_socket.recv(1024)
    client_input = client_input.upper()


    if client_input == 'TIME':
        client_socket.send(time.strftime("%c"))
    elif client_input == 'RAND':
        client_socket.send(str(random.randrange(0, 11)))
    elif client_input == 'NAME':
        client_socket.send("My master called me \"Arik\". Funny, ha?")
    elif client_input == 'EXIT':
          break;
    else:
        client_socket.send("Unknown command")

    if len(client_input) > 4 or len(client_input) < 4:
        client_socket.send("The length of your messege\nneeds to be 4 chracters.\nI know only 4 commands.\nRAND, TIME, NAME & EXIT.\nThanks.")

client_socket.close()
server_socket.close()

【讨论】:

    【解决方案2】:

    您可以简单地运行一个循环以继续从客户端接收,直到收到'exit'

    import socket
    import time
    import random
    
    server_socket = socket.socket()
    server_socket.bind(('0.0.0.0', 8821))
    
    server_socket.listen(1)
    
    (client_socket, client_address) = server_socket.accept()
    
    while True:
        client_input = client_socket.recv(1024).upper()
        if len(client_input) > 4 or len(client_input) < 4:
            client_socket.send("The length of your messege\nneeds to be 4 chracters.\nI know only 4 commands.\nRAND, TIME, NAME & EXIT.\nThanks.")
        else:
            if client_input == 'TIME':
                client_socket.send(time.strftime("%c"))
            elif client_input == 'RAND':
                client_socket.send(str(random.randrange(0, 11)))
            elif client_input == 'NAME':
                client_socket.send("My master called me \"Arik\". Funny, ha?")
            elif client_input == 'EXIT':
                client_socket.send("Exiting.")
                break
            else:
                client_socket.send("Unknown command")
    
    client_socket.close()
    server_socket.close()
    

    你的客户应该是:

    import socket
    my_socket = socket.socket()
    my_socket.connect(('127.0.0.1', 8820))
    
    message = ''
    while message.upper() != 'EXIT':
        message = raw_input("Insert Command\n")
        my_socket.send(message)
        data = my_socket.recv(1024)
        print "Answer Sent: " + data
    
    my_socket.close()
    

    【讨论】:

    • 很高兴为您提供帮助,如果您觉得有用,请随时 accept the answer :-)
    • 文件“/Networks/EX2.6---server.py”,第 13 行,在 client_input = client_socket.recv(1024).upper() socket.error: [Errno 54 ] 对等方重置连接
    • 因为您的客户端在发送 'exit' 之前已断开连接,所以我刚刚编辑了答案以添加修复。
    猜你喜欢
    • 2017-07-20
    • 2017-07-03
    • 2012-10-16
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 2015-09-23
    相关资源
    最近更新 更多