Java理解servlet

Java理解servlet,java,servlets,Java,Servlets,我正在做一个家庭作业项目,该项目应该在两个客户端之间通过HttpServlet实现一个棋盘游戏。我有几个问题: 1) 我读到HttpServlets必须是无状态的,然而,为了游戏的缘故,我必须保持很多状态(轮到谁了,董事会的状态等等)。我必须把这个保存在客户那里吗?HttpServlet是否确实必须是无状态的,即没有跟踪状态的字段 2) 我知道客户机将通过doGet/doPost方法与servlet通信,但是servlet如何与客户机通信(例如,如果播放器1刚刚移动并将其发送给servlet,s

我正在做一个家庭作业项目,该项目应该在两个客户端之间通过HttpServlet实现一个棋盘游戏。我有几个问题:

1) 我读到HttpServlets必须是无状态的,然而,为了游戏的缘故,我必须保持很多状态(轮到谁了,董事会的状态等等)。我必须把这个保存在客户那里吗?HttpServlet是否确实必须是无状态的,即没有跟踪状态的字段

2) 我知道客户机将通过doGet/doPost方法与servlet通信,但是servlet如何与客户机通信(例如,如果播放器1刚刚移动并将其发送给servlet,servlet必须告诉客户机2移动的内容)

多谢各位


另外,如果您能在网上为我提供一个类似代码的有用、简单的示例,我将非常感激

servlet需要能够处理多个请求——它们不需要是无状态的,但它们必须管理该状态以避免典型的多线程问题。显然,如果你有两个用户需要访问同一个世界,你需要一个机制来实现这一点。如果不是为了避免作弊或恶意客户端,服务器可能会帮助跟踪游戏状态

有多种选择;客户端可以轮询移动更新,您可以使用长轮询等

  • HTTP协议是无状态的,因此是HttpServlet。您可以使用ServletAPI在服务器端维护会话状态。阅读

  • 有几种技术,比如H,技术,比如和


  • 其他人已经涵盖了#1

    我就给你推荐一下2号。另一个选择是快速查看AJAX(异步Javascript和XML)。您可以触发“幕后”HTTP请求并调整页面,而无需用户刷新页面。客户端可以加载HTML页面,该页面可以包含javascript,每几秒钟与服务器检查一次更新并刷新其板

    。此外,如果您不想担心特定于浏览器的javascript,可以使用jQuery。它有非常用户友好的api用于触发ajax请求,并处理特定于浏览器的内容

    编辑

    好的,对于#1-您的servlet将用于服务所有请求,可能是并行的。你不能将你的游戏板直接放在servlet b/c中,那么你可能会有20个人试图编辑同一个游戏

    public class GameServlet extends HttpServlet {
       private GameBoard board; // everyone would share the same board!
    
    您有两个选项,您可以将电路板存储在用户访问的某个集合中。您可能还想看看HttpSession。HttpSession是服务器端内存的一部分,servlet将为您跟踪,您可以跨请求访问它

    public void doGet(HttpServletRequest req, HttpServletResponse resp) {
    
      HttpSession session = req.getSession();
      session.setAttribute("board", new GameBoard());  // this way each user will have their own game board
    
      // and you can retrieve it in another HTTP request
      GameBoard board = session.getAttribute("board");
    }
    

    使用HttpSession对您来说可能有点棘手,因为板更新实际上需要更新两个用户的板。您可能只喜欢servlet上由用户索引的集合成员。希望这就足够让您开始了。

    HTTP作为一种协议是无状态的(正如人们所提到的)。然而,http的一小部分是在服务器和客户端之间来回传递“Cookies”。这些cookies是一个单独的RFC(http://www.ietf.org/rfc/rfc2109.txt)由HTTP客户端(即浏览器)进行交互。就HTTP而言,Cookie只是另一个标题字段,但它们对浏览器具有特殊意义

    基于servlet的程序使用这些cookie将会话id传递回客户端浏览器。当客户端发送后续请求时,该cookie将自动发送回发出请求的服务器。服务器识别用户会话的标识符。这对程序员来说是透明的

    通常,tomcat(或其他容器)会为您处理这个问题,您所要做的就是请求servlet请求会话:

    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
    
        // the parameter determines if session can be created if one does not exist for the client
        HttpSession session = req.getSession(true); 
    
        session.setAttribute("attName", attValue);
    }
    

    您可以使用会话来存储/检索属性。至于常见的游戏状态,这很可能存储在其他地方(某种游戏管理器对象),但是您可以在用户会话中存储用户的当前游戏id,这将允许servlet为用户找到合适的游戏。当用户移动时,游戏状态将通过http请求更新,该请求表明了这一点。两个用户都必须定期发出http请求,以询问游戏的当前状态、最近的动作等……

    轮询是什么意思?这是关于我的第二个问题吗?有什么例子可以证明这一点吗?@Trup有短轮询(页面刷新、计时器/ajax等)和长轮询(comet等),查找示例应该很容易。我自己对长时间投票不太熟悉,所以不喜欢指出任何具体的问题。为什么你的观点与戴夫·牛顿的相矛盾?而且,1)中的链接不起作用。@Trup 1)我们说的是同一件事。正如我所提到的,HTTP是无状态的,但Servlet为您提供了API来管理状态。该链接对我有效,但我已为您更改为另一个链接。谢谢,它现在有效。那么,您是说Servlet类不能像任何其他类一样简单地将状态保存在字段中?接下来要做的最简单的事情是什么?@Trup Servlets可以在字段中保存状态,但对该字段的访问必须同步——这是典型的多线程问题。如果服务器必须为多个玩家维护世界状态,那么在某个地方,共享状态必须是线程安全的。它不必在servlet中,也可以是应用程序范围中的静态对象(ew,但meh,它必须在某个地方),等等@Trup-只创建servlet的一个对象来服务所有客户端请求。这意味着在servlet中存储状态不是线程安全的,因此不建议这样做。此外,servlet内置了api,可以通过无状态协议实现状态管理,因此利用它比构建自己的协议更好?我仍然不太明白我应该做什么/我能做什么2)看一个投票的例子