如题,请教一个连接如何和一个用户绑定?目前我使用一个SocketChannel对应一个用户,但由于ScoketChannel没有序列化,连接信息只能存储在内存中,不能存储在缓存服务器(MemCached)上。请教是否还有其他方式?

解决方案 »

  1.   

    可以用一个Map来保存
    key可以用ip地址之类的,value就保存SocketChannel
      

  2.   


    说的对。每个线程对象都以IP地址或者其它的用户名什么的为key存其来
      

  3.   

    用这个,这个Map还是不能放到缓存服务器上,SocketChannel 没有序列化
      

  4.   

    新起一个类,继承SocketChannel 实现序列化
      

  5.   

    新建一个类实现序列化没用的吧,socket.getChannel()返回的是java.nio.channels.SocketChannel,
    强制转型,会出现类转换错误的
      

  6.   

    java nio里面还有很多相关类,一一封装感觉很麻烦,不知道还有没有其他方式?
      

  7.   

    LZ 只想缓存连接信息吧,
    对缓存连接信息建立对象Cache(含有key),ScoketChannel,Map(含有key)常驻内存。和2楼想法一致。
    通过key关联Cache和ScoketChannel。
      

  8.   

    不是的,我是想所有的信息都放到缓存中。
    具体是这样的:
    User 对象中有 userId 和 SocketChannel 对象,
    我需要把userId做为key, User对象作为value, 然后封装到Map中,最后存储到缓存服务器上。
    由于ScoketChannel没有序列化,目前不知道如何实现,或者是否还有其他方式?目前我是把Map对象存储在内存中的。
      

  9.   

    SocketChannel 作为transient 类型
      

  10.   

    对不起,刚才理解错你的用意了,如果将ScoketChannel定义为transient类型,存储是可以,但是取出来是一个null值,代码如下:Map<Integer, User> m = new HashMap<Integer, User>();
    User user = new User();
    user.setUserId(userId);
    user.setChannel(channel);
    m.put(userId , user);
    System.out.println(user.getChannel());
    MemCacheUtils.set("usrKey", m);
    m = (HashMap<Integer, User>) MemCacheUtils.get("usrKey");
    user = m.get(userId);
    System.out.println("---------------");
    System.out.println(user.getChannel());输出结果:
    java.nio.channels.SocketChannel[connected local=/192.168.1.121:7521 remote=/192.168.1.121:50541]
    ---------------
    null
      

  11.   

    SocketChannel本身没有序列化,没法保存到缓存服务器。
    这个思路走不通了。
      

  12.   

    SocketChannel 作为transient 类型就是保证user对象在序列化时,不对SocketChannel 序列化。
    原因就是 16楼 所说的。