簡體   English   中英

Java socket server不能同時接收很多數據,如何讓java socket server同時接收數據?

[英]Java socket server cannot receive many data at the same time, how to make java socket server accept data at the same time?

我的 java 套接字服務器不能在一個客戶端中同時接受多個數據

Thread t1 = new Thread(() -> {
            ServerSocket ss = null;
            try {
                ss = new ServerSocket(9000);
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                while(true) {
                    System.out.println("Waiting Transaction ..");
                    Socket clientSocket = ss.accept();
                    InetAddress inet = clientSocket.getInetAddress();
                    try{
                        while (clientSocket.getInputStream().available() == 0) {
                            Thread.sleep(100L);
                        }
                        byte[] data;
                        int bytes;
                        data = new byte[clientSocket.getInputStream().available()];
                        bytes = clientSocket.getInputStream().read(data,0,data.length);
                        String dataDB = new String(data, 0, bytes, "UTF-8");
                        System.out.println("received data\n time : "+ new Date() +"length data : " + dataDB.length());
                        System.out.println(dataDB);
                        String dataFrom = getFromServer(dataDB);
                        clientSocket.getOutputStream().write(dataFrom.getBytes("UTF-8"));
                    }catch (BindException be){
                        be.printStackTrace();
                    }catch(Exception e){
                        e.printStackTrace();
                    }finally {
                        clientSocket.close();
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    ss.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
        t1.start();

我嘗試使用線程但它不起作用,此代碼只接受第一個數據,否則另一個數據將被拒絕。 服務器如何同時接受許多數據?

讓我告訴你我是怎么做到的,同時玩弄 sockets,所以我創建了一個 SocketServer class

public class Server {
    public static final Integer port = 9000;
    private final ServerSocket server;
    private final ExecutorService service = Executors.newFixedThreadPool(10);
    private final AtomicInteger idGenerator = new AtomicInteger(0);

    public Server() throws IOException {
        this.server = new ServerSocket(port);
    }

    public void start() {
        try {
            while (true) {
                Worker worker = new Worker(idGenerator.incrementAndGet(), server.accept());
                service.execute(worker);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

現在,每次客戶端加入時,我都會創建一個工作線程並將其提交給ExecutorService (Executor 服務具有線程池並通過為其分配一個線程來運行傳遞的工作線程,您可以閱讀它)。

工人 class 看起來像這樣

public class Worker implements Runnable {
    private final Socket client;
    private final Logger log = LoggerFactory.getLogger(this.getClass());

    public Worker(Integer id, Socket client) {
        this.id = id;   //Ignore it, it was for logging purpose, how many joined
        this.client = client;
    }

    @Override
    public void run() {
        listenClientMessages();

        closeConnection();
    }

    private void listenClientMessages() {
        final int MAX_INPUT = 1024;
        int read;
        try (InputStream is = client.getInputStream()) {
            byte[] buf = new byte[MAX_INPUT];
            while ((read = is.read(buf)) != -1) {
                String line = new String(buf, 0, read);
                log.info(line);

                if (line.equals("bye")) break;
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    private void closeConnection() {
        try{
            client.close();
        }catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

所以,你可以看到,我正在讀取字節,而看

            byte[] buf = new byte[MAX_INPUT];
            while ((read = is.read(buf)) != -1) {
                String line = new String(buf, 0, read);
                log.info(line);

                if (line.equals("bye")) break;
            }

這就是為什么當處理 MAX_INPUT 或更少時,它會等待客戶端發送下一個輸入。

讓我知道它是否有幫助。

編輯:正如@user207421 在評論中所評論的那樣, closeConnection function 是多余的,因為 inputstream 在listenClientMessages function 中使用上面的try-wit-resources 塊關閉,因此不需要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM