正在做软件开发实习的小软件现在已经实现的功能:1、多个客户端连接到服务器端;
2、多个客户端的信息通信
3、服务器端显示任意一个连接的客户端发送的信息遇到一个问题:多个客户端连接到服务器端,把连接的客户端(自定义类Client)存到一个类型为arraylist的容器里,然后显示到一个List(java.awt)里现在想在服务器端向任意一个连接的客户端发送信息具体想法是:鼠标单击任意一个List里的客户端连接的IP,然后在服务器端的一个文本框里输入数据点击一个Button,把信息发送到选定的客户端idea:写一个单独的线程,专门用来服务器端向客户器端发送信息,点击button的时候触发这个线程实现这个功能自己遇到的难题是:服务器端如何向一个特定的客户端发送信息???(我知道怎么向多个客户端发送)

解决方案 »

  1.   

    如果这样的话,每个Client都要有一个ServerSocket来监听服务器发过来的消息。
    我以前用的是Corba,采用回调技术特别简单。
      

  2.   

    如果这样的话,每个Client都要有一个ServerSocket来监听服务器发过来的消息。 
    我以前用的是Corba,采用回调技术特别简单。你是说在client端还要定义一个serversocket,那具体怎么用呢?在server端,已经有一个Socket和一个ServerSocket难道在client端:ServerSocket ss = new ServerSocket();
    ss.accept();
    然后接收server端发来的数据???
      

  3.   

    LZ , 有几个问题需要澄清:
        1、客户端之间通信,是客户端A 直接 向客户端B发送信息   
                            还是客户端A 先发送到 服务器端 ,再由服务器端 发送到客户端B  ?
        2、客户端之间的通信,采用TCP 方式 还是UDP方式?
       
      

  4.   

    楼上的你没明白楼主的意思,他的意思是只由服务器到任意一个客户端。这里的关键是客户端如何监听服务器发送过来的数据,从这一点上来说,服务器其实充当的是Client 的角色。谁是服务器,谁是Client,标准是“谁在调用谁,谁在为谁服务”
      

  5.   

    这里“连接”,是谁与谁连接?1、如果是 服务器端与客户端直接连接,直接发送消息即可,没有任何问题。
           但是客户端之间怎么通信?
    2、如果是 客户端与客户端直接连接,发送消息也没问题,(此时服务器端只是记录 那两个客户端是连接的)
           但是服务器端怎么获得 客户端通信的内容?请 LZ 说明一下??另:yekai012,请读完内容再回复,随便打比方解决不了问题!
      

  6.   

    我们中间有一个人肯定没有明白楼主的意思,楼主的Server是基于ServerSocket的,假设C已经注册到S了,此时S已经知道了C的IP了。
    在Socket关闭的情况下,S向C主动发起请求,C必须要在特定端口进行监听。从这个角度上来说,S变为C,C变为S。
      

  7.   

    我之前用过的方法是:在消息前面加上控制去向的信息,如@to:XXX,@to:XXX…… + 消息。这种模式下,无论是群发还是定向发,服务器都会把信息发给所有的客户端,但客户端收到消息之后需先解析控制信息,若控制信息有“我的名字(打个比方)”,才真正接收,否则丢弃。这么做的好处不光是实现了发给所有人或只发给一个人的功能,您还可以发给随意个的人因为您只需要在控制信息里面将您要发送的对像添加进去就行了但是这样做的话,您得在服务器端设计一个添加控制信息的函数,并在客户端设计一个解析控制信息的函数了……呵呵
      

  8.   


    答:1、客户端A 先发送到 服务器端 ,再由服务器端 发送到客户端B 
        2、客户端之间的通信,采用TCP 方式客户端之间的通信我已经实现了,现在是这样:假设客户端A和B已经连上了服务器端C,我想在C的文本框里输入数据,然后选择A、B中的一个客户端把信息发出去
      

  9.   

    依据 14楼,回复 LZ:若是这种通信模式:  客户端A  《=== TCP ===》   服务器端C  《=== TCP ===》   客户端B在 服务器端C 是可以向任何一个 客户端 发送数据的,
    因为服务器端C 知道 客户端的 IP和端口,(如果不知道,怎么转发呢?)没有什么问题啊!
    不知道 LZ 在 服务器端C 是怎么转发的?可能我的理解不到位,请LZ赐教!
      

  10.   

    ServerSocket ss = new ServerSocket();
    Socket s = ss.accept();
    OutputStream os = s.getOutputStream();
    然后用os.write()
    ...
    话说CSDN的回复如果能加图片就好了...我这有个图,看了一目了然
      

  11.   


    可以把图片发到我的邮箱吗?
    感激不尽!
    [email protected]
      

  12.   

    要求每个用户上线之前设定唯一个id我最近也写了一个类似的东西,已经写好了发到你邮箱去吧 互相学习 不取笑我的写的很烂就好 ps:的确很烂感觉这样的网络通讯的东西 细节太复杂
      

  13.   

    -----------------------------------------------
    你采用的是长连接方式,当客户端比较多的时候,对服务器的压力挺大,对网络的稳定性要求较高,而且Client要定时检查连接,以便进行连接恢复。
    长连接适用在频繁发送数据,而且客户端较少的情况下。
      

  14.   

    我写了一个多线程的方法
    具体如下:1 在服务器端写一个内部类
    class ToClient implements Runnable {
     
        private Socket s;
    private DataOutputStream dos = null;
    private boolean start = false;

    public ToClient(Socket s) {
    this.s = s;
    try {
    dos = new DataOutputStream(s.getOutputStream());
    start = true;
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

    public void send(String str){
    try {
    dos.writeUTF(str);
    } catch (SocketException e){
        clients.remove(this);
        jTextArea1.append("a client remove!\n");
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

    public void run() {

    while(start) {
    String str = jTextArea2.getText();
    for(int i=0;i<clients.size();i++){
    Client c = clients.get(i);
    c.send(str);
    }

    try {
    if(dos!=null)dos.close();
    if(s != null) s.close();
    } catch (IOException e1) {
    e1.printStackTrace();
    }
    }
    }2、点击服务器端发送按钮后启动这个线程
    ToClient tc = new ToClient(s);
    new Thread(tc).start();3、在客户端也有一个接受信息的线程类,在界面初始化的时候就启动
    class RecvThread implements Runnable{ public void run() {
    try {
    while(connect){
    dis = new DataInputStream(s.getInputStream());
    String str = dis.readUTF();
    jTextArea2.append(str+"\n");
    }
    }catch(SocketException e){
    jTextArea2.append("退出\n");
    }catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    现在的问题是:
    客户端之间的通信是没有问题的,即所有连接的客户端发送的信息都可以在服务器端显示,也可以由服务器端转发(转发用的不是上面的那个线程)到所有连接的客户端那里但是如果在服务器端的文本框里写上内容,点击发送,客户端就一直不停的接受信息
    就是我输入一个“1”
    客户端会不停的打印“1”这是什么原因啊???刚学线程和Socket一周时间,菜鸟级水平,忘指点,谢谢!
      

  15.   

    问题解决了,问的老师
    其实连接到服务器端的客户端都保存在一个ArrayList里了
    用的时候,直接根据ip和端口取出就行,没有必要在新建一个socket了当然要写一个客户端类,每连接一个客户端就实例化一个客户类,然后保存