为了账号安全,请及时绑定邮箱和手机立即绑定

当多个请求到来时保持 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 关注
  • 97 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信