2012-03-29 85 views
0

我目前正在开发一个Java客户端/服务器应用程序,我无法决定如何设计客户端。设计java客户端

目前我有一个服务器可以接受多个连接,并且每个连接都有一个循环监听命令并响应它们。服务器看起来是这样的:

try{ 

     mIn = new DataInputStream(mSocket.getInputStream()); 
     mOut = new DataOutputStream(mSocket.getOutputStream()); 

     while(true){ 

      byte tPackType = mIn.readByte(); 

      switch(tPackType){ 

       case PackType.LOGIN: 
        login(); 
        break; 
       case PackType.REGISTER: 
        register(); 
        break; 
       default: 

      } 

     } 

    }catch (IOException e){ 
     mLog.logp(Level.WARNING, this.getClass().getName(), "run()", "IOException in run()", e); 
    }finally{ 
     try{ 
      mOut.close(); 
      mIn.close(); 
      mSocket.close(); 
     }catch (IOException e){ 
      e.printStackTrace(); 
     } 
    } 

现在,客户基本上只是一个数字的向服务器发送一个请求方法和返回响应。我希望能够从服务器接收更新。 我会很感激任何关于阅读的建议,可以帮助我找到解决方案。 有没有我可以看到的模式?

谢谢你,veLr。

回答

1

I want to be able to receive updates from the server

我认为你有两个选择这样做。

  • 选项1是让您的客户端轮询服务器以获取更新。我不会推荐这个,因为这最终会增加你的服务器负载。在尝试扩展系统时,您很可能会遇到性能问题。

  • 选项2是在您的客户端上创建一个小型服务器。所以基本上,只要有更新,服务器就会连接到客户端并向其发送更新。我会推荐这个程序,因为它只允许你在需要时在你的服务器和客户端之间建立连接。与以前的方法相反,问题是您需要跟踪客户端的端口和IP。您可以实施一个HashTable,将客户端ID作为密钥及其连接属性作为其密钥。一旦你有更新,你将在HashTable中查找客户端,获取连接信息,连接并发送信息。

然后,客户端的服务器将获取数据并在收到更新后执行您希望客户端执行的任何操作。

+1

选项3是客户端连接到服务器,但等待服务器通过连接发送更新。这样可以避免轮询,还可以避免服务器启动连接回客户端,这在涉及防火墙时往往会导致问题。 (加上它很奇怪。) – Wyzard 2012-03-29 08:42:30

+0

@Wyzard:如果我正确理解你,你希望客户端在服务器上打开一个端口并保持打开状态而不做任何事情? – npinti 2012-03-29 08:45:00

+0

打开*连接*,但是。 (“打开端口”意味着要么监听传入的连接,要么配置防火墙以允许通过连接。)客户端启动连接,因为它知道服务器的地址,服务器不需要知道所有客户端的连接,地址。但是一旦连接,服务器就知道什么时候需要发送更新,而客户端不知道。所以服务器启动更新。 – Wyzard 2012-03-29 08:51:18