请教socket连接和用户之间的问题

johnsonvily 2012-06-08 11:02:06
如题,请教一个连接如何和一个用户绑定?

目前我使用一个SocketChannel对应一个用户,但由于ScoketChannel没有序列化,连接信息只能存储在内存中,不能存储在缓存服务器(MemCached)上。

请教是否还有其他方式?
...全文
177 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
johnsonvily 2012-06-12
  • 打赏
  • 举报
回复
还是没找到合适的方法
johnsonvily 2012-06-12
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]

SocketChannel 作为transient 类型就是保证user对象在序列化时,不对SocketChannel 序列化。
原因就是 16楼 所说的。
[/Quote]
关于我这个问题,不知你还有没有其他思路或意见,希望能提点一下,谢谢。
古布 2012-06-12
  • 打赏
  • 举报
回复
SocketChannel 作为transient 类型就是保证user对象在序列化时,不对SocketChannel 序列化。
原因就是 16楼 所说的。

qybao 2012-06-11
  • 打赏
  • 举报
回复
SocketChannel本身没有序列化,没法保存到缓存服务器。
这个思路走不通了。
johnsonvily 2012-06-11
  • 打赏
  • 举报
回复
还是没找到解决方法,求高手点化。
johnsonvily 2012-06-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

可以用一个Map来保存
key可以用ip地址之类的,value就保存SocketChannel
[/Quote]
用这个,这个Map还是不能放到缓存服务器上,SocketChannel 没有序列化
你好毒你好毒 2012-06-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
可以用一个Map来保存
key可以用ip地址之类的,value就保存SocketChannel
[/Quote]

说的对。每个线程对象都以IP地址或者其它的用户名什么的为key存其来
qybao 2012-06-08
  • 打赏
  • 举报
回复
可以用一个Map来保存
key可以用ip地址之类的,value就保存SocketChannel
pkanyue 2012-06-08
  • 打赏
  • 举报
回复
帮你顶,对不懂这块
johnsonvily 2012-06-08
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

SocketChannel 作为transient 类型
[/Quote]
对不起,刚才理解错你的用意了,如果将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
johnsonvily 2012-06-08
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

SocketChannel 作为transient 类型
[/Quote]
我这个不是实体类,只是一个普通的类
古布 2012-06-08
  • 打赏
  • 举报
回复
SocketChannel 作为transient 类型
johnsonvily 2012-06-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

LZ 只想缓存连接信息吧,
对缓存连接信息建立对象Cache(含有key),ScoketChannel,Map(含有key)常驻内存。和2楼想法一致。
通过key关联Cache和ScoketChannel。
[/Quote]
不是的,我是想所有的信息都放到缓存中。
具体是这样的:
User 对象中有 userId 和 SocketChannel 对象,
我需要把userId做为key, User对象作为value, 然后封装到Map中,最后存储到缓存服务器上。
由于ScoketChannel没有序列化,目前不知道如何实现,或者是否还有其他方式?

目前我是把Map对象存储在内存中的。
古布 2012-06-08
  • 打赏
  • 举报
回复
LZ 只想缓存连接信息吧,
对缓存连接信息建立对象Cache(含有key),ScoketChannel,Map(含有key)常驻内存。和2楼想法一致。
通过key关联Cache和ScoketChannel。
johnsonvily 2012-06-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 6 楼 的回复:
引用 5 楼 的回复:

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

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

你可以在上面封装一层,让他返回你自己的类型。
[/Quote]
java nio里面还有很多相关类,一一封装感觉很麻烦,不知道还有没有其他方式?
stonecold1108 2012-06-08
  • 打赏
  • 举报
回复
顶2楼。
古布 2012-06-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
引用 5 楼 的回复:

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

新建一个类实现序列化没用的吧,socket.getChannel()返回的是java.nio.channels.SocketChannel,
强制转型,会出现类转换错误的
[/Quote]
你可以在上面封装一层,让他返回你自己的类型。
johnsonvily 2012-06-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

新起一个类,继承SocketChannel 实现序列化
[/Quote]
新建一个类实现序列化没用的吧,socket.getChannel()返回的是java.nio.channels.SocketChannel,
强制转型,会出现类转换错误的
古布 2012-06-08
  • 打赏
  • 举报
回复
新起一个类,继承SocketChannel 实现序列化

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