我现在要用socket和多线程实现一个多人玩的游戏。要求每个人可以看到所有人的计分表,如图于是我在server端弄了个list叫allOut,想每次连接一个客户端就把他的输出流装进去。然后遍历发给所有客户端。但是现在问题是。第一个客户端连上后,allOut长度为1。所以遍历时候也只是输出了自己的对象。只有到最后一个客户端allOut这个list才把所有的输出流装进去了。所以如何让所有线程可以共享这个allOut List?或者有什么更好的方法可以实现这个需求呢?真的很紧急,拜托各位大佬了

解决方案 »

  1.   

    要看你做的 是端游还是页游了。
    端游,可以考虑用NIO技术,可以考虑Netty框架。
    页游的话,可以关注下webSocket。
      

  2.   

    如何让线程共享list集合?使用单例模式下构建个线程安全的list就好了
      

  3.   

    没明白你说的“只有到最后一个客户端allOut这个list才把所有的输出流装进去了”,你不是多线程吗,每次连接一个客户端直接加到集合就是了,你的集合最好这样定义
    public static volatile List<Socket> clientSockets = new ArrayList<Socket>();
      

  4.   

    理解一下楼主的大概的意思就是 随着用户陆续的登录,就会有玩家的数量增加, 每个玩家都有类来封装了游戏中的参数, 这些数据是动态的, 需要实时的推送给页面前段;   
    这其实一个实时推送的问题;  我们之前有过项目经验, 提示你可以采用websocket + mina 建立tcp长连接的方式, 对session进行维护起来, 然后我们需要例如每隔1s就采用我们维护的session来push一次数据(玩家的得分数据);websocket 和 mina 之前通信需要通过一个filter 可以参考github开源项目:https://github.com/coopci/mina-websocket-filter.git  
      

  5.   

    我觉得应该有个游戏用户列表来管理socke和UI
    当游戏有戏用户加入时(新用户的socke和UI加入游戏用户列表),触发某个回调
    回调方法就是遍历游戏用户表,把UI信息通过socket发给各个游戏用户