我试着写一个聊天 TCP。如果我独立运行文件服务器和客户端,就可以了。但是如果我使用其他 jframe 运行,它有主机按钮来运行服务器,它将显示一个空白的 jframe
{
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
FrmServer f=new FrmServer();
f.setVisible(true);
}
}
这是FrmServer
public FrmServer() throws HeadlessException {
setTitle("Server");
setLayout(new BorderLayout());
addContent();
addSend();
setSize(400, 300);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
chat();
}
private ServerSocket serverInfo;
private Socket clientInfo;
private ObjectInputStream ois;
private ObjectOutputStream oos;
private void chat() {
try {
serverInfo = new ServerSocket(12345);
clientInfo = serverInfo.accept();
ois = new ObjectInputStream(clientInfo.getInputStream());
oos = new ObjectOutputStream(clientInfo.getOutputStream());
while (true) {
String data = ois.readObject().toString();
txtContent.append("Client :" + data + "\n");
}
} catch (Exception ex) {
}
}
最佳答案
这是使用新线程修改后的代码(虽然没有尝试过):
public FrmServer() throws HeadlessException {
setTitle("Server");
setLayout(new BorderLayout());
addContent();
addSend();
setSize(400, 300);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
chat();
}
private ServerSocket serverInfo;
private Socket clientInfo;
private ObjectInputStream ois;
private ObjectOutputStream oos;
private void chat() {
Runnable runnable = new Runnable() {
public void run() {
try {
serverInfo = new ServerSocket(12345);
clientInfo = serverInfo.accept();
ois = new ObjectInputStream(clientInfo.getInputStream());
oos = new ObjectOutputStream(clientInfo.getOutputStream());
while (true) {
String data = ois.readObject().toString();
SwingUtilities.invokeLater(new Runnable() {
public void run(){
txtContent.append("Client :" + data + "\n");
}
});
}
} catch (Exception ex) {
}
}
};
//You can use a ThreadPool too.
new Thread(runnable).start();
}
使用 Java 8,您可以改进语法。
重要的是您不应该在 Swing/AWT 事件调度线程上做任何耗时的事情。连接到服务器,等待回复肯定很耗时。尽管有问题,但您不能从其他线程更新 UI。所以您需要 SwingUtilities
类来在 EDT 上执行代码。
Concurrency in Swing教程可能有助于理解细节。
关于java - 聊天 TCP 上的空白 Jframe 加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27531092/