Java服务器 - 客户端编程

时间:2011-01-30 18:42:16

标签: java multithreading connection

喜 我是java的初学者我有一个疑问:

在这种情况下,例如我写了一个服务器和3个客户端的游戏,因为我不需要线程,因为客户遵循一个明确的订单,只有其中一个可以轮流玩,

我可以让服务器监听并执行这样的代码:

 while((i++ < maxConnections) ){

      Socket connection  = listener.accept();
        // code that saves the  "connection"  to a player Object 
        //not closing the connection 

      }

告诉我,如果我错了(对接受后的部分感兴趣):

如果我每次为每个客户端创建它时都不关闭连接,我可以每次需要时从流中写入和读取吗? (使用保存在每个播放器对象中的连接变量)  只有当客户端完成与服务器的所有通信时才会关闭连接

如果我不关闭它,第二个客户端无法连接?它只能用于线程吗?

抱歉,但我对netprogramming感到困惑

2 个答案:

答案 0 :(得分:2)

此方法的缺陷是您必须接收那么多侦听器才能继续执行应用程序。此外,你必须存储它们(我可以看到你正在使用Player对象)。我要做的是,因为游戏太小,所以将接受的套接字端点传递给新的线程,在那里它们将被管理。此系统的问题在于您没有发送/接收处理,因此您需要管理此操作而不会阻塞服务器的其余部分。你不应该在单独的线程中从套接字发送和接收,在同一个线程中管理发送和接收,但要聪明并且不要阻塞。

另外,我建议使用Socket通道来简化编程。此实例中的选择器将告诉您套接字何时可用于读取的数据或可用于写入的发送缓冲区中的空间。在使用它注册通道后,在循环中等待选择器的select()方法。 Apache MINA更容易,因为它处理套接字并为您提供异步方法,并处理所有这些底层的东西。您可以选择使用这些操作或等待操作完成,因此它非常灵活。

答案 1 :(得分:1)

为每个连接的客户端使用一个线程。 您的游戏逻辑应独立于实际的底层技术,以便从客户端向服务器获取数据。

如果您打算认真对待游戏服务器开发,RedDwarf已经为您准备好了所有内容。