客户端/服务器不接受ObjectInput和Output流

时间:2013-05-04 20:08:10

标签: java sockets tcp

我有一个程序有两个服务器端进程。一台服务器只是向客户端发送一个ArrayList。另一台服务器首先从客户端获取一个字符串,然后找到与该ID相对应的正确记录并将该记录发回。

我遇到了第二个服务器进程的问题。请参阅下面的println语句,其中显示“卡在这里”。这就是程序挂起的地方。

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;


public class CustServer{
    public static void main(String args[]) throws IOException, ClassNotFoundException{
     ServerSocket serverSocket1 = null;
     ServerSocket serverSocket2 = null;
     ArrayList<Customer> list = null;

        String driverName = "sun.jdbc.odbc.JdbcOdbcDriver";
        String connectionURL = "jdbc:odbc:customer";
        Connection con = null;
        Statement stmt = null;
        String sqlStatement = "SELECT ID, CustomerName, Address," +
                " City, State, Zip, Orders FROM Customer";
        ResultSet rs = null;
        try {
            Class.forName(driverName).newInstance();
            con = DriverManager.getConnection(connectionURL);
            stmt = con.createStatement();
            rs = stmt.executeQuery(sqlStatement);
            list = new ArrayList<Customer>(39);
            while(rs.next()){
                list.add(
                    new Customer(
                        rs.getString(1), 
                        rs.getString(2), 
                        rs.getString(3),  
                        rs.getString(4), rs.getString(5), rs.getString(6), 
                        rs.getString(7)));
            }

            rs.close();
            stmt.close();
            con.close();
        }catch (Exception ex) { ex.printStackTrace(); }

    try {
        serverSocket1 = new ServerSocket(8889);
        System.out.println("Customer DB server is running at port 8889");

    } catch (IOException e){
        System.out.println("Could not listen on port: 8889.");
        System.exit(1);
    }

    Socket clientSocket = null;
    try{
        clientSocket = serverSocket1.accept();

    }catch (IOException e){
        System.out.println("Server 1: Accept failed.");
        System.exit(1);
    }
    //A server program which returns a list of customer IDs from the database.
    ObjectOutputStream out = new ObjectOutputStream(clientSocket.getOutputStream());
    out.writeObject(list);
    System.out.println(list.size() + "Customer IDs (list) were sent.");

    out.flush();
    out.close();
    clientSocket.close();
    serverSocket1.close();
    //second server process:
    //Takes a customer  I D and returns the customer record 
    try {
        serverSocket2 = new ServerSocket(8888);
        System.out.println("Customer DB server is running at port 8888");

    } catch (IOException e){
        System.out.println("Could not listen on port: 8889.");
        System.exit(1);
    }
    try{
        clientSocket = serverSocket2.accept();

    }catch (IOException e){
        System.out.println("Server 2: Accept failed.");
        System.exit(1);
    }

    System.out.println("Gets stuck here."); //<<<<<HERE
    ObjectInputStream in = new ObjectInputStream(clientSocket.getInputStream());
    ObjectOutputStream out1 = new ObjectOutputStream(clientSocket.getOutputStream());
    String id = (String) in.readObject();
    String record = null;

    for(Customer c : list){
        if(c.getID().equals(id))
            record = c.toString();
    }

    out1.writeObject(record);

    out1.flush();
    out1.close();
    in.close();
    clientSocket.close();
    serverSocket2.close();
    }
}

Clientside:

    import java.awt.BorderLayout;
import java.awt.Dimension;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;

import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;


public class ClientGUI extends JFrame implements ListSelectionListener{

    //gui components
    JList jlist = null;
    String requestID = null; //Assigned to selected ID in JList. 
    JScrollPane scpane = null;
    JTextField field = null;
    JPanel pane = null;
    DefaultListModel<String> listModel = null;
    ArrayList<String> idList = null;

    //client stuff:
    Socket sock1 = null;
    Socket sock2 = null;
    ObjectInputStream in = null;
    ObjectOutputStream out = null;

    public ClientGUI() throws ClassNotFoundException{
        //get List of IDs from Server1
        try{
            sock1 = new Socket("FahadAhmed-PC", 8889); 
            in = new ObjectInputStream(sock1.getInputStream());
            idList = new ArrayList<String>(29);
            ArrayList<Customer> custList = null;
            custList = (ArrayList<Customer>) in.readObject();
            for(Customer c : custList){
                idList.add(c.getID());
            }

            in.close();
            sock1.close();

            sock2 = new Socket("FahadAhmed-PC", 8888); 



        }catch(UnknownHostException e) {
            System.err.println("Don't know about host: FahadAhmed-PC");
            System.exit(1);
        }catch(IOException e){
            System.err.println(e);
            System.exit(1);
        }

        //Setup GUI
        jlist = new JList(idList.toArray());
        jlist.setVisibleRowCount(10);
        scpane = new JScrollPane(jlist);
        jlist.addListSelectionListener(this);
        pane = new JPanel(new BorderLayout());
        pane.setPreferredSize(new Dimension(300, 300));
        field = new JTextField(29);
        field.setEditable(false);
        pane.add(scpane, BorderLayout.PAGE_START);
        pane.add(field, BorderLayout.PAGE_END);

        this.setContentPane(pane);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();
        this.setVisible(true);
    }

    public static void main(String args[]) throws ClassNotFoundException{
        ClientGUI gui = new ClientGUI();
    }


    @Override
    public void valueChanged(ListSelectionEvent arg0) {
        if(!arg0.getValueIsAdjusting())
            try {
                getRecord(jlist.getSelectedValue().toString());
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }       
    }

    private void getRecord(String getID) throws ClassNotFoundException {
        try{
            in = new ObjectInputStream(sock2.getInputStream());
            out = new ObjectOutputStream(sock2.getOutputStream());
            System.out.println(getID + "sent to getRecord method");
            out.writeObject(getID);

            String rec = (String) in.readObject();

            field.setText(rec);
            out.flush();
            out.close();
            in.close();
        }catch(UnknownHostException e) {
            System.err.println("Don't know about host: FahadAhmed-PC");
            System.exit(1);
        }catch(IOException e){
            System.err.println(e);
            System.exit(1);
        }
    }


}

2 个答案:

答案 0 :(得分:2)

你需要首先创建并刷新()ObjectOutputStream,否则它会在尝试读取标题时卡住,另一端没有发送,因为它等待读取你的标题。

答案 1 :(得分:1)

您需要在两端的ObjectInputStream之前创建ObjectOutputStream。