为什么我不能使用TCP客户端发送两条消息?(续)

2024-10-01 11:29:22 发布

您现在位置:Python中文网/ 问答频道 /正文

这是an earlier question的延续。我正在启动一个新的线程,以便我可以显示最新的完整的服务器和客户端代码,包括我在该线程和Reddit上收到的所有建议。在

我在Windows7Pro下运行。在

我有一个用Python编写的非常简单的TCP服务器。它创建一个socketserver对象并等待消息。当一个到达时,服务器将其打印到控制台,并通过同一个端口发送一个简单的确认。在

客户机向服务器发送一条带编号的消息,等待确认,然后显示它。然后它询问用户是否应该发送另一条消息。在

第一条消息已成功发送和确认。在客户端,第二条消息似乎已成功发送;对网络流的Write()方法的调用成功。但是当调用Read()消息以获得确认时,会抛出一个异常:“主机中的软件中止了已建立的连接。”

以下是服务器代码:

import json
import threading

import socketserver
import time

with open('CAPS_TWMS_config.json', 'rt') as c:
    caps_config = json.load(c)

# We are listening on this port and all defined IP addresses
# listenPort = 5001
listenPort = caps_config["listen_port"]

# Were to send the information to.
clientIPAddress = '127.0.0.1'   # socket.gethostbyname('client')
# clientPort = 12345
clientPort = caps_config["send_port"]

dsnName = caps_config["dsn_name"]

# Message sequence number
sequence_num = 1
exit_app = False

class ListenSocketHandler(socketserver.BaseRequestHandler):
    """
    The RequestHandler class for our server.

    It is instantiated once per connection to the server, and must
    override the handle() method to implement communication to the
    client.
    """
    def __init__(self, request, client_address, this_server):
        socketserver.BaseRequestHandler.__init__(self, request, client_address, this_server)
        self.timeout = 10

    def handle(self):
        try:
            data = self.request.recv(1024).decode()
            # print (str.format("dataString[21]: {0}; dataString[24:26]: {1}", data[21], data[24:26]))
            print ('ListenSocketHandler recv()-> "%s"' % data)
            print ('ListenSocketHandler recv().length-> "%d"' % len(data))

            if len(data) > 0:
                self.request.send("I got a message!".encode())
                return
        except Exception as value:
            print('ListenSocketHandler - %s' % str(value))

        return


class ListenServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
    """
    The multi-threaded server that will spawn threads running the Socket Handler for each
    connection
    """
    pass

if __name__ == '__main__':

    try:
        # Create the Server Handler for connections to this computer listening on all IP addresses,
        # change '' to 'x.x.x.x'  to listen on a specific IP network.  This class will listen for messages    # from CAPS.
        server = ListenServer(('', listenPort), ListenSocketHandler)
        ip, port = server.server_address

        # Start a thread with the server -- that thread will then start one
        # more thread for each request
        server_thread = threading.Thread(target=server.serve_forever)
        # Exit the server thread when the main thread terminates
        server_thread.setDaemon(True)
        server_thread.start()

        while not exit_app:
            time.sleep(1)

        print ('Out of main loop.')
        server.shutdown()
        server.server_close()
    except Exception as value:
        print("Failed to do something: %s", str(value))

以下是客户代码:

^{pr2}$

Tags: thetoimportself服务器config消息for
1条回答
网友
1楼 · 发布于 2024-10-01 11:29:22

在您的代码中,每次连接新客户机时,它都在读取数据并向客户机确认,处理程序在以下语句后立即关闭(即返回)

 self.request.send("I got a message!".encode())
                return

因此连接是关闭。并且没有从客户端发送进一步的命令。您可以在循环中等待以接收和确认。在

相关问题 更多 >