简体   繁体   English

使用线程池创建一个等待来自客户端的消息的 java 服务器套接字

[英]create a java server socket that waits for messages from client using Thread Pool

@FXML
private TextArea textarea;
@FXML
private ImageView imagev;

@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
    Serverth Server = new Serverth();
    Server.start();
}


class Serverth extends Thread {
    @Override
    public void run() {
        try {
            final int NUM_THREAD = 99;


            ServerSocket socket = new ServerSocket(8078);
            ExecutorService exec = Executors.newFixedThreadPool(NUM_THREAD);
            System.out.println("SERVER SOCKET CREATED");


            while (!isInterrupted()) {
                Socket in = socket.accept();
                Runnable r = new ThreadedHandler(in);
                exec.execute(r);

            }
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }

    }
}

class ThreadedHandler implements Runnable {

    private Socket incoming;

    public ThreadedHandler(Socket in) {
        incoming = in;
    }

    public void run() {
        try {
            try {
                ObjectInputStream is=new ObjectInputStream(incoming.getInputStream());

                while(true) {
                    if (is.available() > 0) {
                        String line = is.readUTF();

                        textarea.appendText("\n" + "[" + new java.util.Date() + "] : " + line);

                        if (line.contains("inviato")) {
                            Object obj = is.readObject();
                            Email ema = (Email) obj;
                            try {
                                SimpleDateFormat formatter = new SimpleDateFormat("dd-M-yyyy-hh-mm-ss");
                                FileOutputStream fileOut = new FileOutputStream("src/Server/" + ((Email) obj).getDestinat() + "/" +  formatter.format(((Email) obj).getData()) + ".txt");
                                ObjectOutputStream objectOut = new ObjectOutputStream(fileOut);
                                objectOut.writeObject(ema);
                                objectOut.flush();
                                objectOut.close();
                                System.out.println("The Object  was succesfully written to a file");

                            } catch (Exception ex) {
                                ex.printStackTrace();
                            }

                        }

                    }
                }
                } catch(IOException ex) {
                ex.printStackTrace();
            }

        } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } finally {
            try {
                incoming.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }

        }
    }
}

Inside the run method (in Serveth class), I create a server socket and call exec.execute method.在 run 方法中(在 Serveth 类中),我创建了一个服务器套接字并调用了 exec.execute 方法。 Inside the run method (in ThreadedHandler class), the server is waiting for messages from the client (in this specific case, it creates a new .txt file but it is not important).在 run 方法内(在 ThreadedHandler 类中),服务器正在等待来自客户端的消息(在这种特定情况下,它会创建一个新的 .txt 文件,但这并不重要)。 Everything works but causes excessive use of the CPU and lag!!!一切正常,但会导致过度使用 CPU 和滞后!!!

InputSteam.available method returns a value instantly, telling you no bytes are available to be read, so this code runs a very "hot" spin loop: InputSteam.available方法立即返回一个值,告诉您没有可供读取的字节,因此此代码运行一个非常“热”的自旋循环:

            while(true) {
                if (is.available() > 0) {
                    ...
                }
            }

The available method is rarely useful and often gives confusing results (see for example inputstream.available() is 0 always ). available方法很少有用并且经常给出令人困惑的结果(参见例如inputstream.available() is 0 always )。 I would suggest you get rid of the if statement altogether:我建议你完全摆脱 if 语句:

            while(true) {
                String line = is.readUTF();

                textarea.appendText("\n" + "[" + new java.util.Date() + "] : " + line);
                ...
            }

There's no way for this your code to exit the loop normally.您的代码无法正常退出循环。 You may want to add a mechanism for the client to disconnect from the server.您可能希望为客户端添加一种与服务器断开连接的机制。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM