与学校封闭端口联网

use*_*700 10 java port networking

我在高中教授编程课程,我正在尝试为我的学生提供一个网络项目.我当时认为让他们做一个战舰类型的游戏是非常可行的,我认为他们真的会对此感到兴奋.我可以使用家用电脑上的插座做到这一点,但在学校,所有端口都关闭,他们没有为我打开它们.

有没有解决方法(比如有一个关于转发信息的网络服务协议)?有任何想法吗?

(班级基础,学生没有太多背景 - 我需要尽可能简化).

Ste*_*ein 1

这个 servlet 应该像评论中所宣传的那样工作(尚未测试):

发送带有 URL 参数的消息to并message

接收带有(接收者 ID)的消息get。返回一条消息,如果没有,则不返回任何内容。应该可以用浏览器测试。

在现实世界中,获取请求不应该真正改变服务器的状态。我只会在上课时运行这个,因为任何人都可以向任何 id 发送内容,任何人都可以读取任何 id 的内容。

public class SimpleMessageServlet extends HttpServlet {
  private Map<String,String> messages = new HashMap<String,String>();

  public void doGet(HttpServletRequest request, HttpServletResponse response) 
       throws ServletException, IOException {
    String to = request.getParameter("to");
    String message = request.getParameter("message");
    if (to != null && from != null && message != null) {
      messages.put(to, message);
    }
    response.setContentType("text/plain");
    String get = request.getParameter("get");
    if (get != null) {
      String result = messages.remove(get);
      if (result != null) {
        PrintWriter out = response.getWriter();
        out.println(result);
      }
    }
 }
Run Code Online (Sandbox Code Playgroud)

编辑:简化为每个地址仅存储一条消息,对于回合制游戏来说应该足够了,缓冲只会增加客户端逻辑的复杂性(从之前的比赛等中清除过时的回合数据)。以某种方式同步客户端可能是有意义的,例如在发送轮流之前发送“开始”信号,并在收到“开始”之前丢弃任何内容。遗憾的是,这需要轮询,使用点对点套接字会更好。