一个私聊的问题,不同的客户端与服务端建立连接,假设客户端a,客户端b,分别与服务器c连接,这样建立了两个socket,我若想让客户端a给客户端b发数据,a与c建立连接后,我如何确定b与c建立的连接,因为a要把数据传给b,得不到c与b的socket连接,就无法传送数据,但服务器端是用accept方法,不停地等待连接,如何区分?望大家多提想法。
还有就是私聊的具体实现方法我也不太了解,望大家多多帮助。

解决方案 »

  1.   

    很简单啦,这个问题既然采用C/S架构解,就要发挥Server的作用。A->C->B,通过ServerC把A发送过来的数据转发给Client B。每个Client连接Server的时候就可以获取所有连接到Server的Client,然后通过Server把数据转发到特定的Client。
      

  2.   


       服务器首先持有所有客户端的socket。比如放置在Map中。并且每个sockect有自己的编号。
        当A要和B通信的时候,A首先选择B,然后发送消息,服务器接受到A的消息的时候,先检查指定的前缀,如果是只指定了B的Id,那么从map中取出对应b的socket然后将消息传送给B。
        如果是群聊的还,服务器接收到消息后,直接遍历map中所有的元素,都write就行了。
      

  3.   

    但是如果客户端既要聊天,又要传输文件,又要音频聊天等等(假设)。它是否要与服务器建立多个socket,假如是的话,这一堆socket都与一个客户端对应,而一个客户端只有一个key来标识,那要怎样从这一堆socket中,选出需要的那个?这一堆socket应该怎样区分?
      

  4.   

    只要有一个通路,既socket。你就有了一条与client联通的路,传什么都可以。
      

  5.   

    b接收a传过来是数据,是服务器间隔送数据到客户端 还是客户端间隔到服务器取数据?另:如果像CSDN这样的,如果有短消息来了,私信后面会有数字显示信息条数
    这时候是只有等我们手动刷新后才能显示还是客户端接收到了消息后自动刷新页面显示?
      

  6.   

    Server维护所有client的socket信息,这个是必需的。私聊分为Server中转式和非中转式。
    1、中转式:
       相当于client1 -> server -> client2 相信这两段的东西你都有了,你要做的就是修改协议,增加收件人的内容,同时,server端可以维护每个client端的私信,已完成更多附加功能。
    2、非中转式(p2p)
       相当于client1 -> client2 主动发起会话方从server端获取到client2的socket信息后,使用udp协议发送信息即可。这样server端没有负载压力,可以引入好友的概念,将好友的socket信息放到client端,这样更好。
      

  7.   

    如果客户端要同时传送两个文件,只建立一个socket可以吗,那客户端往socket写入的时候,那这两个文件中的内容不就混在一起了吗?