【问题标题】:Python Socket - Server Stop after receive only one messagePython Socket - 仅收到一条消息后服务器停止
【发布时间】:2021-09-17 19:20:45
【问题描述】:

首先抱歉我的英语不好(我是法国人),因为我试图不使用谷歌翻译。

所以,我的问题出在下面一组 server.py 和 client.py 中。只是一个客户端,每 10 秒发送一条消息,在 server.py 上带有增量计数器。我编写此脚本是为了检查我的大学工作服务器在我注销后(以及我的培训)是“存活”还是“死亡”。

server.py:

# -*- coding: utf-8 -*-

import socket

HOST = 'localhost'
PORT = 1602

socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.bind(('localhost', PORT))

while True:
        socket.listen(5)
        client, address = socket.accept()
        print(f"{address} connected")

        response = client.recv(1024)
        print(response.decode())

print("Close")
client.close()
socket.close()

client.py:

# -*- coding: utf-8 -*-

import socket
from apscheduler.schedulers.blocking import BlockingScheduler

HOST = 'localhost'
PORT = 1602

socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.connect((HOST, PORT))
print(f"Connection on {PORT}")

timeCount = 0

def some_job():
    global timeCount
    timeCount += 1

    print(f"Send N°{timeCount}")
    string = f'Schedule Transmission N°{timeCount}'
    socket.send(f"Schedule Transmission N°{timeCount}".encode())

scheduler = BlockingScheduler()
scheduler.add_job(some_job, 'interval', seconds=5)
scheduler.start()

print("Close")
socket.close()

问题是服务器端只打印(并且可能只接收)第一条消息/第一次传输。因此,即使在第一条消息打印之后,也没有编码问题,并且连接似乎存在。 我很好地理解了代码本身。我看不出有什么问题。运行时出现异常或错误。

有人可以帮帮我吗?

真诚的

【问题讨论】:

  • 你需要一个嵌套循环来继续阅读消息,直到它得到 EOF。
  • 你也可以使用多线程。当客户端连接时,生成一个线程来处理该套接字,同时原始线程等待新连接。
  • @lechat-marcellin 您应该将 socket.listen() 移到无限循环之外。调用一次就足以标记套接字进行侦听。
  • @sigkilled 谢谢。即使这不是我的代码中的问题,在我的培训中知道这一点也很有趣。

标签: python sockets apscheduler python-sockets


【解决方案1】:

我只需要更改您的服务器代码。我添加了多线程。现在多个客户端可以连接到服务器而不会阻塞整个过程。

# -*- coding: utf-8 -*-

import socket
import threading

HOST = 'localhost'
PORT = 1602

socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.bind(('localhost', PORT))

def handle_client(client, addr):
    print(f"[NEW CONNECTION] {addr} connected.")
    connected = True
    while connected:
        response = client.recv(1024)
        if response:
            print(f"[{addr}] {response.decode()}")

    client.close()
    

while True:
    socket.listen()
    client, addr = socket.accept()
    thread = threading.Thread(target=handle_client, args=(client, addr))
    thread.start()

【讨论】:

  • 谢谢。这段代码确实工作得很好,我会使用它。但是,没有多线程和只有 Socket 就没有办法解决问题并达到相同的结果吗?这只是为了我的知识和培训。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-28
  • 2021-08-06
  • 2013-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多