socket对象保存与获取 我想问一下,服务器接收到客户端的连接对象后,将其保存起来(比如map保存)。下次服务器端接收到该客户端发过来消息,是如何知道是哪个客户端发过来的消息(不要说是通过map映射)。详细的说一下,假如一个客户端第一次和服务连接,服务器将其保存到map表中,下一次该客户端发消息过来,服务器此时如何知晓应该用哪个socket来接受。因为在接受消息必须要先得到socket对象。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你的map的key值保存客户userID啊 Map map(String key, Connection value);//new connection if(map.get(key)!=null){ map.put(key,new Connection())}Connection conn = map.get(key); 服务端和客户端是通过socket连接的,程序内部是可以识别不同socket连接的,你可以通过这个socket来进行和不同客户端的操作。但是,这些对象是如何才能在代码中使用呢,那就是需要给不同的客户端添加key,也就可以将不同的socket对象,通过key放入到map中,获取则个scoket对象既可以操作不同的连接。 我在想你在每次发送数据的时候,可以把该socket对应的KEY传过来 服务器收到后去解析发来的数据然后通过KEY找到SOCKET、、这样应该能行。 给不同的客户端添加key,通过key放入到map中 我问一下,这边我不是很懂服务器端代码大致如此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);//四秒如果不能连接到服务器抛出异常这个时候服务器如何做 关键问题就在这边,服务器肯定要用相应的socket对象才能接收到信息吧,这个时候客户端不会再去重新连接服务器。服务端是如何获取客户端的信息的 第一次连接时候服务器端的确可以将对象保存起来,但是到下次客户端发信息过来,没得到该对象之前是如何获取信息的,我觉得必须先要得到该信息才能获得key值。 嗯,是的,上面我所说的用map保存这个socket对象是针对长连接的。如果是一次请求完毕就断开连接,那么也就没有必要保存这个对象了,本次通讯的目的已经达到。我想你的意思应该是做什么类似的通讯系统,你可一在输入输出流上下功夫,每次的通讯流中携带这些验证的信息。 既然你想保存住连接, 那估计是个长连接,但是没必要放到容器里保存啊,如果是多个客户端连接,那服务器得是多线程去实现。看你的代码已经是实现了多线程,那么每个连接在线程里去做逻辑处理就好了,没必要再放什么map啊最好是完成数据传输后由客户端主动断开连接。 如果服务器连接的用户太多的话,(例如超过200个)我建议你用socketchannel,socket太浪费线程了,一个socket就要用掉一个线程,用socketchannel的话理论上一个线程可以搞定 其实每一次连接都开一个线程,连接断开后,线程占用资源也就释放了,这没有什么问题。如果是客户端和服务器保持连接:在客户端维护这个连接Socket,就是定义成员变量Socket,输入,输出流。将不同的操作封装到方法里,并且如果想实现输入输出流的不堵塞操作,就一般是将输入流另开一个线程,就可以实现异步的通讯。在服务端,服务端是根据客户端参与请求连接后,创建线程,将socket连接作为参数传递给该线程,并且使用集合保存客户端来的连接(使用你自己定义的key保存这个socket对象,如用户名账户)。这里保存连接主要是服务端通过key来查找对应的socket:验证用户是否在线,下线,群发,转发等操作。这个线程用来处理和对应客户端的通讯。 一个连接开一个线程就Okie给每个线程一个线程ID,这个是唯一的,然后随便搞吧这个例子演示你的问题http://blog.csdn.net/jia20003/article/details/8195226 3Q,我想你的意思是不是这样子的,客户端和服务器端只要连接(长连接)就开一个线程,然后将socket对象保存到map中,当然可以加很多状态在上面。以后就根据心跳包来决定是不是在线,下线情况。维护socket的通信,在此期间,服务端起的socket线程是一直在运行,直到客户端下线为止。 以前理解可能真的有问题,服务端起的socket线程是一直在运行,直到客户端下线为止,这样理解是没问题吧。有没有方式减少连接线程,还能保持长连接 网络IO流的练习程序 怎么变相的继承String类呢?【详情见贴内】 压力测试的时候出现java.lang.OutOfMemoryError TfIdf算法实现 in java 最近遇到一个加密的问题,admin加密后1zZNP<H^@fGFv/R*.1;?ozWmS\$$HG1&.-kTx+ 驱动包下载? Java可以应用在哪些开发中? Websphere、Weblogic,JBoss 那一种平台入门最快? 环境变量 java编程思想中的例题,有些不懂 java图片路径问题 高手帮我来看看! protected 修饰符!
//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);//四秒如果不能连接到服务器抛出异常这个时候服务器如何做
但是没必要放到容器里保存啊,如果是多个客户端连接,那服务器得是多线程去实现。
看你的代码已经是实现了多线程,那么每个连接在线程里去做逻辑处理就好了,没必要再放什么map啊
最好是完成数据传输后由客户端主动断开连接。
如果是客户端和服务器保持连接:
在客户端维护这个连接Socket,就是定义成员变量Socket,输入,输出流。将不同的操作封装到方法里,并且如果想实现输入输出流的不堵塞操作,就一般是将输入流另开一个线程,就可以实现异步的通讯。
在服务端,服务端是根据客户端参与请求连接后,创建线程,将socket连接作为参数传递给该线程,并且使用集合保存客户端来的连接(使用你自己定义的key保存这个socket对象,如用户名账户)。这里保存连接主要是服务端通过key来查找对应的socket:验证用户是否在线,下线,群发,转发等操作。这个线程用来处理和对应客户端的通讯。
给每个线程一个线程ID,这个是唯一的,然后随便搞吧
这个例子演示你的问题http://blog.csdn.net/jia20003/article/details/8195226