保持来自自制Java服务器的持久连接

保持来自自制Java服务器的持久连接,java,persistent,Java,Persistent,我构建了一个简单的Java程序,它在本地充当服务器 目前,它做了一些事情,例如预览目录,如果目录包含index.html,则转发到index.html,发送上次修改的标题,如果自请求后修改,则正确响应客户端的 我现在需要做的是让我的程序接受持久连接。它现在是线程化的,因此每个连接都有自己的线程。我想将我的整个线程代码放在一个循环中,该循环一直持续到连接:关闭或指定的超时 有人知道从哪里开始吗 编辑:这是一个大学项目,必须在不使用框架的情况下完成 我有一个main方法,它无限循环,每次循环创建一个

我构建了一个简单的Java程序,它在本地充当服务器

目前,它做了一些事情,例如预览目录,如果目录包含index.html,则转发到index.html,发送
上次修改的
标题,如果自请求后修改,则正确响应客户端的

我现在需要做的是让我的程序接受持久连接。它现在是线程化的,因此每个连接都有自己的线程。我想将我的整个线程代码放在一个循环中,该循环一直持续到
连接:关闭或指定的超时

有人知道从哪里开始吗

编辑:这是一个大学项目,必须在不使用框架的情况下完成

我有一个main方法,它无限循环,每次循环创建一个Socket对象,然后创建一个
HTTPThread
对象(我自己创建的一个类)-处理单个请求

我想允许多个请求在一个连接中使用
connection:keep-alive
请求头工作。我希望在我的
HTTPThread
类中使用一个循环,但我不知道如何传递多个请求


提前感谢:)

我假设您是从套接字API开始自己实现HTTP协议代码的。并且您正在实现HTTP规范的持久连接部分

您可以按照建议将代码放入循环中,并使用Socket.setSoTimeout设置阻塞操作的超时,从而设置HTTP超时。你不需要做任何事情来重新使用你的连接流。。。除了不关闭它们之外


我想指出的是,有更简单的方法来实现web服务器。有许多现有的Java web服务器框架和应用程序服务器,或者您可以重新调整Apache HTTP协议栈的用途

  • 如果它应该像web服务一样工作:从客户端打开两个套接字,一个用于请求,一个用于请求 响应。保持套接字和流处于打开状态

    您需要定义一个分隔符来通知另一方 转机结束了。二进制文件的特殊位字符串,特殊 字符(通常为换行符),用于基于文本的协议(如XML)

  • 如果您真的试图实现自己的http服务器,那么应该使用已经实现了http 1.1连接keepalive标准的

  • 让您开始的一些想法:

    这篇wikipedia文章描述了HTTP 1.1持久连接:

    您不想关闭套接字,但在一段非活动时间(Apache2.2使用5秒)后,您想关闭它

    您有两种实现方法:

  • 在线程中,不要关闭套接字,也不要退出线程,而是在套接字上设置一个读取超时(无论您希望支持什么)。当您调用read时,它将阻塞,如果超时过期,则关闭套接字,否则读取下一个请求。这样做的缺点是,无论您的最大等待时间是多少,每个持久连接都同时持有一个线程和一个套接字。这意味着您的解决方案无法扩展,因为您持有线程的时间太长(但对于学校项目来说可能没问题)

  • 通过维护元组列表{socket,timestamp},使用后台线程监视器和超时的关闭连接,以及使用NIO检测现有打开套接字上的新读取,可以绕过(1)的限制。因此,在读完初始请求后,您只需退出线程(将其返回到线程池)。显然,这要复杂得多,但它有释放请求线程的好处


  • 你能再解释一下你说的“持久连接”是什么意思吗?如果会话暂时断开连接,您可能想保存会话状态以恢复它吗?我的问题是我不完全理解我需要做什么!目前,我有一个循环调用一个名为HTTPThread的类。它传递一个inputStream和一个outputStream。然后HTTPThread类相应地解析请求。如果连接状态是keep-alive,我想在下一个请求中使用我已经拥有的连接。我当前有一个循环,为每个请求声明一个套接字。HTTPThread对象(我所有的代码都在其中)接受inputstream和outputstream,并在其中处理单个请求。如何从HTTPThread类内部执行多个请求(单个连接)?soTimeout与持久连接有什么关系?如本文所述,HTTP 1.1始终使用持久连接,除非标头中另有指示。Apache 2.2在空闲5秒后关闭套接字。因此,您不必关闭套接字,但如果它空闲时间过长,还需要设置一些计时器来关闭它。一种方法是有一个专门的管理线程来处理这个(也许还有其他)任务。不幸的是,这是一个大学项目——必须用简单的基本java完成——不幸的是,没有人知道如何开始实现它!它的家庭作业我怀疑正确的解决方法是使用一个已经实现了它的库。我理解,那么你当然应该自己实现它Java Socket API提供了一种设置SO_KEEPALIVE的方法:我认为套接字上的keep alive不同于HTTP 1.1持久性连接。HTTP持久性连接是一种更高级别的抽象,但如果您自己实现了所有内容,则需要使用这些套接字方法。为什么?socket keep alive用于通知死掉的对等方,并在没有流量时保持连接的活动状态(通过发送带有ACK的零长度数据包)。HTTP持久连接使套接字在短时间内保持打开状态以提高性能,因为每个客户端可能在短时间内发出多个请求。除了名字相似之外,我看不出这是怎么回事