0

就像在主题中一样-系统输出和错误流似乎在内核类的“更新”方法中的 catch 子句中被“冻结”。奇怪的是,当我调试项目并停在 System.out 行时,我什至可以删除突破并且一切正常。

除了最后一个 System.out 之外的所有内容都已执行,即使我替换了默认 System.out,它也不起作用。

目前,我正在建立连接后断开用户连接。

我的代码,StartServer.java:

公共类 StartServer {

    公共静态无效主要(字符串[]参数){
        内核内核=新内核(4444);
        内核.run();
        而(真){
            kernel.update();
        }
    }

}

内核.java:

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Kernel {

    ArrayList<Socket> clients;
    ServerSocket socket;

    public Kernel(int port) {
        try {
            socket = new ServerSocket(port);
            clients = new ArrayList<>();
            System.out.println("Server initialized");
        } catch (IOException ex) {
            Logger.getLogger(StartServer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void run() {
        Thread thread = new Thread(){
            public void run() {
                try {
                    while (true) {
                        Socket client = socket.accept();
                        clients.add(client);
                        System.out.println("New user on the server!");
                    }
                } catch (IOException ex) {
                    Logger.getLogger(Kernel.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        };
        thread.start();
    }

    public void update() {
        for (int i=0; i<clients.size(); i++) {
            Socket s = clients.get(i);
            try {
                /*String result;
                if (s.getInputStream().available()!=0) {
                    byte[] byteRes = new byte[s.getInputStream().available()];
                    char[] charRes = new char[s.getInputStream().available()];
                    s.getInputStream().read(byteRes);
                    for (int i2=0; i2<charRes.length; i2++) {
                        charRes[i2] = (char) byteRes[i2];
                    }
                    result = String.copyValueOf(charRes);
                    System.out.println(result);
                }*/
                throw new IOException();
            } catch (IOException ex) {
                try {
                    System.out.println("Client disconnected"); //working only in debug mode
                    clients.remove(s);
                    s.close();
                    i--;
                } catch (IOException ex1) {
                    Logger.getLogger(Kernel.class.getName()).log(Level.SEVERE, null, ex1);
                }
            }
        }
    }

}
4

2 回答 2

1

在 StartServer 类中更改无限循环,如下所示:

while (true) {
    try {
        Thread.sleep(10);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    kernel.update();
}
于 2013-05-17T06:24:36.150 回答
0

尝试添加一个

System.out.flush();

在 System.out.println() 之后

于 2013-05-16T15:01:25.553 回答