在有多个请求时保持Java套接字有效

问题描述 投票:0回答:1

这是我的服务器应用程序

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);
            }

        }
    }

问题是,如果客户端没有关闭连接,则服务器应用无法从另一个客户端接收到另一个请求

并且如果我确实从服务器端关闭了连接,它将无法与客户端的应用程序一起使用。

要害在于此服务器或客户端应用程序无法关闭连接

我想要的是:有什么办法可以使服务器继续接收来自客户端的某些请求,即使另一个请求尚未完成。因此我的服务器应用程序可以在不关闭任何连接的情况下同时接收多个请求。

请帮助我,

nb:客户的应用来自我的第三方供应商,所以我必须遵守他们的规则

java serversocket
1个回答
0
投票

我通过创建一个可运行的线程解决了这个问题。这样可以使服务器保持活动状态,直到您关闭服务器以及客户端是否断开连接为止。试试这个...

public static void main(String[] args) throws IOException, ISOException {
        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");
                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();

它保持活动状态,直到我关闭服务器或应用程序并且还处理多个连接/请求。

© www.soinside.com 2019 - 2024. All rights reserved.