【发布时间】:2016-05-07 18:47:58
【问题描述】:
我只想制作一个服务器应用程序,它可以获取字符串并将它们放入 JTextArea 中。我得到两个错误,甚至没有显示错误。
-
虽然我使用了这个语句,但窗口不能关闭:
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- 如果客户端连接到服务器,整个窗口变黑。可能是什么错误?代码如下:
客户:
public Main() {
super("Main");
setIconImage(Toolkit.getDefaultToolkit().getImage(Main.class.getResource("/images/ic.png")));
panelFields = new JPanel();
panelFields.setLayout(new BoxLayout(panelFields,BoxLayout.X_AXIS));
panelFields2 = new JPanel();
panelFields2.setLayout(new BoxLayout(panelFields2,BoxLayout.X_AXIS));
scrollPane = new JScrollPane();
panelFields.add(scrollPane);
getContentPane().add(panelFields);
getContentPane().add(panelFields2);
getContentPane().setLayout(new BoxLayout(getContentPane(),BoxLayout.Y_AXIS));
setSize(326, 264);
setVisible(true);
messagesArea = new JTextArea();
scrollPane.setViewportView(messagesArea);
messagesArea.setColumns(30);
messagesArea.setRows(10);
messagesArea.setEditable(false);
startServer = new JButton("Start");
startServer.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
socketConnection();
startServer.setEnabled(false);
}
});
panelFields.add(startServer);
}
和服务器连接:
private void socketConnection() {
try {
serverSocket = new ServerSocket(9090);
System.out.println("Listening: " + serverSocket.getLocalPort());
} catch (IOException e) {
e.printStackTrace();
}
while (true) {
try {
socket = serverSocket.accept();
dataInputStream = new DataInputStream(socket.getInputStream());
System.out.println("ip: " + socket.getInetAddress());
System.out.println("message: " + dataInputStream.readUTF());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (dataInputStream != null) {
try {
dataInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
也许您可以告诉我,我该如何解决这些问题,以及如何让服务器不关闭套接字,尽管客户端断开连接。我想稍后重新连接...
【问题讨论】:
-
stackoverflow.com/questions/182316/… 的可能重复项。您的 socketConnection 方法永远不会结束,这意味着您的 ActionListener 永远不会返回,这会阻止 Swing 处理任何进一步的事件——包括表示标题栏关闭操作的 WindowEvents。始终在 AWT 事件调度线程以外的线程中执行冗长的操作。
-
谢谢,我明白了。我只是在“新线程(){}”中完成了它,并且效果很好!你能告诉我,尽管第一个连接崩溃了,我怎么能一直在后台运行这个线程?