Java套接字服务器显示空白窗口
我正在编写一个程序,当我在没有start方法的情况下运行它时,通过服务器与两个客户机通信,它工作正常,如下所示 但当我试图监听连接时,我只得到一个空白的白色窗口。程序停在Java套接字服务器显示空白窗口,java,swing,sockets,event-dispatch-thread,Java,Swing,Sockets,Event Dispatch Thread,我正在编写一个程序,当我在没有start方法的情况下运行它时,通过服务器与两个客户机通信,它工作正常,如下所示 但当我试图监听连接时,我只得到一个空白的白色窗口。程序停在conn=server.accept()上,这很合乎逻辑,因为我还没有客户机,但为什么它什么都没有呢 还有,我能把白色的边框去掉吗 import java.awt.*; import java.awt.print.PrinterException; import java.io.*; import java.net.*;
conn=server.accept()
上,这很合乎逻辑,因为我还没有客户机,但为什么它什么都没有呢
还有,我能把白色的边框去掉吗
import java.awt.*;
import java.awt.print.PrinterException;
import java.io.*;
import java.net.*;
import javax.swing.*;
public class Server extends JFrame {
private ServerSocket server;
private Socket conn;
private JTextArea TA;
private JPanel panel1;
private final int port = 1234;
public Server() {
super("Server");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(new Dimension(400, 300));
Container c = getContentPane();
c.setBackground(Color.BLACK);
TA = new JTextArea();
TA.setEditable(true);
TA.setBackground(Color.BLACK);
TA.setForeground(Color.GREEN);
c.add(new JScrollPane(TA));
setVisible(true);
TA.append("Server started.");
}
public void start() {
try {
TA.append("ServerSocket created. \n Listering for connections...");
server = new ServerSocket(port, 2);
for (int i = 0; i < 2; i++) {
conn = server.accept();
TA.append("User " + i + " connected");
}
} catch (IOException ioe) {
System.out.println(ioe);
}
}
}
import javax.swing.SwingUtilities;
我是按照youtube指南写这篇文章的,它也有同样的错误,但看起来在第三部分之后就停止了,所以我从来没有找到解决方法。
{in调用服务器s=newserver()调用器(new Runnable()
中的{是一个错误的想法,您不需要从public class ServerLauncher{
(事件调度线程的通知器invokeLater
启动()启动硬运行和长时间运行的代码-
来自工作者线程
,SwingWorker
,可运行#线程
线程
您(再次)对Swing中的TA.append(“用户”+i+“已连接”);
,来自一致性有问题
工作线程的所有更新必须在EDT上完成,并包装到invokeLater()中
- 从
启动Runnable#Thread
然后在内部循环中添加到servers=newserver()
包装到TA.append(“User”+i+“connected”);
invokeLater
来自调用服务器s=new Server();
{inSwingUtilities.invokeLater(new Runnable()
是错误的想法,您不需要从public class ServerLauncher{
启动长时间运行的代码-invokeLater
),您需要从工作者线程(事件调度线程的通知程序)
,SwingWorker
,Runnable#Thread
阅读更多内容Thread
您(再次)对Swing中的TA.append(“用户”+i+“已连接”);
,来自一致性有问题
工作线程的所有更新必须在EDT上完成,并包装到invokeLater()中
- 从
启动Runnable#Thread
然后在内部循环中添加到servers=newserver()
包装到TA.append(“User”+i+“connected”);
invokeLater
来自调用服务器s=new Server();
{inSwingUtilities.invokeLater(new Runnable()
是错误的想法,您不需要从public class ServerLauncher{
启动长时间运行的代码-invokeLater
),您需要从工作者线程(事件调度线程的通知程序)
,SwingWorker
,Runnable#Thread
阅读更多内容Thread
您(再次)对Swing中的TA.append(“用户”+i+“已连接”);
,来自一致性有问题
工作线程的所有更新必须在EDT上完成,并包装到invokeLater()中
- 从
启动Runnable#Thread
然后在内部循环中添加到servers=newserver()
包装到TA.append(“User”+i+“connected”);
invokeLater
来自调用服务器s=new Server();
{inSwingUtilities.invokeLater(new Runnable()
是错误的想法,您不需要从public class ServerLauncher{
启动长时间运行的代码-invokeLater
),您需要从工作者线程(事件调度线程的通知程序)
,SwingWorker
,Runnable#Thread
阅读更多内容Thread
您(再次)对Swing中的TA.append(“用户”+i+“已连接”);
,来自一致性有问题
工作线程的所有更新必须在EDT上完成,并包装到invokeLater()中
- 从
启动Runnable#Thread
然后在内部循环中添加到servers=newserver()
包装到TA.append(“User”+i+“connected”);
invokeLater
public static void main(String[] args) {
Server s = new Server();
s.start();
}
public Server() {
super("Server");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(new Dimension(400, 300));
Container c = getContentPane();
c.setBackground(Color.BLACK);
TA = new JTextArea();
TA.setEditable(true);
TA.setBackground(Color.BLACK);
TA.setForeground(Color.GREEN);
c.add(new JScrollPane(TA));
setVisible(true);
log(TA, "Server started.");
}
public void log(JTextArea txt, String message) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
txt.append(message);
}});
}
public void start() {
try {
log(TA, "ServerSocket created. \n Listering for connections...");
server = new ServerSocket(port, 2);
for (int i = 0; i < 2; i++) {
conn = server.accept();
log(TA, "User " + i + " connected");
}
} catch (IOException ioe) {
System.out.println(ioe);
}
}
publicstaticvoidmain(字符串[]args){
服务器s=新服务器();
s、 start();
}
公共服务器(){
超级(“服务器”);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
设置尺寸(新尺寸(400300));
容器c=getContentPane();
c、 挫折背景(颜色:黑色);
TA=新的JTextArea();
TA.setEditable(真);
TA.立根背景(颜色:黑色);
设置前景(颜色为绿色);
c、 添加(新的JScrollPane(TA));
setVisible(真);
日志(TA,“服务器已启动”);
}
公共无效日志(JTextArea txt,字符串消息){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
追加(消息);
}});
}
公开作废开始(){
试一试{
日志(TA,“已创建ServerSocket。\n正在侦听连接…”);
服务器=新的服务器套接字(端口2);
对于(int i=0;i<2;i++){
conn=server.accept();
日志(TA,“用户”+i+“连接”);
}
}捕获(ioe异常ioe){
系统输出打印项次(ioe);
}
}
之所以发生这种情况,是因为在AWT事件调度程序线程中进行了调度,并且您正在使用accept方法阻止它,所以没有显示任何内容
请尝试以下方法:
public static void main(String[] args) {
Server s = new Server();
s.start();
}
public Server() {
super("Server");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(new Dimension(400, 300));
Container c = getContentPane();
c.setBackground(Color.BLACK);
TA = new JTextArea();
TA.setEditable(true);
TA.setBackground(Color.BLACK);
TA.setForeground(Color.GREEN);
c.add(new JScrollPane(TA));
setVisible(true);
log(TA, "Server started.");
}
public void log(JTextArea txt, String message) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
txt.append(message);
}});
}
public void start() {
try {
log(TA, "ServerSocket created. \n Listering for connections...");
server = new ServerSocket(port, 2);
for (int i = 0; i < 2; i++) {
conn = server.accept();
log(TA, "User " + i + " connected");
}
} catch (IOException ioe) {
System.out.println(ioe);
}
}
publicstaticvoidmain(字符串[]args){
服务器s=新服务器();
s、 start();
}
公共服务器(){
超级(“服务器”);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
设置尺寸(新尺寸(400300));
容器c=getContentPane();
c、 设置