在做酒店管理系统的客户端,socket通信部分在输出数据时服务器总是读到空数组是怎么回事儿?

解决方案 »

  1.   

    public class OtherCallFrame extends JFrame {//implements ItemListener{ private static final long serialVersionUID = 1L;

    private JButton btn_submit,btn_cancel;
    private JLabel lbl_CallItem;
    private JCheckBox chb_Toiletries,chb_HairDryer,chb_Tableware,chb_Other;
    // private JList call_list;

    Checkout checkout = new Checkout();
    Object[] CheckoutNames;
    //通信部分
    private ObjectOutputStream out;// 声明输出流对象


    public OtherCallFrame()
    {
    initFrame();
    initAction();

    this.setSize(400, 150);
    this.setTitle("橙子酒店呼叫客户端");
    this.setIconImage(ImageUtill.getImage("images/logo/orange_16.png"));
    this.setExtendedState(JFrame.MAXIMIZED_BOTH);
    this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    this.setLocationRelativeTo(null);
    this.setResizable(false);
    this.setVisible(true);
    } private void initFrame() {
    Container container = this.getContentPane();

    container.add(getLeftPanel(),BorderLayout.CENTER);
    // container.add(getRightPanel(),BorderLayout.WEST);
    container.add(getDownPanel(),BorderLayout.SOUTH);
    }

    private JPanel getLeftPanel() {
    JPanel spanel = new JPanel();
    spanel.setBackground(new Color(230,240,187));
    GridBagLayout gbl = new GridBagLayout();
    spanel.setLayout(gbl);

    lbl_CallItem = new JLabel("呼叫项目:");

    chb_Toiletries = new JCheckBox("洗漱用具");
    chb_HairDryer = new JCheckBox("吹风机");
    chb_Tableware = new JCheckBox("餐具");
    chb_Other = new JCheckBox("其他");
            
            spanel.add(lbl_CallItem,new GBC(0,0).setInset(6));
            spanel.add(chb_Toiletries,new GBC(1,0).setFill(GBC.BOTH).setInset(6));
            spanel.add(chb_HairDryer,new GBC(2,0).setFill(GBC.BOTH).setInset(6));
            spanel.add(chb_Tableware,new GBC(1,1).setFill(GBC.BOTH).setInset(6));
            spanel.add(chb_Other,new GBC(2,1).setFill(GBC.BOTH).setInset(6));

    return spanel;
    }

    private JPanel getDownPanel() {

    JPanel panel = new JPanel();
    panel.setBackground(new Color(255,236,139));
    GridBagLayout gbl = new GridBagLayout();
    panel.setLayout(gbl);

    btn_submit = new JButton("提交");
    btn_submit.setBackground(new Color(230,240,187));
    btn_cancel = new JButton("取消");
    btn_cancel.setBackground(new Color(230,240,187));

    panel.add(btn_submit,new GBC(2,0).setInset(3).setFill(GBC.BOTH).setInset(6));
    panel.add(btn_cancel,new GBC(3,0).setInset(3).setFill(GBC.BOTH).setInset(6));

    return panel;
    } private void initAction() {

    btn_submit.addMouseListener(new MouseAdapter(){ public void mouseClicked(MouseEvent e) {

    itemStateChanged();
    if(e.getClickCount()==1)
    {
    if(checkout != null)
    {
    send();
    }
    if(checkout == null)
    {
    return;//为空什么都不做
    }
    }
    } });


    btn_cancel.addMouseListener(new MouseAdapter(){
    public void mouseClicked(MouseEvent e) {

    if(e.getClickCount()==1)
    {
    OtherCallFrame.this.setVisible(false);
    }
    } });

    } /*
     *此方法用于判断Checkout组件是否被选择 
     */
    public void itemStateChanged()
    {
    if(chb_Toiletries.isSelected())
    {
    checkout.setChb_Toiletries("洗漱用具");
    System.out.println(chb_Toiletries.getText());
    }
    else
    chb_Toiletries = null;
    if(chb_HairDryer.isSelected())
    {
    checkout.setChb_HairDryer("吹风机");
    System.out.println(chb_HairDryer.getText());
    }
    else
    chb_HairDryer = null;
    if(chb_Tableware.isSelected())
    {
    checkout.setChb_Tableware("餐具");
    System.out.println(chb_Tableware.getText());
    }
    else
    chb_Tableware = null;
    if(chb_Other.isSelected())
    {
    checkout.setChb_Other("其他");
    System.out.println(chb_Other.getText());
    }
    else
    chb_Other = null;
    if(chb_Toiletries == null && chb_HairDryer == null && chb_Tableware == null && chb_Other == null)
    {
    CheckoutNames = null;
    }
    }

    // public Checkout itemStateChanged(Checkout chb_Tolitetries,Checkout chb_HairDryer,Checkout chb_Tableware,Checkout chb_Other){
    // if(Checkout )
    //
    // return checkout;
    // }

    public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        OtherCallFrame frame = new OtherCallFrame();
                        frame.createClientSocket();// 调用方法创建套接字对象
    //                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }); } public void createClientSocket() {
       try {
                Socket socket = new Socket("localhost", 1982);// 创建套接字对象
                out = new ObjectOutputStream(socket.getOutputStream());// 创建输出流对象
                new ClientThread(socket).start();// 创建并启动线程对象
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    } public JButton getBtn_submit() {
    return btn_submit;
    } public void setBtn_submit(JButton btn_submit) {
    this.btn_submit = btn_submit;
    }

    // public void itemStateChanged(ItemEvent e) {
    // //看状态是否被选则
    // if (e.getStateChange() == e.SELECTED) {
    // if (e.getSource() == checkout.getChb_Toiletries())
    // {
    // System.out.println(checkout.getChb_Toiletries().getText());
    // }
    // if (e.getSource() == checkout.getChb_HairDryer())
    // {
    // checkout.getChb_HairDryer().getText();
    // }
    // if(e.getSource() == checkout.getChb_Tableware())
    // {
    // checkout.getChb_Tableware().getText();
    // }
    // if(e.getSource() == checkout.getChb_Other())
    // {
    // checkout.getChb_Other().getText();
    // }
    //
    // }
    //
    // }

    class ClientThread extends Thread
    {
    OtherCallFrame frame ;//= new OtherCallFrame();
    Socket socket;
    BufferedReader in = null;//声明输入流对象
    // ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());

    public ClientThread(Socket socket)
    {
    this.socket = socket;
    }

    public void run()
    {

    try {
    in = new BufferedReader(
    new InputStreamReader(socket.getInputStream()));//创建输入流对象
    while(true)//不断刷新直到手动结束
    {
    String info = in.readLine().trim();
    if(info != null)
    {
    System.out.println(info);
    }
    }
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }

    }

    public void send()
    {
    Vector<Checkout> v = new Vector<Checkout>();//创建向量对象用于存储发送消息
    // if(CheckoutNames != null)
    // v.add(CheckoutNames);
    // v.add
     
    try {
    out.writeObject(v);
    out.flush();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }}
    这里面Checkout类是一个pojo包里面的封装的全是属性的类,封装了JCheckBox组件的名称,然后想把这个类作为对象传到服务器,我就是简单的在服务器那边做了个测试,想打印出读取到的对象。可是读出来是空数组,不知道怎么改。  while (true) {   //得不断的获取,直到手动结束
                    
                        Vector<Checkout> v = null;
                        
                        try {
                            v = (Vector) in.readObject();
                            System.out.println(v);