首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >创建一个java服务器套接字,该套接字使用线程池等待来自客户端的消息

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

Stack Overflow用户
提问于 2020-03-25 22:06:29
回答 1查看 43关注 0票数 0
代码语言:javascript
代码运行次数:0
运行
复制
@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();
            }

        }
    }
}

在run方法(在Serveth类中)中,我创建了一个服务器套接字并调用exec.execute方法。在run方法中(在ThreadedHandler类中),服务器正在等待来自客户机的消息(在本例中,它创建了一个新的.txt文件,但这并不重要)。一切正常,但会导致CPU的过度使用和延迟!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-25 23:28:34

InputSteam.available方法立即返回一个值,告诉您没有字节可供读取,因此此代码运行一个非常“热”的自旋循环:

代码语言:javascript
代码运行次数:0
运行
复制
            while(true) {
                if (is.available() > 0) {
                    ...
                }
            }

available方法很少有用,而且经常会给出令人困惑的结果(例如,请参阅inputstream.available() is 0 always)。我建议你完全去掉if语句:

代码语言:javascript
代码运行次数:0
运行
复制
            while(true) {
                String line = is.readUTF();

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

你的代码没有办法正常退出循环。您可能需要添加一种机制,以便客户端断开与服务器的连接。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60850504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档