当前位置: 首页 > 面试题库 >

如何保持套接字打开,直到客户端关闭它?

殷永嘉
2023-03-14
问题内容

我有简单的python服务器和客户端。

服务器:

import SocketServer
import threading


class MyTCPHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        self.data = self.request.recv(1024).strip()
        print str(self.client_address[0]) + " wrote: "
        print self.data
        self.request.send(self.data.upper())


if __name__ == "__main__":
    HOST, PORT = "localhost", 3288
    server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
    server.serve_forever()

客户:

import socket
import sys
from time import sleep

HOST, PORT = "localhost", 3288
data = "hello"

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
    sock.connect((HOST, PORT))
    sock.send(data + "\n")
    received = sock.recv(1024)

    sleep(10)

    sock.send(data + "\n")
    received = sock.recv(1024)

    sleep(10)

    sock.send(data + "\n")
    received = sock.recv(1024)

finally:
    sock.close()

这是我得到的输出:

服务器:

>python server.py
127.0.0.1 wrote:
hello

客户:

>python client.py
Traceback (most recent call last):
  File "client.py", line 18, in <module>
    received = sock.recv(1024)
socket.error: [Errno 10053] An established connection was aborted by the software in your host machine

我也在Linux机器上尝试过。服务器仅收到一条消息,然后第二条消息的recv语句出现错误。我刚刚开始在python上学习网络,但是我认为服务器由于某种原因正在关闭套接字。我该如何纠正?


问题答案:

MyTcpHandler为每个连接创建一个对象,并handle调用该对象以处理客户端。handle返回时连接将关闭,因此您必须在方法中处理来自客户端的完整通信handle

class MyTCPHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        while 1:
            self.data = self.request.recv(1024)
            if not self.data:
                break
            self.data = self.data.strip()
            print str(self.client_address[0]) + " wrote: "
            print self.data
            self.request.send(self.data.upper())

注意:当客户端关闭连接时recv返回'',因此我移动了.strip()之后,recv因此没有错误警报,因为客户端仅发送空白。



 类似资料:
  • 在Python中,我将“WebSockets”库用于websocket客户端。 问题是一旦收到响应,客户端websocket连接就会断开。我希望连接保持打开,以便以后可以发送和接收消息。 为了保持websocket打开并能够在以后发送和接收消息,我需要做哪些更改?

  • 我正在开发一个非常简单的Java客户机/服务器系统(只是为了让我的脚沾满套接字)。由于某种原因,我一直收到“套接字已关闭”错误。。。这是我的密码。。 服务器文件 客户端文件 我在客户端的第41行得到了错误,然后在第46行得到了NullPointerException。。 提前感谢您的帮助。我只是想在这里学习。

  • 使用 DataInputStream 获取从 Android 客户端发送到此 Java 桌面服务器的 int 和 long。之后,从Android客户端接收pdf文件。总共 3 个文件由客户端发送到服务器。问题是在另一个方向发送时。 我必须在while循环之后立即关闭输入和输出流。如果我不这样做,pdf文件将被破坏,程序将停止并停留在while循环中,不会继续执行到线程的末尾。 如果我必须关闭输入

  • 我想用java写一个传输文件套接字程序。但我有问题,如何取消时传输文件。 当我在客户端关闭inputstream时,服务器如何知道它关闭了outputstream。 这是我的代码:客户 ...... 服务器 ...... 但当我关闭inputstream时没有显示任何内容

  • 我正在编写一个简单的客户端/服务器套接字程序,其中客户端与服务器连接并通信,然后它们向服务器发送退出消息,然后服务器关闭连接。代码如下所示。 服务器.py client.py 我想要的是万一服务器通过ctrl-c或任何其他方式退出,我希望关闭所有客户端套接字,并将msg发送给客户端,他们也应该在其上关闭套接字。 我在下面除部分之外的部分做了一些工作,但由于某些原因,客户端没有收到服务器发送的消息。

  • 我注意到netstat的套接字是打开的: 这是意料之中的行为吗?我是否需要显式地将连接头值设置为close以防止这种情况发生?

  • 我编写了简单的服务器/客户端程序,其中客户端将一些硬编码数据以小块形式发送给服务器程序,服务器程序正在等待数据,以便将其打印到终端。在客户端,我在循环中调用send(),同时有更多的数据要发送,而在服务器上,我使用read()执行同样的操作,即返回的字节数为 如果我在完成发送后专门在客户端的套接字上调用close(),那么这个示例非常有效,但如果我不这样做,服务器将不会实际退出read()循环,直

  • 问题内容: 我有一个Python应用程序,该应用程序打开一个简单的TCP套接字以与单独主机上的另一个Python应用程序进行通信。有时程序会出错,或者我将直接杀死它,并且无论哪种情况,套接字都可能在未知的时间内保持打开状态。 下次我运行程序时,出现此错误: 现在,程序始终尝试使用相同的端口,因此看起来好像它仍处于打开状态。我检查了一下,很确定程序没有在后台运行,但是我的地址仍在使用中。 因此,如何