这是服务端代码,没有问题,能把数据发过去,但是到了客户端数据却取不出来,什么原因。package reconserver;import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.*;
import java.awt.*;public class Ser {
    ServerSocket socket=null;
    Vector mthreads=new Vector();
    Ser(){
            try{
                socket=new ServerSocket(8080);
            }catch(Exception e){
                JOptionPane.showMessageDialog(new Frame(),"Build socket failed!",
                        "Failed",JOptionPane.ERROR_MESSAGE);
                System.exit(1);
            }
            try{
                while(true){
                    Socket s=socket.accept();
                    ServerThread st=new ServerThread(s,mthreads);
                    st.setID(0);
                    mthreads.addElement(st);
                    new Thread(st).start();
                }
            }catch(Exception e){}
    }
    public static void main(String[] args) {
        Ser ser = new Ser();
    }
}
class ServerThread implements Runnable{
    Socket soc=null;
    Vector mthreads;
    DataInputStream min=null;
    DataOutputStream mout=null;
    int mid;
    public ServerThread(Socket s,Vector threads){
        soc=s;
        mthreads=threads;
        try{
            min=new DataInputStream(soc.getInputStream());
            mout=new DataOutputStream(soc.getOutputStream());
        }catch(Exception e){}
    }
    public void run(){
        try{
            while(true){
                String s=min.readUTF();
                if(!s.equals(null)){
                    String send = handmessage(s);                  //判断客户发来什么命令,然后执行相应功能
                    if(s.equals("list")||s=="list")
                        send = send.substring(0, send.length() - 2);    //再返回结果。
                    String[] str = send.split("\".");
                    System.out.println("2."+send);
                    ServerThread st = (ServerThread) mthreads.elementAt(0);
                    st.write(send);
                }
            }
        }catch(Exception e){}
    }
    String handmessage(String s){                 //为方便阅读这里没贴出来
            }
    public void write(String msg){
        synchronized(mout){
            try{
                mout.writeUTF(msg);
                mout.flush();
            }catch(Exception e){}
        }
    }
    public void setID(int id){
        mid=id;
    }
}
客户端代码  getConnection.javaimport java.net.*;
import java.io.*;
public class getConnection implements Runnable{
    Socket soc=null;
    DataInputStream min;
    DataOutputStream mout;
    String message="";
    String send;
    public getConnection(InetAddress IP,String send){
        try{
            this.send=send;
            soc=new Socket(IP,8080);
            min=new DataInputStream(soc.getInputStream());
            mout=new DataOutputStream(soc.getOutputStream());
            //new Thread(this).start();
        }catch(Exception e){
            e.toString();
        }
    }
    public void run(){
        boolean ff=true;
        try{
            mout.writeUTF(send);
            while(ff){
                 String s=min.readUTF();
                 if(!s.equals("")||s!=""||s!=null)
                     message=s;
                     System.out.println("s."+message);               
            }
        }catch(Exception e){}
    }
}启动客户端 也就是连接服务器把服务器的所有进程发过将在SystemFr中显示出来,这里也没有问题 try {
                getConnection get = new getConnection(IPA, "list");
                new Thread(get).start();
                Thread.sleep(1000);
                //new Thread(get).interrupt();
                JDialog jd = new SystemFr(new JFrame(), IPA.toString(), true,
                                          get.message);
                jd.setVisible(true);
            } catch (Exception e1) {
                e1.toString();
            }SystemFr.java 这里就收不到服务器发来的信息了     由于发贴字数限制,此类的具体内容在一楼帖出。package recon;import java.awt.BorderLayout;
