Java套接字服务器显示空白窗口

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.*;

我正在编写一个程序,当我在没有start方法的情况下运行它时,通过服务器与两个客户机通信,它工作正常,如下所示

但当我试图监听连接时,我只得到一个空白的白色窗口。程序停在
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指南写这篇文章的,它也有同样的错误,但看起来在第三部分之后就停止了,所以我从来没有找到解决方法。

  • 调用服务器s=newserver()
    {in
    public class ServerLauncher{
    中的{
    是一个错误的想法,您不需要从
    invokeLater
    (事件调度线程的通知器
    启动()启动硬运行和长时间运行的代码-
    工作者线程
    来自
    SwingWorker
    可运行#线程
    线程

  • TA.append(“用户”+i+“已连接”);
    您(再次)对Swing中的
    一致性有问题
    ,来自
    工作线程的所有更新必须在EDT上完成,并包装到invokeLater()中

  • Runnable#Thread
    启动
    servers=newserver()
    然后在内部循环中添加到
    TA.append(“User”+i+“connected”);
    包装到
    invokeLater

      • 调用服务器s=new Server();
        来自
        SwingUtilities.invokeLater(new Runnable()
        {in
        public class ServerLauncher{
        是错误的想法,您不需要从
        invokeLater
        启动长时间运行的代码-
        工作者线程(事件调度线程的通知程序)
        ),您需要从
        SwingWorker
        Runnable#Thread
        Thread
        阅读更多内容

      • TA.append(“用户”+i+“已连接”);
        您(再次)对Swing中的
        一致性有问题
        ,来自
        工作线程的所有更新必须在EDT上完成,并包装到invokeLater()中

      • Runnable#Thread
        启动
        servers=newserver()
        然后在内部循环中添加到
        TA.append(“User”+i+“connected”);
        包装到
        invokeLater

          • 调用服务器s=new Server();
            来自
            SwingUtilities.invokeLater(new Runnable()
            {in
            public class ServerLauncher{
            是错误的想法,您不需要从
            invokeLater
            启动长时间运行的代码-
            工作者线程(事件调度线程的通知程序)
            ),您需要从
            SwingWorker
            Runnable#Thread
            Thread
            阅读更多内容

          • TA.append(“用户”+i+“已连接”);
            您(再次)对Swing中的
            一致性有问题
            ,来自
            工作线程的所有更新必须在EDT上完成,并包装到invokeLater()中

          • Runnable#Thread
            启动
            servers=newserver()
            然后在内部循环中添加到
            TA.append(“User”+i+“connected”);
            包装到
            invokeLater

              • 调用服务器s=new Server();
                来自
                SwingUtilities.invokeLater(new Runnable()
                {in
                public class ServerLauncher{
                是错误的想法,您不需要从
                invokeLater
                启动长时间运行的代码-
                工作者线程(事件调度线程的通知程序)
                ),您需要从
                SwingWorker
                Runnable#Thread
                Thread
                阅读更多内容

              • TA.append(“用户”+i+“已连接”);
                您(再次)对Swing中的
                一致性有问题
                ,来自
                工作线程的所有更新必须在EDT上完成,并包装到invokeLater()中

              • Runnable#Thread
                启动
                servers=newserver()
                然后在内部循环中添加到
                TA.append(“User”+i+“connected”);
                包装到
                invokeLater


              之所以发生这种情况,是因为在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、 挫折背景(颜色:黑色);
              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、 设置