socket对象保存与获取

liulinisgood 2012-12-04 01:58:21
我想问一下,服务器接收到客户端的连接对象后,将其保存起来(比如map保存)。下次服务器端接收到该客户端发过来消息,是如何知道是哪个客户端发过来的消息(不要说是通过map映射)。详细的说一下,假如一个客户端第一次和服务连接,服务器将其保存到map表中,下一次该客户端发消息过来,服务器此时如何知晓应该用哪个socket来接受。因为在接受消息必须要先得到socket对象。
...全文
789 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
liulinisgood 2012-12-06
  • 打赏
  • 举报
回复
引用 17 楼 lkclkc88 的回复:
引用 楼主 liulinisgood 的回复:我想问一下,服务器接收到客户端的连接对象后,将其保存起来(比如map保存)。下次服务器端接收到该客户端发过来消息,是如何知道是哪个客户端发过来的消息(不要说是通过map映射)。详细的说一下,假如一个客户端第一次和服务连接,服务器将其保存到map表中,下一次该客户端发消息过来,服务器此时如何知晓应该用哪个socket来接受。因为……
以前理解可能真的有问题,服务端起的socket线程是一直在运行,直到客户端下线为止,这样理解是没问题吧。有没有方式减少连接线程,还能保持长连接
liulinisgood 2012-12-06
  • 打赏
  • 举报
回复
引用 18 楼 ahuter9 的回复:
引用 11 楼 liulinisgood 的回复:引用 10 楼 ahuter9 的回复:嗯,是的,上面我所说的用map保存这个socket对象是针对长连接的。如果是一次请求完毕就断开连接,那么也就没有必要保存这个对象了,本次通讯的目的已经达到。我想你的意思应该是做什么类似的通讯系统,你可一在输入输出流上下功夫,每次的通讯流中携带这些验证的信息。 嗯,其实我也想知道长连……
3Q,我想你的意思是不是这样子的,客户端和服务器端只要连接(长连接)就开一个线程,然后将socket对象保存到map中,当然可以加很多状态在上面。以后就根据心跳包来决定是不是在线,下线情况。维护socket的通信,在此期间,服务端起的socket线程是一直在运行,直到客户端下线为止。
liulinisgood 2012-12-06
  • 打赏
  • 举报
回复
引用 19 楼 jia20003 的回复:
一个连接开一个线程就Okie 给每个线程一个线程ID,这个是唯一的,然后随便搞吧 这个例子演示你的问题http://blog.csdn.net/jia20003/article/details/8195226
例子看了,没有下线机制,应该是没有心跳包,把这个加上就更好了
gloomyfish 2012-12-05
  • 打赏
  • 举报
回复
一个连接开一个线程就Okie 给每个线程一个线程ID,这个是唯一的,然后随便搞吧 这个例子演示你的问题http://blog.csdn.net/jia20003/article/details/8195226
傲雪kimi 2012-12-05
  • 打赏
  • 举报
回复
引用 11 楼 liulinisgood 的回复:
引用 10 楼 ahuter9 的回复:嗯,是的,上面我所说的用map保存这个socket对象是针对长连接的。如果是一次请求完毕就断开连接,那么也就没有必要保存这个对象了,本次通讯的目的已经达到。我想你的意思应该是做什么类似的通讯系统,你可一在输入输出流上下功夫,每次的通讯流中携带这些验证的信息。 嗯,其实我也想知道长连接,保存对象是怎么进行的,因为发现每一次连接都开一……
其实每一次连接都开一个线程,连接断开后,线程占用资源也就释放了,这没有什么问题。 如果是客户端和服务器保持连接: 在客户端维护这个连接Socket,就是定义成员变量Socket,输入,输出流。将不同的操作封装到方法里,并且如果想实现输入输出流的不堵塞操作,就一般是将输入流另开一个线程,就可以实现异步的通讯。 在服务端,服务端是根据客户端参与请求连接后,创建线程,将socket连接作为参数传递给该线程,并且使用集合保存客户端来的连接(使用你自己定义的key保存这个socket对象,如用户名账户)。这里保存连接主要是服务端通过key来查找对应的socket:验证用户是否在线,下线,群发,转发等操作。这个线程用来处理和对应客户端的通讯。
  • 打赏
  • 举报
回复
引用 楼主 liulinisgood 的回复:
我想问一下,服务器接收到客户端的连接对象后,将其保存起来(比如map保存)。下次服务器端接收到该客户端发过来消息,是如何知道是哪个客户端发过来的消息(不要说是通过map映射)。详细的说一下,假如一个客户端第一次和服务连接,服务器将其保存到map表中,下一次该客户端发消息过来,服务器此时如何知晓应该用哪个socket来接受。因为在接受消息必须要先得到socket对象。 ……
这个问题根本不能这么理解。 实际上服务端不需要知道是哪个客户端发过来的信息。 因为,下此服务端接收到该客户端发过来信息时,如果客户端只有1个socket,那么这次使用的socket和保存在容器中的socket是同一个,使用接收信息的socket返回信息即可。 想想一个场景。 A 用电话1打电话给 B ; B很忙,同时接听多个电话。 A发信息(A说话)给B时,B只需要使用电话1回复即可. 如果A再次使用电话2给B时,B接收到消息后,直接使用电话2返回,根本就不需要去寻找电话1。
WE__Bug 2012-12-05
  • 打赏
  • 举报
回复
如果服务器连接的用户太多的话,(例如超过200个)我建议你用socketchannel,socket太浪费线程了,一个socket就要用掉一个线程,用socketchannel的话理论上一个线程可以搞定
linwz520 2012-12-05
  • 打赏
  • 举报
