当前位置: 首页 > 面试题库 >

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

饶滨海
2023-03-14
问题内容

我有一个带有两个服务器端进程的程序。一台服务器只是将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();
    }
}

客户端:

    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);
        }
    }


}

问题答案:

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



 类似资料:
  • 下面是服务器接受多个客户端连接并响应的代码。服务器能够接收客户端的消息,但客户端没有接收服务器消息。我在服务器上使用了多线程概念。我还观察到,除了标有 ####. 的行之外,没有任何工作(即使是println语句)可能是客户端被阻止了...有什么想法吗?服务器代码:公共静态无效main(String artv[])抛出异常{

  • 我正在尝试基于非阻塞NIO消息开发自己的通信库。我已经阅读了1000篇关于它的教程和书中的章节,我认为最后我有了一些可以在几乎没有同时连接的情况下工作的东西。但是当我在服务器端有很多连接共存时,我遇到了一些问题。 我有4个私有方法的典型选择器实现:accept、finishConnect、read和write。我的问题在于前两个:接受和完成连接。 当客户端打开一个新的套接字,并且一个可接受的键唤醒

  • 我想在一些计算机之间建立点对点连接,这样用户就可以在没有外部服务器的情况下聊天和交换文件。我最初的想法如下: 我在服务器上制作了一个中央服务器插座,所有应用程序都可以连接到该插座。此ServerSocket跟踪已连接的套接字(客户端),并将新连接的客户端的IP和端口提供给所有其他客户端。每个客户端都会创建一个新的ServerSocket,所有客户端都可以连接到它。 换句话说:每个客户端都有一个Se

  • 我有一个示例Spring启动应用程序来运行图形QL服务器,具有作为客户端,我的pom有以下依赖项: 当我尝试从客户端连接时,出现以下错误: 狩猎决议好心建议。 我还有几个问题: 我应该使用SimpleGraphQLHttpServlet将请求路由到endpoint吗 我正在React UI上使用apollo client,那么它是强制使用apollo server还是spring boot可以工作

  • 我试图用java实现一个客户端服务器,在这里我读取客户端中的输入并在服务器中执行UperCase,然后返回客户端并打印UperCase。我使用ObjectOutputStream和ObjectInputStream进行读写,但是当我在客户机中键入一个msg时,程序会显示以下错误: Digite uma msg casa java.io.eofexception位于java.io.datainput

  • 我最近开始尝试使用JavaSockets类在服务器和客户机之间创建双向连接。当我使用客户机套接字地址作为但是当我在 客户端套接字显示连接是通过测试返回true。 然而,在服务器端,代码似乎并没有向前推进 我应该提供代码还是问题明确? 编辑:更多信息。无论我的防火墙处于什么状态,使用外部ip地址从我自己的电脑上远程登录都是有效的。当防火墙打开时,java客户端代码不起作用,抛出 当防火墙关闭时,使用