如何编写在第一次回显后不会断开连接的python回显服务器?

时间:2019-01-28 19:26:16

标签: python sockets server client

我想设置一个简单的回显服务器,该服务器仅回显客户端发送给它的任何内容。但是,当前服务器在回显第一条客户端消息后断开连接(服务器套接字关闭)。我希望能够与服务器连续地“聊天”,其中服务器只是回显我发送的多个连续消息而不会断开连接;例如:

  
    
      

“你好!”

             

“回声:你好!”

             

“你好吗?”

             

“回声:你好吗?”

             

“干杯!”

             

“呼应:干杯!”

    
  

当前我有以下代码:

server.py:

import socket

HOST = '127.0.0.1' 
PORT = 5000

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        while True:
            data = conn.recv(1024)
            if not data:
                break
            conn.sendall(data)

client.py:

import socket

HOST = '127.0.0.1'
PORT = 5000

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    s.sendall(b'Hello, world')
    data = s.recv(1024)

print('Echoing: ', repr(data))

但是,服务器在回显第一条客户端消息后断开连接(可能是由于if not data: break语句所致)。

P.S。我将不胜感激,可能还会有其他必要的解释-此示例具有教育意义,因此(并非仅)使代码运行后。

谢谢!

3 个答案:

答案 0 :(得分:0)

也许用睡眠代替休息

if not data:
    time.sleep(1)
    continue

您必须为此导入时间模块。

答案 1 :(得分:0)

我将向您展示我创建的代码,然后与您讨论:

服务器:

import socket

HOST = '127.0.0.1' 
PORT = 5000

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        while True:
            data = conn.recv(1024)
            conn.sendall(data)

对于我删除的服务器:

if not data:
   break

这根本不适合我。如果您知道您的消息将小于1024字节(此处为),则没有必要。但是,如果您想要更长的消息,则可以将该值更改为更大的数字以适应。所以是的,您猜对了就是那条线。

客户

import socket

HOST = '127.0.0.1'
PORT = 5000

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    print("Connected")
    while True:
        print("Sending data")
        s.sendall(b'Hello, world')
        print("Recieving data")
        data = s.recv(1024)
        print('Echoing: ', repr(data))

对于客户端,我只是将发送和接收过程添加到一个循环中。

注意事项:

这仅对通过终端运行的我有用,我不知道您是否知道该怎么做,如果您这样做,对不起,这里的链接解释了: https://www.wikihow.com/Use-Windows-Command-Prompt-to-Run-a-Python-File 我以为您使用Windows。 您将需要对client.py程序和server.py程序都遵循该过程。确保首先运行server.py程序。

这将导致发送和接收的无限循环。按Ctrl + C终止。

我希望这可以解决您的问题,并且您可以相应地编辑代码。如有其他问题,请发表评论,我会尽力与您联系。

答案 2 :(得分:0)

server.py:
import socket

HOST = '127.0.0.1' 
PORT = 5000

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        while True:
            data = conn.recv(1024)
            if data.decode() == "bye":
                break
            conn.sendall(data)
            conn, addr = s.accept()