日期:2014-05-20  浏览次数:20747 次

socket对象保存与获取
我想问一下,服务器接收到客户端的连接对象后,将其保存起来(比如map保存)。下次服务器端接收到该客户端发过来消息,是如何知道是哪个客户端发过来的消息(不要说是通过map映射)。详细的说一下,假如一个客户端第一次和服务连接,服务器将其保存到map表中,下一次该客户端发消息过来,服务器此时如何知晓应该用哪个socket来接受。因为在接受消息必须要先得到socket对象。
------最佳解决方案--------------------
服务端和客户端是通过socket连接的,程序内部是可以识别不同socket连接的,你可以通过这个socket来进行和不同客户端的操作。但是,这些对象是如何才能在代码中使用呢,那就是需要给不同的客户端添加key,也就可以将不同的socket对象,通过key放入到map中,获取则个scoket对象既可以操作不同的连接。
------其他解决方案--------------------
我在想你在每次发送数据的时候,可以把该socket对应的KEY传过来 服务器收到后去解析发来的数据然后通过KEY找到SOCKET、、这样应该能行。
------其他解决方案--------------------
引用:
嗯,其实我也想知道长连接,保存对象是怎么进行的,因为发现每一次连接都开一个线程可能不好。不知道您有没有部分代码可供参考。

线程池里的线程是重复利用的。
------其他解决方案--------------------
既然你想保存住连接, 那估计是个长连接,
但是没必要放到容器里保存啊,如果是多个客户端连接,那服务器得是多线程去实现。
看你的代码已经是实现了多线程,那么每个连接在线程里去做逻辑处理就好了,没必要再放什么map啊
最好是完成数据传输后由客户端主动断开连接。
------其他解决方案--------------------
如果服务器连接的用户太多的话,(例如超过200个)我建议你用socketchannel,socket太浪费线程了,一个socket就要用掉一个线程,用socketchannel的话理论上一个线程可以搞定

------其他解决方案--------------------
引用:
我想问一下,服务器接收到客户端的连接对象后,将其保存起来(比如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。
------其他解决方案--------------------
你的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);
------其他解决方案--------------------
给不同的客户端添加key,通过key放入到map中
------其他解决方案--------------------
引用:
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);