我初学java,最近看韩顺平的网络编程,有个问题,客户端的socket用static修饰,做成静态的,也就是不管有多少客户端登录,都共享一个socket,服务器端把每个与客户端建立的连接保存在hashmap中,转发的时候再找到对应的socket,但是客户端共享一个socket,在接收服务器发来的消息时是怎么区分的呢? 

解决方案 »

  1.   

    虽然没怎么用过socket,但是客户端socket用static是为了让这个客户端的socket使用同一个,但是一个server可以接多个client,socket要做到唯一标识client,所以需要区分开,区分的方法多的是。。
      

  2.   

    客户端收到的响应是由它的请求决定的,不需要区分。客户端发请求1,收到对应的响应1;同时客户端发请求2,收到对应的响应2。你可以理解成:
    请求里是有个序号的,请求1的序号是1;请求2的序号是2;
    对应的响应里也有序号,响应1和响应2,那么自然响应1对应请求1,响应2对应请求2。
    response = send(request);你的request1一定是得到response1。这是有网络的底层决定,不需要你关心。
      

  3.   

    服务端可以获取到客户端的socket  通过客户端的流进行传输  每个都是不一样的 所以没有问题!!!
      

  4.   

    我还是有点不理解,所有的客户端在接收服务器传来的信息时,都经过共享的那个static socket,从这个socket的输出流出来的信息,怎么传到对应的客户端上?
      

  5.   

    虽然没怎么用过socket,但是客户端socket用static是为了让这个客户端的socket使用同一个,但是一个server可以接多个client,socket要做到唯一标识client,所以需要区分开,区分的方法多的是。。请问static socket只有一个共享连接通道,怎么能做到唯一标识client?能否详细解释一下?
      

  6.   

    我能想到的就是每个client过来server起一个线程单独跑,期待java通信方面经验丰富的大咖作答。
      

  7.   

    用多线程。。每个用户连接时建个SOCKET。。一对一。。不知道有上万用户会不会卡死机呢哈哈,,,,
    用单线程肯定是不行的非阻式的SOCKET 好像可以单线程。。不知道效果好不好。。
    每个用户进来时都会在哈希表或者数据库里保存用户名+对应的SOCKET对象,,别的用户要发送XX给他。先发服务器。。服务器里找哈希表对应数据。用对应用户SOCKET重置输出流发过去就行了。。对方下线就关闭那个SOCKET。。上线又重建一个SOCKET写进哈希表。。每个用户一一对应的。。
    我也刚学的。。哈哈。。第一次用JAVA写QQ类似的聊天软件。。
    现在遇到一个问题。。求高人指点。。
    就是每个好友都会新建一个聊天窗口。。服务端转发不同用户的信自己给某个客户端。。怎么把不同好友信息分发给对应的好友聊天窗口。。我接收过来。。所有好友窗口都显示相同的内容。。晕死。。一天了。。没找到方法解决。。 发过来的数据带有用户名和聊天内容。。是可以区分开的。。唯一的问题就是怎么让对应的好友窗口显示出来窗口之间用户名不同。。
    我思考了下。。SOCKET 可以传送对象的如果我服务器里的哈希表对应的用户+SOCKET传送给客户端,,,让他们点对点进行。。这样服务器减负了。。对应好友窗口一对一聊天也行了。。
    就是不知道怎么写成代码是否可行?
    大神们。。指点一二吧