当前位置: 首页 > 知识库问答 >
问题:

TCP检测与客户端断开连接的服务器

井通
2023-03-14

我正在用Java编写一个简单的TCP客户机/服务器程序对,如果客户机在10秒内还没有发送任何东西,服务器必须断开连接。socket.setsoTimeout()使我得到了这一点,服务器就可以很好地断开连接。问题是--我如何让客户端确定服务器是否关闭?目前,我使用DataOutputStream向服务器写入数据,这里的一些答案表明,向封闭套接字写入数据将引发IOException,但这不会发生。

编辑:这是客户端代码。这是一个从文件系统中读取一个文件并将其发送到服务器的测试函数。它以块形式发送,并在每个块之间暂停一段时间。

public static void sendFileWithTimeout(String file, String address, int dataPacketSize, int timeout) {
    Socket connectionToServer = null;
    DataOutputStream outStream = null;
    FileInputStream inStream = null;
    try {
        connectionToServer = new Socket(address, 2233);

        outStream = new DataOutputStream(connectionToServer.getOutputStream());

        Path fileObject = Paths.get(file);

        outStream.writeUTF(fileObject.getFileName().toString());

        byte[] data = new byte[dataPacketSize];

        inStream = new FileInputStream(fileObject.toFile());
        boolean fileFinished = false;
        while (!fileFinished) {
            int bytesRead = inStream.read(data);
            if (bytesRead == -1) {
                fileFinished = true;
            } else {
                outStream.write(data, 0, bytesRead);
                System.out.println("Thread " + Thread.currentThread().getName() + " wrote " + bytesRead + " bytes.");
                Thread.sleep(timeout);
            }
        }

    } catch (IOException | InterruptedException e) {
        System.out.println("Something something.");
        throw new RuntimeException("Problem sending data to server.", e);
    } finally {
        TCPUtil.silentCloseObject(inStream);
        TCPUtil.silentCloseObject(outStream);
        TCPUtil.silentCloseObject(connectionToServer);
    }
}

我希望OutStream.write在尝试写入关闭的服务器时抛出IOException,但没有抛出IOException。

共有1个答案

车辰龙
2023-03-14

我希望OutStream.write在尝试写入关闭的服务器时抛出IOException,但没有抛出IOException。

由于套接字发送缓冲区的原因,它第一次不会这样做。如果你继续写,它最终会抛出一个IOException:'Connection Reset'。如果您没有数据来到达那个点,您将永远不会发现对等体已经关闭。

 类似资料:
  • 我正在使用C#window应用程序表单对TCP多线程服务器进行工作,我正在尝试检测客户端的机器是否关闭并断开与服务器的连接。看了一些帖子,有了一些想法: 如何确定tcp是否连接? 我的代码如下: 多谢帮忙。

  • 我正在编写一个使用tcp套接字的服务器/客户端应用程序,我的问题是如何检测半开放连接,我计划使用keep-alive但有些人建议我做我自己的协议,所以我现在的计划是: 在服务器端: 服务器会等待10秒等待客户端发送数据,如果在给定的时间内服务器没有收到客户端的消息,服务器会将客户端标记为断开连接,否则,如果服务器收到客户端的消息,则会重新设置计时器。 我现在的问题是,这样行吗?还是我做错了?还是一

  • 当我再次调用时,第二次调用将按预期返回。但我想明白,为什么第一次打电话成功了?我是否遗漏了某些特定于TCP的细节?这种奇怪的(对我来说)行为只针对{活动,错误}连接。

  • 我想检查一下我的客户是否断开了连接。根据我的研究,一种可能的方式是我可以继续给客户写信。如果客户端未能接收到消息,则表示已断开连接。我向相应的客户端发送消息“Checking Connection:Client”clientNo。 我将clientNo 1连接到服务器,它接收 客户1 但是当我将另一个客户端连接到服务器时,我的clientNo1停止接收来自服务器的消息,我的clientNo2现在将

  • 我正在使用此示例的代码创建我的GRPC异步服务器: 因为我做了一项研究,在那里我发现我必须实现KeepAlive(https://grpc.github.io/grpc/cpp/md_doc_keepalive.html)我添加了以下几行: 到目前为止一切都很好,服务器工作正常,通信畅通。但是,我如何检测到客户端已断开连接?我为所谓的方法添加的行似乎不适合我。 我的错误在哪里?当客户端因任何原因断

  • 我正在开发一个与许多客户端连接的服务器。我需要知道客户端何时与服务器断开连接。因此,每个客户端都向服务器发送一个特定的字符。如果两秒钟后没有收到字符,那么我应该断开服务器与客户端的连接(释放为此客户端分配的资源)。 这是我的服务器的主要代码: 第一个问题是,我用来识别在线客户端的方式(每秒发送特定消息)是否是一种好方法? 如果它是好的,我如何使用检测与女巫客户端相关,然后如何断开密钥与服务器的连接