我想问一下,服务器接收到客户端的连接对象后,将其保存起来(比如map保存)。下次服务器端接收到该客户端发过来消息,是如何知道是哪个客户端发过来的消息(不要说是通过map映射)。详细的说一下,假如一个客户端第一次和服务连接,服务器将其保存到map表中,下一次该客户端发消息过来,服务器此时如何知晓应该用哪个socket来接受。因为在接受消息必须要先得到socket对象。

解决方案 »

  1.   

    你的map的key值保存客户userID啊
      

  2.   

    Map map(String key, Connection value);
    //new connection 
    if(map.get(key)!=null){
        map.put(key,new Connection())
    }
    Connection conn = map.get(key);
      

  3.   

    服务端和客户端是通过socket连接的,程序内部是可以识别不同socket连接的,你可以通过这个socket来进行和不同客户端的操作。但是,这些对象是如何才能在代码中使用呢,那就是需要给不同的客户端添加key,也就可以将不同的socket对象,通过key放入到map中,获取则个scoket对象既可以操作不同的连接。
      

  4.   

    我在想你在每次发送数据的时候,可以把该socket对应的KEY传过来 服务器收到后去解析发来的数据然后通过KEY找到SOCKET、、这样应该能行。
      

  5.   

    给不同的客户端添加key,通过key放入到map中
      

  6.   

    我问一下,这边我不是很懂
    服务器端代码大致如此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);//四秒如果不能连接到服务器抛出异常这个时候服务器如何做
      

  7.   

    关键问题就在这边,服务器肯定要用相应的socket对象才能接收到信息吧,这个时候客户端不会再去重新连接服务器。服务端是如何获取客户端的信息的
      

  8.   

    第一次连接时候服务器端的确可以将对象保存起来,但是到下次客户端发信息过来,没得到该对象之前是如何获取信息的,我觉得必须先要得到该信息才能获得key值。
      

  9.   

    嗯,是的,上面我所说的用map保存这个socket对象是针对长连接的。如果是一次请求完毕就断开连接,那么也就没有必要保存这个对象了,本次通讯的目的已经达到。我想你的意思应该是做什么类似的通讯系统,你可一在输入输出流上下功夫,每次的通讯流中携带这些验证的信息。
      

  10.   

    既然你想保存住连接, 那估计是个长连接,
    但是没必要放到容器里保存啊,如果是多个客户端连接,那服务器得是多线程去实现。
    看你的代码已经是实现了多线程,那么每个连接在线程里去做逻辑处理就好了,没必要再放什么map啊
    最好是完成数据传输后由客户端主动断开连接。
      

  11.   

    如果服务器连接的用户太多的话,(例如超过200个)我建议你用socketchannel,socket太浪费线程了,一个socket就要用掉一个线程,用socketchannel的话理论上一个线程可以搞定
      

  12.   

    其实每一次连接都开一个线程,连接断开后,线程占用资源也就释放了,这没有什么问题。
    如果是客户端和服务器保持连接:
    在客户端维护这个连接Socket,就是定义成员变量Socket,输入,输出流。将不同的操作封装到方法里,并且如果想实现输入输出流的不堵塞操作,就一般是将输入流另开一个线程,就可以实现异步的通讯。
    在服务端,服务端是根据客户端参与请求连接后,创建线程,将socket连接作为参数传递给该线程,并且使用集合保存客户端来的连接(使用你自己定义的key保存这个socket对象,如用户名账户)。这里保存连接主要是服务端通过key来查找对应的socket:验证用户是否在线,下线,群发,转发等操作。这个线程用来处理和对应客户端的通讯。
      

  13.   

    一个连接开一个线程就Okie
    给每个线程一个线程ID,这个是唯一的,然后随便搞吧
    这个例子演示你的问题http://blog.csdn.net/jia20003/article/details/8195226
      

  14.   

    3Q,我想你的意思是不是这样子的,客户端和服务器端只要连接(长连接)就开一个线程,然后将socket对象保存到map中,当然可以加很多状态在上面。以后就根据心跳包来决定是不是在线,下线情况。维护socket的通信,在此期间,服务端起的socket线程是一直在运行,直到客户端下线为止。
      

  15.   

    以前理解可能真的有问题,服务端起的socket线程是一直在运行,直到客户端下线为止,这样理解是没问题吧。有没有方式减少连接线程,还能保持长连接