import java.awt.Frame;
import java.net.*;
import javax.swing.*;
import java.awt.Rectangle;
import javax.swing.table.DefaultTableModel;
import java.awt.Dimension;
import java.awt.Color;
import javax.swing.event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JOptionPane;
import javax.swing.table.AbstractTableModel;
public class SystemFr extends JDialog{
    DefaultTableModel defaultModel = null;
    JMenuBar jMenuBar1 = new JMenuBar();
    JMenu jMenuFile = new JMenu();
    JMenuItem jMenuFileExit = new JMenuItem();
    JMenuItem jMenuItem1 = new JMenuItem();
    JMenu jMenu1 = new JMenu();
    JMenuItem jMenuItem2 = new JMenuItem();
    JPanel jPanel1 = new JPanel();
    JTabbedPane jTabbedPane1 = new JTabbedPane();
    JScrollPane jScrollPane1 = new JScrollPane();
    JTable jTable1 = new JTable();
    JButton jButton1 = new JButton();
    JMenuItem jMenuItem3 = new JMenuItem();
    JMenuItem jMenuItem4=new JMenuItem();
    String text;
    String title;
    JLabel jLabel1 = new JLabel();
    public SystemFr(Frame owner, String title, boolean modal,String text) {
        super(owner, title, modal);
        this.text=text;
        this.title=title;
        try {
            setDefaultCloseOperation(DISPOSE_ON_CLOSE);
            jbInit();
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
    public SystemFr() {
        this(new Frame(), "System", true,"");
    }
    

解决方案 »

  1.   


    private void jbInit() throws Exception {
            setSize(new Dimension(400, 470));
            setResizable(false);
            this.getContentPane().setLayout(null);
            String[] name = {"映像名称", "PID", "CPU", "内存使用", "用户名"};
            defaultModel = new DefaultTableModel(buildtable(), name);
            jTable1 = new JTable(defaultModel);
            jMenu1.setText("关机(U)");
            jMenuItem2.setText("待机(B)");
            jMenuFile.setText("File");
            jMenuFileExit.setText("Exit");
            jMenuItem3.setText("关闭(U)");
            jMenuItem4.setText("重启(R)");
            jPanel1.setBounds(new Rectangle( -1, 0, 402, 413));
            jPanel1.setLayout(null);
            jTabbedPane1.setBounds(new Rectangle(4, 0, 388, 383));
            jButton1.setBounds(new Rectangle(282, 385, 111, 23));
            jButton1.setText("结束进程(E)");
            jButton1.setEnabled(false);
            jScrollPane1.setBorder(null);
            jMenuItem1.setText("新建任务(N)");
            jMenuItem1.addActionListener(new ActionSet(title,jTable1,jButton1,defaultModel,jLabel1));
            jMenuItem2.addActionListener(new ActionSet(title,jTable1,jButton1,defaultModel,jLabel1));
            jMenuItem3.addActionListener(new ActionSet(title,jTable1,jButton1,defaultModel,jLabel1));
            jMenuItem4.addActionListener(new ActionSet(title,jTable1,jButton1,defaultModel,jLabel1));
            jButton1.addActionListener(new ActionSet(title,jTable1,jButton1,defaultModel,jLabel1));
            jLabel1.setBounds(new Rectangle(9, 389, 82, 15));
            jMenuBar1.add(jMenuFile);
            jMenuBar1.add(jMenu1);
            jMenuFile.add(jMenuItem1);
            jMenuFile.add(jMenuFileExit);
            jMenu1.add(jMenuItem2);
            jMenu1.add(jMenuItem3);
            jMenu1.add(jMenuItem4);
            jPanel1.add(jButton1);
            jPanel1.add(jTabbedPane1);
            jPanel1.add(jLabel1);
            jTabbedPane1.add(jScrollPane1, "进程");
            jScrollPane1.getViewport().add(jTable1);
            this.getContentPane().add(jPanel1);
            setJMenuBar(jMenuBar1);
        }
        void jMenuFileExit_actionPerformed(ActionEvent actionEvent) {
           System.exit(0);
       }
       String[][] buildtable(){
           String [] str=text.split("\".");
           String[] strs1 = str[0].split("/");
           String data[][]=new String[str.length][strs1.length];
           for(int i=0;i<str.length;i++){
               String[] strs = str[i].split("/");
               for (int j = 0; j < strs.length; j++) {
                   data[i][j] = strs[j];
               }
           }
           jLabel1.setText("进程数:"+String.valueOf(str.length));
           return data;
       }
    }
    class ActionSet implements ActionListener,ListSelectionListener{
        String add;
        JTable table;
        JButton jb;
        ListSelectionModel selectionMode=null;
        String selected;
        int row;
        int sel;
        DefaultTableModel df;
        JLabel jl;    ActionSet(String address,JTable table,JButton jb,DefaultTableModel df,JLabel jl){
            this.add=address.substring(address.indexOf("/")+1,address.length());
            this.table=table;
            this.jb=jb;
            this.df=df;
            this.jl=jl;
            selectionMode=table.getSelectionModel();
            selectionMode.addListSelectionListener(this);
            selectionMode.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        }
        public void actionPerformed(ActionEvent e){
            String send=null;
            String command=e.getActionCommand();
            getConnection get;
            String getmsg=null;
            if(command.equals("新建任务(N)")){
                }
            if(command.equals("结束进程(E)")){
                send = "over" + "/" + sel;
                try {
                    get = new getConnection(InetAddress.getByName(add), send);
                    new Thread(get).start();
                    Thread.sleep(1000);
                    getmsg = get.message;                //就是到这里,这个get.message就取不出来了。
                    System.out.println("1.. "+getmsg);            //但是在getConnection中的那个输出
                } catch (Exception ee) {                           //语句又有输出
                    get = new getConnection(add, send);
                    getmsg = get.message;
                    System.out.println("2..."+get.message);
                }
                if (getmsg.equals("true")) {
                    try {
                        df.removeRow(row);
                        df.setRowCount(row);
                    } catch (Exception f) {}
                    table.revalidate();
                    jb.setEnabled(false);
                    jl.setText("进程数:" + String.valueOf(df.getRowCount()));
                }
                else
                    JOptionPane.showMessageDialog(new Frame(),"Failed",
                                "Failed",JOptionPane.INFORMATION_MESSAGE);
            }
            if(command.equals("重启(R)")){
            }
            if(command.equals("关闭(U)")){
            }
            if(command.equals("待机(B)")){
            }
        }
        public void valueChanged(ListSelectionEvent e1){
            jb.setEnabled(true);
            int row=table.getSelectedRow();
            this.row=row;
            selected=(String)table.getValueAt(row,0);
            sel=Integer.valueOf((String)table.getValueAt(row,1));
        }
    }
      

  2.   

     public void run(){
            boolean ff=true;
            try{
                mout.writeUTF(send);
                while(ff){
                     String s=min.readUTF();
                     if(!s.equals("")||s!=""||s!=null)
                         message=s;
                         System.out.println("s."+message);               
                }
            }catch(Exception e){}
        }1、你那个if语句啥意思?
    把红色的部分改成 if(s!=null&&!s.equals(""))  。
    你写的那个if,如果s为空则会抛空指针异常;还有,以后再也别写str=="" 或者 str!=""的布尔表达式了,会害死你自己的,改成str.equals(""); 你的代码里面还有好几处要修改if语句的条件。
    2、你的log呢?
    没有一句log,我把你程序调通后,一跑,啥是啥都不知道,因为我没看到半句log。
    如果你有log的话,估计你就不会在这发帖了。
    3、你的catch子句的处理代码呢??
    不是我说你,如果没有catch子句,建议你别捕获,你这样处理会让你自己都不知道程序怎么跑的,出了异常也看不到任何信息。在你工作开发过程中,这些是最危险的bug。
    4、我对于界面的东东不熟悉,我记得刚开始练java网络编程的时候和你写的一样,估计你过个两个月后去再去看你的界面程序的源码,你自己都得看半天(估计能否看懂都怀疑,能看懂很不错了)。
     建议:代码按功能块分出来,最好多加点注释。你的代码不全,没看到你说的现象;我估计90%以上是空指针异常。
      

  3.   

    你的代码不全,没看到你说的现象(其他错误跳出来了),估计你90%的可能是抛出了空指针异常。
    给你几个建议:1、必须把代码中类似于 if(!s.equals("")||s!=""||s!=null)的句子改了, 如果s为null,会抛空指针异常的;还有,关系应该是与非不是或非; 以后永远也别写s==""这样的语句了,否则会留一些很奇怪的bug给你的程序的,不信你测试一下这几句代码: 
    String  a = "";
    String  b = new String(a);
    System.out.println(b=="");
    2、我调试你的程序好吃力,半句log都没有,如果你加了log,估计你就能自己找到问题所在了。
    3、catch子句为空?如果不写catch子句,还不如直接抛出来,这样还知道程序怎么跑的,如果不写,你很可能就不知道程序是不是正常运行了。这个地方不写点log或其他东东是开发的大忌,是出bug最多的地方,而且很难找到。
    4、我以前也写过界面的代码,现在去看已经看不懂了。 AWT 、Swing的东东记得一定要添加注释。
      

  4.   

                                    
    private void jbInit() throws Exception {
            setSize(new Dimension(400, 470));
            setResizable(false);
            this.getContentPane().setLayout(null);
            String[] name = {"映像名称", "PID", "CPU", "内存使用", "用户名"};
            defaultModel = new DefaultTableModel(buildtable(), name);
            jTable1 = new JTable(defaultModel);                        //服务器发来的所有进程信息
            jMenu1.setText("关机(U)");                                  //在这个表里显示
            jMenuItem2.setText("待机(B)");
            jMenuFile.setText("File");               //jMenu1 菜单栏,包括jMenuItem2,3,4
            jMenuFileExit.setText("Exit");           //jMenuFile 菜单栏,包括jMenuFileExit,jMenuItem1
            jMenuItem3.setText("关闭(U)");
            jMenuItem4.setText("重启(R)");
            jPanel1.setBounds(new Rectangle( -1, 0, 402, 413));
            jPanel1.setLayout(null);
            jTabbedPane1.setBounds(new Rectangle(4, 0, 388, 383));
            jButton1.setBounds(new Rectangle(282, 385, 111, 23));
            jButton1.setText("结束进程(E)");
            jButton1.setEnabled(false);
            jScrollPane1.setBorder(null);
            jMenuItem1.setText("新建任务(N)");           //class ActionSet处理所有class SystemFr
            jMenuItem1.addActionListener(new ActionSet      //响应所有菜单不包括“退出(title,jTable1,jButton1,defaultModel,jLabel1));
            jMenuItem2.addActionListener(new ActionSet     //jLabel1,显示进程总数。(title,jTable1,jButton1,defaultModel,jLabel1));
            jMenuItem3.addActionListener(new ActionSet(title,jTable1,jButton1,defaultModel,jLabel1));
            jMenuItem4.addActionListener(new ActionSet(title,jTable1,jButton1,defaultModel,jLabel1));
            jButton1.addActionListener(new ActionSet(title,jTable1,jButton1,defaultModel,jLabel1));
            jLabel1.setBounds(new Rectangle(9, 389, 82, 15));
            jMenuBar1.add(jMenuFile);                     //将所有组件添加到SystemFr中
            jMenuBar1.add(jMenu1);
            jMenuFile.add(jMenuItem1);
            jMenuFile.add(jMenuFileExit);
            jMenu1.add(jMenuItem2);
            jMenu1.add(jMenuItem3);
            jMenu1.add(jMenuItem4);
            jPanel1.add(jButton1);
            jPanel1.add(jTabbedPane1);
            jPanel1.add(jLabel1);
            jTabbedPane1.add(jScrollPane1, "进程");
            jScrollPane1.getViewport().add(jTable1);
            this.getContentPane().add(jPanel1);
            setJMenuBar(jMenuBar1);
        }
        void jMenuFileExit_actionPerformed(ActionEvent actionEvent) {
           System.exit(0);
       }
       String[][] buildtable(){                   //text 从服务器取得所有进程信息
           String [] str=text.split("\".");        //进程与进程之间用“\".”隔开
           String[] strs1 = str[0].split("/");      //每个进程中包括五个信息,由"/"隔开
           String data[][]=new String[str.length][strs1.length];
           for(int i=0;i<str.length;i++){
               String[] strs = str[i].split("/");
               for (int j = 0; j < strs.length; j++) {
                   data[i][j] = strs[j];
               }
           }
           jLabel1.setText("进程数:"+String.valueOf(str.length));
           return data;
       }
    }
    class ActionSet implements ActionListener,ListSelectionListener{
        String add;
        JTable table;
        JButton jb;
        ListSelectionModel selectionMode=null;
        String selected;
        int row;
        int sel;
        DefaultTableModel df;
        JLabel jl;    ActionSet(String address,JTable table,JButton jb,DefaultTableModel df,JLabel jl){
            this.add=address.substring(address.indexOf("/")+1,address.length());
            this.table=table;
            this.jb=jb;
            this.df=df;
            this.jl=jl;
            selectionMode=table.getSelectionModel();
            selectionMode.addListSelectionListener(this);
            selectionMode.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        }
        public void actionPerformed(ActionEvent e){
            String send=null;
            String command=e.getActionCommand();
            getConnection get;
            String getmsg=null;
            if(command.equals("新建任务(N)")){
                }
            if(command.equals("结束进程(E)")){
                send = "over" + "/" + sel;
                try {
                    get = new getConnection(InetAddress.getByName(add), send);
                    new Thread(get).start();
                    Thread.sleep(1000);
                    getmsg = get.message;                //就是到这里,这个get.message就取不出来了。
                    System.out.println("1.. "+getmsg);            //但是在getConnection中的那个输出
                } catch (Exception ee) {                           //语句又有输出
                    get = new getConnection(add, send);
                    getmsg = get.message;
                    System.out.println("2..."+get.message);
                }
                if (getmsg.equals("true")) {
                    try {
                        df.removeRow(row);
                        df.setRowCount(row);
                    } catch (Exception f) {}
                    table.revalidate();
                    jb.setEnabled(false);
                    jl.setText("进程数:" + String.valueOf(df.getRowCount()));
                }
                else
                    JOptionPane.showMessageDialog(new Frame(),"Failed",
                                "Failed",JOptionPane.INFORMATION_MESSAGE);
            }
            if(command.equals("重启(R)")){
            }
            if(command.equals("关闭(U)")){
            }
            if(command.equals("待机(B)")){
            }
        }
        public void valueChanged(ListSelectionEvent e1){       //鼠标在表上的选择事件,当要删除进程时用
            jb.setEnabled(true);                                                       //到
            int row=table.getSelectedRow();                   //选择哪行
            this.row=row;                                     
            selected=(String)table.getValueAt(row,0);         //返回选择行的进程名
            sel=Integer.valueOf((String)table.getValueAt(row,1));   //返回选择行的PID
        }
    }