gpt4 book ai didi

java - 在java网络编程中,有没有办法在Client端关闭的情况下保持Server端打开?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:31:00 26 4
gpt4 key购买 nike

假设我们在 Java 中有一个简单的 Echo 客户端/服务器对。据我了解,一旦 socket 的一侧断开,整个连接就会消失。

但是,如果我想要一个可以始终保持 Activity 状态的服务器,即使客户端挂掉了。我希望能够恢复断开的连接。

回声服务器:

import java.net.Socket;
import java.net.ServerSocket;

public class EchoServer {

public static void main(String[] args) throws Exception {

// create socket
int port = 4444;
ServerSocket serverSocket = new ServerSocket(port);
System.err.println("Started server on port " + port);

// repeatedly wait for connections, and process
while (true) {

// a "blocking" call which waits until a connection is requested
Socket clientSocket = serverSocket.accept();
System.err.println("Accepted connection from client");

// open up IO streams
In in = new In (clientSocket);
Out out = new Out(clientSocket);

// waits for data and reads it in until connection dies
// readLine() blocks until the server receives a new line from client
String s;
while ((s = in.readLine()) != null) {
out.println(s);
}

// close IO streams, then socket
System.err.println("Closing connection with client");
out.close();
in.close();
clientSocket.close();
}
}
}

感谢任何提示

最佳答案

您缺少的是“ session ”的概念。想一想服务器的位置,当一些位“在线”到达时。这些怎么办?使用 TCP/IP,在线路上已经存在一些信息,即:

  • 源地址
  • 源端口
  • 目标地址
  • 目的港
  • 消息负载本身
  • 一些其他东西(例如序列计数器,以确保“数据包”在传输过程中不会困惑)

服务器的操作系统使用 src/dest addr/port 信息来决定这是否是“一个已经在进行中的对话”。它主要考虑 dest port(因为消息已经通过 Internet 和防火墙到达机器本身)来决定是否让您的 Java 程序监听“dest port”。但是,它使用整个 src-addr/src-port/dest-addr/dest-port 来尝试将有效载荷传递给您的程序按照发送者发送它们的顺序(这可能不是他们到达的顺序,因为中间有互联网)。请注意,单个“消息”实际上可能会分成多个数据包。您的操作系统的 TCP/IP 堆栈正在为您完成大量工作。

但是,请注意,为了代表您执行此功能,操作系统必须投入一些资源来“跟踪”TCP/IP session 的状态。至少,对于每组 port/addr src/dest,需要有一个计数器来记录最后一个收到的“数据包”,一些缓冲区空间来保存数据包,直到你的程序准备好使用它们,等等

现在 TCP/IP 堆栈实现者面临的问题是“我应该‘坚持’到这种状态多长时间”? 10秒够吗? 20分钟?在某个时候,在一段时间没有收到客户端的消息后, session 必须“超时”。如果在一个序列中有更多的数据包要发送,并且客户端再次开始发送它们,服务器必须能够说“抱歉,你正在向我发送一些先前消息的数据包 234,但是因为我没有收到你一会儿,我扔掉了数据包 1-233。我们可以重新开始吗?”。

所以从这个意义上说,没有办法阻止客户端“断开连接”。当然,您可以继续监听套接字,以防客户端恢复并发送更多数据。但是您和您的客户需要一种方法来“从中断处继续”。

在 HTTP 中,这是通过使用“ session cookie”实现的——服务器提供给客户端的一个长的唯一字符串,并且客户端重新发送每个新请求(无论它是否发生在同一个 TCP 级 session 中) ).这是一个“应用程序级 session ”,其生命周期比 TCP session 长。

由于您正在编写一个应用程序,并且听起来您对客户端和服务器彼此之间的对话(“协议(protocol)”)有一定程度的控制权,因此您有更多关于如何达成一致的选择什么是 session ,如果客户端“离开”( session 超时)如何处理事情,以及双方将如何恢复并“从我们离开的地方继续”(重新建立 session )。不要忘记身份验证!

正如其他人所说,这在很大程度上取决于您要实现的目标。

关于java - 在java网络编程中,有没有办法在Client端关闭的情况下保持Server端打开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31531422/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com