服务器从无限循环中终止?
Server terminate from infinite while loop?
我是 java 的新手。
我开始学习java网络编程。
我的问题:我将我的服务器置于无限 while 循环中以继续工作。
我向服务器发送消息,当服务器读取此消息时它应该执行一些操作。它已成功执行,但在退出我的客户端程序后,服务器也会终止,尽管我将其置于无限循环中。
我的客户代码:
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
}
}
让我解释一下:当我调用此方法时,它会向客户端发送一条消息 "Supplier Orders" 和一个用户名....当服务器收到此消息时,它应该启动一个包含一些数据的 gui 页面我给服务器提供用户名的那个供应商。
但是当我关闭客户端时,服务器也终止了……这不应该发生。我希望服务器继续工作而不退出。
那么如何解决这个问题? .. 很抱歉post。
编辑
gui 页面的代码,它应该在 table 上显示一些数据:它成功显示了数据,但正如我提到的,当我关闭客户端时,服务器也关闭了,我不想发生这种情况,我希望服务器继续工作而不是 close
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()});
}
}
}
}
问题是当客户端退出时,您的客户端正在关闭客户端和服务器之间的套接字,如 Dbug 所说。由于您在服务器中的 in.readline() 上阻塞,因此抛出 IOException(套接字关闭异常)。您的代码未处理该 IOException 并且您的 while 循环不足以阻止服务器代码退出。您需要添加一些 try/catches 来捕获这些异常。
考虑添加一些 finally 块以确保正确关闭套接字和流。
我是 java 的新手。
我开始学习java网络编程。
我的问题:我将我的服务器置于无限 while 循环中以继续工作。
我向服务器发送消息,当服务器读取此消息时它应该执行一些操作。它已成功执行,但在退出我的客户端程序后,服务器也会终止,尽管我将其置于无限循环中。
我的客户代码:
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
}
}
让我解释一下:当我调用此方法时,它会向客户端发送一条消息 "Supplier Orders" 和一个用户名....当服务器收到此消息时,它应该启动一个包含一些数据的 gui 页面我给服务器提供用户名的那个供应商。
但是当我关闭客户端时,服务器也终止了……这不应该发生。我希望服务器继续工作而不退出。
那么如何解决这个问题? .. 很抱歉post。
编辑
gui 页面的代码,它应该在 table 上显示一些数据:它成功显示了数据,但正如我提到的,当我关闭客户端时,服务器也关闭了,我不想发生这种情况,我希望服务器继续工作而不是 close
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()});
}
}
}
}
问题是当客户端退出时,您的客户端正在关闭客户端和服务器之间的套接字,如 Dbug 所说。由于您在服务器中的 in.readline() 上阻塞,因此抛出 IOException(套接字关闭异常)。您的代码未处理该 IOException 并且您的 while 循环不足以阻止服务器代码退出。您需要添加一些 try/catches 来捕获这些异常。
考虑添加一些 finally 块以确保正确关闭套接字和流。