小女子求教一个问题: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));
}

...全文
100 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
客户端代码可能有问题,建议找找看。

可以通过 IP 地址来判断,如果 IP 已经登录过了,就不允许再登录了。
  • 打赏
  • 举报
回复
不停地登录?那可不是网络原因哦!
yaoyuegulang 2010-08-15
  • 打赏
  • 举报
回复
有点高深,只能自卑的帮顶一下咯
Canny 2010-08-14
  • 打赏
  • 举报
回复
不知道 不过给你顶一下

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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