亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當多個請求到來時保持 java 套接字處于活動狀態

當多個請求到來時保持 java 套接字處于活動狀態

子衿沉夜 2023-08-23 15:13:00
這是我的服務器應用程序public static void main(String[] args) throws IOException, ISOException {        ServerSocket serverSocket = null;        Socket socket = null;        try {            serverSocket = new ServerSocket(PORT);            System.out.println("Server siap menerima koneksi pada port ["+PORT+"]");        } catch (IOException e) {            e.printStackTrace();         }        while (true) {            try {                socket = serverSocket.accept();                InputStreamReader inStreamReader = new InputStreamReader(socket.getInputStream());                PrintWriter sendMsg = new PrintWriter(socket.getOutputStream());                int data;                StringBuffer sb = new StringBuffer();                int counter = 0;                int lengthOfMsg = 4;                while((data = inStreamReader.read()) != 0) {                    counter++;                    sb.append((char) data);                    if (counter == 4) lengthOfMsg += Integer.valueOf(sb.toString());                    if (lengthOfMsg == sb.toString().length()) {                        System.out.println("Rec. Msg ["+sb.toString()+"] len ["+sb.toString().length()+"]");                        processingMsg(sb.toString(), sendMsg);                     }                }            } catch (IOException e) {               System.out.println("I/O error: " + e);            }        }    }問題是如果客戶端不關閉連接,服務器應用程序將無法接收來自另一個客戶端的另一個請求如果我確實從服務器端關閉連接,它將無法與客戶端的應用程序一起使用。重點是在此服務器或客戶端應用程序中無法關閉連接我想要的是:有什么辦法讓服務器可以繼續接收來自客戶端的一些請求,即使另一個請求尚未完成。所以我的服務器應用程序可以同時接收多個請求,而無需關閉任何連接。請幫我,注意:客戶的應用程序來自我的第三方供應商,所以我必須遵守他們的規則
查看完整描述

1 回答

?
慕田峪4524236

TA貢獻1875條經驗 獲得超5個贊

我通過創建一個可運行的線程解決了這個問題。這將使您的服務器保持活動狀態,直到您關閉它以及客戶端是否斷開連接。嘗試這個...


public static void main(String[] args) throws IOException, ISOException {

        final ServerSocket serverSocket = null;

        Socket socket = null;


    new Thread(new Runnable(){

        @Override

        public void run(){


            try {

        serverSocket = new ServerSocket(PORT);

        System.out.println("Server siap menerima koneksi pada port ["+PORT+"]");

    } catch (IOException e) {

        e.printStackTrace(); 

    }


    while (true) {

        try {

            socket = serverSocket.accept();


            InputStreamReader inStreamReader = new InputStreamReader(socket.getInputStream());

            PrintWriter sendMsg = new PrintWriter(socket.getOutputStream());


            int data;

            StringBuffer sb = new StringBuffer();

            int counter = 0;


            int lengthOfMsg = 4;

            while((data = inStreamReader.read()) != 0) {

                counter++;

                sb.append((char) data);

                if (counter == 4) lengthOfMsg += Integer.valueOf(sb.toString());


                if (lengthOfMsg == sb.toString().length()) {

                    System.out.println("Rec. Msg ["+sb.toString()+"] len ["+sb.toString().length()+"]");

                    processingMsg(sb.toString(), sendMsg); 

                }

            }

        } catch (IOException e) {

           System.out.println("I/O error: " + e);

        }


    }



        }

    }).start();



}

如果這不適合你,你可以參考我的代碼。


String ip = "";


        try(final DatagramSocket socket = new DatagramSocket()){

            socket.connect(InetAddress.getByName("8.8.8.8"), 10002);

            ip = socket.getLocalAddress().getHostAddress();

        }

        catch (Exception e){

         e.printStackTrace();

        }

        txt.append("SERVER STARTED\n");

        txt.append("Server IP Address: " + ip + "\n\n");


new Thread(new Runnable() {

    @Override

    public void run() {


        try {

            while (true) {

                Server.this.txt.append("Waiting for file...\n");

                final ServerSocket server = new ServerSocket(8998);

                server.close();

                server = new ServerSocket(8998);

                Server.this.socket = server.accept();


                final Date date = new Date();

                final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");

                final String curDate = dateFormat.format(date);



                final BufferedReader br = new BufferedReader(new InputStreamReader(Server.this.socket.getInputStream()));

                final PrintWriter pw = new PrintWriter(new FileWriter(Server."C:\\Test\\File-" + curDate + ".csv"));

                try {


                    String line;


                    for (line = br.readLine(); line != null; line = br.readLine()) {


                        wordsarray = line.split("\t");

                        pw.println(line);



                    }

                    pw.flush();

                    pw.close();



                }

                catch (IOException ex) {

                    System.out.printf("Can't write to file. ", ex);

                }

                finally {

                    if (Server.this.socket != null) {

                        br.close();

                        pw.close();

                        server.close();

                        Server.this.txt.append("\nAutomatically Saved to " + "C:\\PDT\\DataScan\\PurchaseOrder-" + curDate + ".csv" + "\n\n");


                       System.out.printf("Success! ");


                    }

                }

            }

        }

        catch (Exception e) {

            System.out.printf("Something's Wrong! \n" + e);

            JOptionPane.showMessageDialog(Server.this, e + "\n\nThe server needs to restart.", "Something's Wrong!", 1);

            dispose();

            main(null);


        }

    }

}).start();

它一直保持活動狀態,直到我關閉服務器或應用程序,并且還處理多個連接/請求。


查看完整回答
反對 回復 2023-08-23
  • 1 回答
  • 0 關注
  • 172 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號