【问题标题】:Server terminate from infinite while loop?服务器从无限while循环终止?
【发布时间】:2015-12-18 19:07:40
【问题描述】:

我是 Java 新手。

我开始学习java网络编程。

我的问题:我将服务器置于无限循环以继续工作。

我向服务器发送一条消息,当服务器读取此消息时,它应该执行一些操作。它已成功执行,但在退出我的客户端程序后,服务器也会终止,尽管我将它置于无限循环中。

我的客户代码:

private void check_ordersActionPerformed(java.awt.event.ActionEvent evt) {                                             
    try {
        Socket ss = new Socket("localhost", 4000);
        PrintStream pr = new PrintStream(ss.getOutputStream());
        pr.println("Supplier Orders");
        pr.println(Supplier.username);
        pr.close();
        this.dispose();

    } catch (IOException ex) {
        Logger.getLogger(supp_page.class.getName()).log(Level.SEVERE, null, ex);
    }

我的服务器代码:

    int iiiiii = 0;
    ServerSocket s1 = new ServerSocket(4000); 
    String request = null;
    while(iiiiii == 0)
    {
        Socket ss = s1.accept();

        BufferedReader in = new BufferedReader(new InputStreamReader(ss.getInputStream()));
        request = in.readLine();

        switch (request) {
            case "Supplier Orders":
                Supplier.username = in.readLine();
                orders rs = new orders();
                rs.setLocation(350, 250);
                rs.setSize(800, 350);
                rs.setVisible(true);
                rs.setTitle("Orders Table");
                rs.setResizable(false);
                break;

                // some other messages here but iam focus on above one
        }
     }

让我解释一下:当我调用此方法时,它会向客户端“供应商订单”和用户名发送一条消息....当服务器收到此消息时,它应该启动一个包含该供应商一些数据的 gui 页面我把用户名给了服务器。

但是当我关闭客户端时,服务器也会终止……这不应该发生。我希望服务器继续工作而不是退出。

那么如何解决这个问题? .. 对不起,很长的帖子。

编辑

gui 页面的代码,它应该在表格上显示一些数据:它成功显示了数据,但是正如我提到的,当我关闭客户端时,服务器也关闭了,我不想发生这种情况,我希望服务器继续工作而不是关闭

public class orders extends javax.swing.JFrame {

DefaultTableModel t = new DefaultTableModel();
public orders() throws IOException, ClassNotFoundException {
    initComponents();
    request.setModel(t);
    t.addColumn("ID");
    t.addColumn("PRODUCT Name");
    t.addColumn("PRODUCT TYPE");
    t.addColumn("PRODUCT QUANTITY");
    t.addColumn("SUPPLIER ID");
    t.addColumn("SUPPLIER NAME");
    t.addColumn("SUPPLIER COMPANY");
    t.addColumn("SUPPLIER ADDRESS");
    t.addColumn("SUPPLIER PHONE NUMBER");
    ObjectInputStream oin = new ObjectInputStream(new FileInputStream("Orders.bin"));
    ArrayList<Order> a = (ArrayList)oin.readObject();
    Iterator<Order> iter = a.iterator();
    oin.close();
    while(iter.hasNext())
    {
        Order r = iter.next();
        if(Supplier.username.equals(r.getP().getS().getId() + r.getP().getS().getCompany()) && r.getStatus().equals("PENDING"))
        {
            t.addRow(new Object[]{r.getP().getId(),r.getP().getName(),r.getP().getType(),r.getP().getQuantity(),r.getP().getS().getId()
            ,r.getP().getS().getName(), r.getP().getS().getCompany(), r.getP().getS().getAddress(), r.getP().getS().getPhone_no()});
        }
    }
}
}

【问题讨论】:

  • 有几件事很突出,但我需要知道你想要的行为。您是否只想一次处理一个客户或同时服务多个客户?当客户端停止时,in.readLine() 会抛出一个异常,我看不到你在处理它,所以这很可能是程序停止的原因。此外,您应该将接受套接字与服务它分开。
  • 我的程序在本地主机上运行,​​所以可能只处理一个客户端。但这是否会导致服务器关闭...我在同一台服务器上有其他消息,并且它运行良好...即使我关闭客户端,服务器也不会退出。但我不知道服务器关闭该消息的原因。

标签: java client client-server


【解决方案1】:

问题是当客户端退出时,您的客户端正在关闭客户端和服务器之间的套接字,如 DBug 所说。由于您在服务器中阻止 in.readline() ,因此会引发 IOException(套接字关闭异常)。您的代码没有处理该 IOException 并且您的 while 循环不足以阻止服务器代码退出。您需要添加一些 try/catch 来捕获这些异常。

考虑添加一些 finally 块以确保您的套接字和流正确关闭。

【讨论】:

  • 先生,这对您的回答非常有帮助,并且 +1 ...但如果可以的话,我仍然需要您的帮助...我添加了 finally 块并发现自动关闭套接字,我的问题是: 如何防止这种情况发生?
  • 最简单的模式是打开套接字,然后在服务套接字时进入一个while循环。如果您想继续重试连接,请使用另一个 while 循环包装所有代码以重试连接。当你想连接时,连接到套接字,当套接字打开时,服务套接字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
  • 2012-03-20
  • 1970-01-01
  • 2015-06-25
  • 2014-03-16
  • 1970-01-01
相关资源
最近更新 更多