我觉得楼主的程序设计是不是有问题。首先建立连接以后,会有一个Socket对象,你应该在第一次使用Socket连接的同时,把用户编号发过来,暂时用A,B标识,之后你应该保存一个2维的结构,最好是HashMap这种的,编号做Key,Socket做Value,这样你通过解析发送消息的目标,比如,A发给B,发送编号是A,接受者编号是B,你解析内容后,从Map里取B对应的socket对象,然后给B发。这样的顺序才对。你是不是搞混了,变成群发消息了?

解决方案 »

  1.   

    [/code]由于源代码分好几个文件我就不全发了,只发相关部分。
    开启端口:
    while(true)
    {
      ServerSocket server_socket=new ServerSocket(i1); //i1是端口号
      server threadServer=new server(server_socket.accept());
      threadServer.start();
    }
    server类:
    import java.io.*;
    import java.net.*; 
    public class server extends Thread
    {
    int chatcreat;
        private Socket myClient;
        public server(Socket c)
        {
            this.myClient=c;
            chatcreat=0;
        }    public void run()
        {
            try
            { 
                BufferedReader in=new BufferedReader(new InputStreamReader(myClient.getInputStream()));
                PrintWriter out=new PrintWriter(myClient.getOutputStream());
                System.out.println("Wait for client to send string...");
                //System.out.println("chatcreat="+chatcreat);
                String name=in.readLine();
                if((!name.equals(""))&&chatcreat==0)    
                {
                 chatcreat++;
                 new chatinter(name,myClient).start();   //在客户端发给服务器的第一条消息前先把客户端自定义的昵称发到服务器上。chatinter是对话界面
                }
            }
            catch(IOException ex){}
            finally{}
        }
    }界面中显示消息的部分:
    try
    {
    BufferedReader in=new BufferedReader(new InputStreamReader(myClient.getInputStream()));
    out=new PrintWriter(myClient.getOutputStream());
    while(true)
    {
    String str=in.readLine();
    a1.append(tit+":"+str+"\n");//a1是JTextArea,tit是前面传过来的客户端的昵称
    }
    }
    catch (Exception e1)
    {
    System.out.println(e1);
    }
      

  2.   

    哪个Socket input,处理后再同一Socket ouput 发出去 ServerSocket server_socket=new ServerSocket(i1);    //i1是端口号       while(true)
    {
      //放在此处会创建多个ServerSocket 
      server threadServer=new server(server_socket.accept());
      threadServer.start();       
    }
    没道理串的
      

  3.   


    补充一下新发现的。第2个人连接以后第1个人的界面就失效了,不能发消息,按钮按了不会响应,消息也不会更新。我给第1个人发的消息也会显示到第2个人的界面里。原因是:你之前的代码每次均会创建一个新的ServerSocket对象,因此也就只有最新接入的Socket 有效
      

  4.   

    楼上正解,只要把while truee里第一句话移到while外面就好了
      

  5.   


    补充一下新发现的。第2个人连接以后第1个人的界面就失效了,不能发消息,按钮按了不会响应,消息也不会更新。我给第1个人发的消息也会显示到第2个人的界面里。原因是:你之前的代码每次均会创建一个新的ServerSocket对象,因此也就只有最新接入的Socket 有效那我该怎么解决呢。
    这样做的话第2个人界面都不会出来了。。
      

  6.   

    如果把server类的定义放到类的声明里,两个人连接以后,服务器对客户端1发消息的话文本域里输入的信息读不出来,按“发送”按钮发过去的是空消息,显示倒是在客户端1的界面里。客户端1对服务器发消息的话会显示到服务器对客户端2的界面里,内容正常。客户端2无影响
      

  7.   


    补充一下新发现的。第2个人连接以后第1个人的界面就失效了,不能发消息,按钮按了不会响应,消息也不会更新。我给第1个人发的消息也会显示到第2个人的界面里。原因是:你之前的代码每次均会创建一个新的ServerSocket对象,因此也就只有最新接入的Socket 有效那我该怎么解决呢。
    这样做的话第2个人界面都不会出来了。。界面和ServerSocket是没有关系的!
      

  8.   


    补充一下新发现的。第2个人连接以后第1个人的界面就失效了,不能发消息,按钮按了不会响应,消息也不会更新。我给第1个人发的消息也会显示到第2个人的界面里。原因是:你之前的代码每次均会创建一个新的ServerSocket对象,因此也就只有最新接入的Socket 有效那我该怎么解决呢。
    这样做的话第2个人界面都不会出来了。。界面和ServerSocket是没有关系的!界面是收到第2个人连接才会出来的啊。
    server threadServer=new server(server_socket.accept());这句拿到while外面不就只能接收1个客户端了么
      

  9.   


    补充一下新发现的。第2个人连接以后第1个人的界面就失效了,不能发消息,按钮按了不会响应,消息也不会更新。我给第1个人发的消息也会显示到第2个人的界面里。原因是:你之前的代码每次均会创建一个新的ServerSocket对象,因此也就只有最新接入的Socket 有效那我该怎么解决呢。
    这样做的话第2个人界面都不会出来了。。界面和ServerSocket是没有关系的!界面是收到第2个人连接才会出来的啊。
    server threadServer=new server(server_socket.accept());这句拿到while外面不就只能接收1个客户端了么首先:拿到外面的是 ServerSocket server_socket=new ServerSocket(i1);    //i1是端口号 
    而不是accept你确定?ServerSocket监听客户端连接请求产生一个Socket不同Scoket之间无直接关联
      

  10.   


    额。我已经改成这样了: public void run()
    {
    try
    {
    i1=Integer.parseInt(t1.getText());
    name=t2.getText();
    if(name.equals(""))
    System.out.println("请输入你的昵称!");
    else
    {
    server_socket=new ServerSocket(i1);
    indexset.connectsucceed();
    //server threadServer;
    while(true)
    {
    //System.out.println("Wait for client to connect...");
    Socket a=server_socket.accept();
    //server threadServer=new server(server_socket.accept());
    server threadServer=new server(a);
    threadServer.start();
    }
    }
    }
    catch(Exception e1){ System.out.println("ServerSocket启动失败!");};
    }但是还是没解决。。我把所有的程序都上传了http://download.csdn.net/download/ww01055/6569887
      

  11.   

    [quote=引用 21 楼 victor_woo 的回复:
    是不是你对话框对象的引用出错了蛋疼。真的是。被你这么一提醒发现文本域写成static类型的了怪不得。辛苦楼上各位了。唉