单独使用tcp/ip,或udp协议写的程序都可以实现网络的一对一聊天。可是我想实现与qq相类的可以有多个好友有选择的聊天。
可是服务器端怎么处理接收到客户端发送的消息?因为客户端发送的消息有登陆消息与好友聊天消息。
及服务器端怎么处理发送到客户端的消息?因为客户端只有好友列表怎么样根据消息信息传给对应的好友对话框中?弄了好久也没有想出好的处理方法!
请大家帮帮忙。谢谢。

解决方案 »

  1.   

    如果是tcp的方式,那么你需要在每个终端建立一个tcp的服务端,在通信的时候通过创建客户端与指定的服务端通信,通信结束后关闭客户端
    如果是udp也是类似的原理
      

  2.   

    在客户端和服务器间的通信应该定义成一种协议。比如,每次通信的消息包括两部分消息头和消息体。消息头就是这个消息的类型(可以标识用户列表、单发、组发、群发或者就是客户端发送的信息),消息体就是内容。有了这种协议你完全可以实现单发、组发和群发等功能,只要将这些信息存入消息头中即可。如果采用协议的方式的话,我觉得用对象流会更方便,可以直接将消息的类型声明为类,得到消息后就可以用instanceof非常方便。还有,服务器端应该维护一个所有在线用户的集合,到有用户上线更新该集合,然后向所有客户端发送用户列表,同时客户端更新显示这个集合。可以定义Protocol类来实现协议,包括属性String header和Object body。并改用对象流。 
    对于实现单发的协议可以让它继承Protocol,并添加属性String receive表示接受人。
    客户端可以发送new Protocol("userName", "用户名")
    new SingleProtocal("Message","内容","接受人")
    new Protocol("Message", "内容")
    具体过程:               
    服务器端可发送new Protocol("userList", "用户名")和new Protocol( "Message", "内容 ")。 客户端:     //一登录就向服务器发送new   Protocol( "userName ", "用户名 ") 
        while(join){ 
            //读取服务器端发来的消息
            Protocal p=(Protocal)dis.readObject(); 
            if(p的消息头是message) 
                显示消息 
            else if(p的消息头是userList){ 
                根据p的消息体,更改List 
            } 
        }             服务器端: while(running){   
        //读取客户端发来的协议 
        Protocal p=(Protocal)dis.readObject(); 
        if(p的消息头是message){
            if(p instanceof SingleProtocal){//这个事单发消息
                向指定的用户发送消息
            }else{
                遍历所有客户端,向它们发送new Protocol("Message ", "内容 ")
            }
        } 
        else if(p.getHeader().equals( "userName ")){ 
            将p的消息体中的内容加入用户列表list中 
            遍历所有客户端,向它们发送new   Protocol( "userList ", "用户名 ") 
        } 

      
                    
      

  3.   

    Java多线程,Socket,Object Input/Output Stream
      

  4.   

    我现在最想知道的问题解决方法是:比如收到A好友的消息,客户端好友列表中包括A,那怎么让A对话框激活。而不是简单的两个的窗口对话。客户端,服务器,好友列表,它们的关系应该怎么处理?
    我现在的想法是纯用tcp/ip对话,客户端登陆时给服务器发送消息,消息包含客户端用户信息,这样客户端与服务器都记录了用户ID号。当主动与好友聊天时创建的对话框消息也是发送到服务器,消息内容包括自己ID,对方ID,服务器读取对方ID,把这个消息发送到这个ID客户端,客户端从消息中读取消息发送方ID然后在好友列表中找到这个ID,并创建这个ID对话框....服务器用多线程,为每个客户端创建一个线程,我说的想法就是每个线程中进行的.
      

  5.   

    Client/Server, 好像是说C向S发送信息,然后每发送一次就可能会得到一个反馈。A的好友有B,A向B发送一条消息,如果我理解的没错,你想让Server在接受到A的消息之后,让B的客户端有所反应....那么,在客户端里面写一个循环接受Server消息的方法不就好了。如果能让B接受到有新消息的标记,那么做什么操作不就容易了。
      

  6.   

    你的想法和我相同 ,可是在实现时发现,客户端与服务器既要接收消息也要发送消息,而这个是有顺序的即接收(发送)到消息后才可以发送(接收),如果没有接收(发送)到消息,那么这个read(write)就会屏蔽了后面的write(read)。理想的作法是双方你一句我一句的聊天,可是这是不实现的....
    对这个问题你有什么好的解决方法吗?不会线程中套线程吧?
      

  7.   

    socket TCP  OK了` 自己研究吧 很简单
      

  8.   

    我自己写过这样的东西,服务器里面记录的是一张表。表里面记录的是每个用户对应的ip 端口 帐号 名称当你给A发消息的时候,你点击发送后,程序会先发送一个消息给服务器,发送的是一个查询,查询名称A的ip和端口,当服务器返回回来后,你再通过返回回来的信息通过UDP去连接和发送信息。当一个用户上/下线的时候就给服务器发送一个数据,告诉服务器你下线了,从而达到删除表中的信息。
    本人自己写的是这样的我是菜鸟
      

  9.   

    不可以一个客户端开两个线程的,因为一个客户端在服务器端申请了一个ID,如果客户端开两个线程就相当两个相同的ID与服务器tcp/ip可是tcp/ip是一对一的。不可以一对二。!!!你有没有理解错你的想法?
      

  10.   


    额。。这个ID和TCP/IP有什么冲突吗?
    实际代码里,接收使用客户端的Socket,发送使用服务端的Socket 就是这么用的啊
    我这里说的接收就单纯的指客户端收服务端送来的消息,发送指客户端向服务端发送消息
    一个读,一个写 就这么简单
      

  11.   

    发送的消息格式可以是:发送人 接收人 消息内容这样客户端在接收到信息之后可以创建一个聊天对话框。然后为了标识这个聊天对话框是跟这个联系人B聊天的对话框。可以用一个hashtable来保存 聊天对象的id和对话框的引用 呵呵~
      

  12.   


    感觉用户聊天的话,这个线程不需要一直开着,觉得在服务器端有个线程池,当有需要转发消息的时候,分配一个线程,在转发完消息之后,就放回到线程池中。
    有个方法是:
    首先,用户登录的时候,可以记录下来用户的IP和端口,在转发消息的时候,消息的内容是 “发送人&接收人& 消息体” 服务器端根据接收人的id 找到接收人的ip,然后进行转发消息。但感觉这个方法不太好,因为如果只记录ip的话,只能在局域网中使用,因为路由器之类的能扩充ip的数量。