回复
既然你想保存住连接, 那估计是个长连接, 但是没必要放到容器里保存啊,如果是多个客户端连接,那服务器得是多线程去实现。 看你的代码已经是实现了多线程,那么每个连接在线程里去做逻辑处理就好了,没必要再放什么map啊 最好是完成数据传输后由客户端主动断开连接。
liulinisgood 2012-12-05
  • 打赏
  • 举报
回复
引用 9 楼 shiyonghu 的回复:
还是要通过多线程的方式来处理,这样会通过操作线程知道是哪个用户的信息。
线程太多可不好。来回切换太费资源了
liulinisgood 2012-12-05
  • 打赏
  • 举报
回复
引用 12 楼 AFer198215 的回复:
引用 11 楼 liulinisgood 的回复:嗯,其实我也想知道长连接,保存对象是怎么进行的,因为发现每一次连接都开一个线程可能不好。不知道您有没有部分代码可供参考。 线程池里的线程是重复利用的。
这我知道的,假如一千个用户同时在线,不释放线程,你线程池没有空闲的线程怎么办
想喝咖啡的貓 2012-12-05
  • 打赏
  • 举报
回复
引用 11 楼 liulinisgood 的回复:
嗯,其实我也想知道长连接,保存对象是怎么进行的,因为发现每一次连接都开一个线程可能不好。不知道您有没有部分代码可供参考。
线程池里的线程是重复利用的。
liulinisgood 2012-12-05
  • 打赏
  • 举报
回复
引用 10 楼 ahuter9 的回复:
嗯,是的,上面我所说的用map保存这个socket对象是针对长连接的。如果是一次请求完毕就断开连接,那么也就没有必要保存这个对象了,本次通讯的目的已经达到。我想你的意思应该是做什么类似的通讯系统,你可一在输入输出流上下功夫,每次的通讯流中携带这些验证的信息。
嗯,其实我也想知道长连接,保存对象是怎么进行的,因为发现每一次连接都开一个线程可能不好。不知道您有没有部分代码可供参考。
傲雪kimi 2012-12-05
  • 打赏
  • 举报
回复
嗯,是的,上面我所说的用map保存这个socket对象是针对长连接的。如果是一次请求完毕就断开连接,那么也就没有必要保存这个对象了,本次通讯的目的已经达到。我想你的意思应该是做什么类似的通讯系统,你可一在输入输出流上下功夫,每次的通讯流中携带这些验证的信息。
shiyonghu 2012-12-05
  • 打赏
  • 举报
回复
还是要通过多线程的方式来处理,这样会通过操作线程知道是哪个用户的信息。
liulinisgood 2012-12-05
  • 打赏
  • 举报
回复
引用 3 楼 ahuter9 的回复:
服务端和客户端是通过socket连接的,程序内部是可以识别不同socket连接的,你可以通过这个socket来进行和不同客户端的操作。但是,这些对象是如何才能在代码中使用呢,那就是需要给不同的客户端添加key,也就可以将不同的socket对象,通过key放入到map中,获取则个scoket对象既可以操作不同的连接。
第一次连接时候服务器端的确可以将对象保存起来,但是到下次客户端发信息过来,没得到该对象之前是如何获取信息的,我觉得必须先要得到该信息才能获得key值。
liulinisgood 2012-12-05
  • 打赏
  • 举报
回复
引用 3 楼 ahuter9 的回复:
服务端和客户端是通过socket连接的,程序内部是可以识别不同socket连接的,你可以通过这个socket来进行和不同客户端的操作。但是,这些对象是如何才能在代码中使用呢,那就是需要给不同的客户端添加key,也就可以将不同的socket对象,通过key放入到map中,获取则个scoket对象既可以操作不同的连接。
关键问题就在这边,服务器肯定要用相应的socket对象才能接收到信息吧,这个时候客户端不会再去重新连接服务器。服务端是如何获取客户端的信息的
liulinisgood 2012-12-05
  • 打赏
  • 举报
回复
引用 2 楼 lost_guy_in_scut 的回复:
Map map(String key, Connection value); //new connection if(map.get(key)!=null){ map.put(key,new Connection()) } Connection conn = map.get(key);
我问一下,这边我不是很懂 服务器端代码大致如此

private ServerSocket server = null;
	private ExecutorService mExecutorService = Executors.newCachedThreadPool();// 创建一个线程池
    try {

			server = new ServerSocket(PORT);
		    
			System.out.println("Server Start...");
			
			while (true) {
				Socket client = server.accept();
				mExecutorService.execute(new ServerThread(client));
				System.out.println("执行一个客户端线程");
			}
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}

客户端大致连接代码

isa=new InetSocketAddress(HOST,PORT);
	   socket = new Socket();
	   socket.connect(isa, 4000);//四秒如果不能连接到服务器抛出异常
这个时候服务器如何做
d767044543 2012-12-04
  • 打赏
  • 举报
回复
给不同的客户端添加key,通过key放入到map中
张某码 2012-12-04
  • 打赏
  • 举报
回复
我在想你在每次发送数据的时候,可以把该socket对应的KEY传过来 服务器收到后去解析发来的数据然后通过KEY找到SOCKET、、这样应该能行。
傲雪kimi 2012-12-04
  • 打赏
  • 举报
回复
服务端和客户端是通过socket连接的,程序内部是可以识别不同socket连接的,你可以通过这个socket来进行和不同客户端的操作。但是,这些对象是如何才能在代码中使用呢,那就是需要给不同的客户端添加key,也就可以将不同的socket对象,通过key放入到map中,获取则个scoket对象既可以操作不同的连接。
加载更多回复(2)

62,612

社区成员

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

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