小女子求教一个问题:D

bicel1222 2010-08-14 05:06:10
客户端通过GPRS连接到服务器,服务器接到客户端的socket后,通过线程池为此分配一个线程供它执行其他任务。并且用一个HASHMAP(socketID,socket)保存连接上的客户端。
可是实际测试中,发现客户端可能是因为网络问题也可能是其他原因,只是很少的一部分并不是登录一次就完了,而是不停的登录,消耗了很多资源。
自己想了一个办法,因为当一个socket连接上后会发一串登录信息,包括客户端的ID,我就通过这个ID在HASHMAP里看存不存在该KEY得socket,如果存在,就把这个socket关闭,并把最新登录的客户端再保存在HASHMAP里。这个方法虽然笨拙,但也解决了同一个客户端重复登录消耗资源的问题。
虽然解决,但还是有许多并发症,所以在此求一个良方,我的想法是如果是同一个客户端登录的话就不要给他线程,但不知道该怎么实现。
这是服务端接收连接和启动一个线程的代码,怎么在为客户端启动一个线程前判断他是否已经登录过呢?通过ADDRESS吗?
while (true) {
Socket socket = null;
// 接收连接,只要客户进行了连接,就会触发accept();从而建立连接
socket = serverSocket.accept();
System.out.println("====来自IP:"
+ socket.getInetAddress().toString() + "\t端口:"
+ socket.getPort() + "的连接====");
//启动一个线程运行该Socket
tpe.execute(new TcpSocketNew(socket));
//new TcpSocketNew(socket).run();
//executorService.execute(new TcpSocketNew(socket));
}

...全文
86 点赞 收藏 4
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
客户端代码可能有问题,建议找找看。

可以通过 IP 地址来判断,如果 IP 已经登录过了,就不允许再登录了。
回复
不停地登录?那可不是网络原因哦!
回复
yaoyuegulang 2010-08-15
有点高深,只能自卑的帮顶一下咯
回复
Canny 2010-08-14
不知道 不过给你顶一下
回复
相关推荐
发帖
Web 开发
创建于2007-09-28

8.0w+

社区成员

Java Web 开发
申请成为版主
帖子事件
创建了帖子
2010-08-14 05:06
社区公告
暂无公告