Как добавить список программ, работающих в данный момент на сервере сокетов Java? - PullRequest
0 голосов
/ 07 октября 2019

Я настроил сервер сокетов Java. Я хочу, чтобы клиент мог вводить «Запущенные процессы», что заставит сервер печатать все программы, запущенные на сервере. Код сервера выглядит следующим образом:

// Java implementation of Server side
// It contains two classes : Server and ClientHandler
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

// Server class
public class Server
{
public static void main(String[] args) throws IOException
{
 // server is listening on port 5056
    ServerSocket ss = new ServerSocket(5056);

    // running infinite loop for getting
    // client request
    while (true)
    {
        Socket s = null;

        try
        {
            // socket object to receive incoming client requests
            s = ss.accept();

            System.out.println("A new client is connected : " + s);

            // obtaining input and out streams
            DataInputStream dis = new DataInputStream(s.getInputStream());
            DataOutputStream dos = new DataOutputStream(s.getOutputStream());

            System.out.println("Assigning new thread for this client");

            // create a new thread object
            Thread t = new ClientHandler(s, dis, dos);

            // Invoking the start() method
            t.start();

        }
        catch (Exception e){
            s.close();
            e.printStackTrace();
        }
    }
}
 }



 // ClientHandler class
 class ClientHandler extends Thread
 {
DateFormat fordate = new SimpleDateFormat("yyyy/MM/dd");
DateFormat fortime = new SimpleDateFormat("hh:mm:ss");
final DataInputStream dis;
final DataOutputStream dos;
final Socket s;


 // Constructor
public ClientHandler(Socket s, DataInputStream dis, DataOutputStream dos)
{
    this.s = s;
    this.dis = dis;
    this.dos = dos;
}

@Override
public void run()
{
    RuntimeMXBean runtimeMX = ManagementFactory.getRuntimeMXBean();
    String received;
    String toreturn;
    long uptime;
    int socket = 0;
    while (true)
    {
        try {

            // Ask user what he wants
            dos.writeUTF("What do you want?[Date | Time | Uptime | Memory Use | Netstat | Current 
 Users]..\n"+
                    "Type Exit to terminate connection.");

            // receive the answer from client
            received = dis.readUTF();

            if(received.equals("Exit"))
            {
                System.out.println("Client " + this.s + " sends exit...");
                System.out.println("Closing this connection.");
                this.s.close();
                System.out.println("Connection closed");
                break;
            }
 // creating Date object
            Date date = new Date();

 // write on output stream based on the
 // answer from the client
            switch (received) {

                case "Date" :
                    toreturn = fordate.format(date);
                    dos.writeUTF(toreturn);
                    break;

                case "Time" :
                    toreturn = fortime.format(date);
                    dos.writeUTF(toreturn);
                    break;

                case "Uptime" :
                    uptime = runtimeMX.getUptime();
                    dos.writeUTF(uptime + " ms");
                    break;

                case "Memory Use" :
                    long memory = Runtime.getRuntime().totalMemory() - 
  Runtime.getRuntime().freeMemory();
                    dos.writeUTF(memory + " bytes");
                    break;

                case "Netstat" :
                    s.getInputStream();
                    dos.writeUTF( s+ " bytes");
                    break;

                case "Current Users" :
                    s.getInputStream();
                    dos.writeUTF( s+ " bytes");
                    break;

                default:
                    dos.writeUTF("Invalid input");
                    break;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    try
    {
  // closing resources
        this.dis.close();
        this.dos.close();

    }catch(IOException e){
        e.printStackTrace();
    }
}
}

Я ищу, чтобы добавить файл дела, который называется «Выполнение процессов». и если пользователь введет «Запущенные процессы», им будут показаны программы, запущенные в данный момент на сервере.

Ответы [ 2 ]

0 голосов
/ 07 октября 2019

см. Этот поток переполнения стека:

Как получить ввод с консоли сервера в клиент-серверной программе

, насколько я понимаю: я делалследующее:

когда вы запускаете программу сервера сокетов, консоль открыта.
чтение ввода в вашем основном цикле, как в классической консольной программе Java.
, но действие чтения блокирует основной цикл!
решение
1) сначала поместите ваш основной while (true) {... accept connection ...} в поток A
2) в основной части
запустите этот поток A ипостроить новое время () {}

не забудьте

import java.io.BufferedReader; 
import java.io.InputStreamReader; 


launch thread A

BufferedReader reader =   new BufferedReader(new 

InputStreamReader(System.in)); 

while (true) {

    String command = reader.readLine(); 
    if (command.compareTo("listprg")) {
       output programs list into the console
    }
}
0 голосов
/ 07 октября 2019

Вы должны использовать системный вызов для реализации этого, который я бы посоветовал избегать как можно больше в вашем коде из-за негативного влияния на переносимость кода:

           Process proc = Runtime.getRuntime().exec("<command calling task manager to list processes (OS-specific)>");

           InputStream is = proc.getInputStream();
           InputStreamReader isreader= new InputStreamReader(is);
           BufferedReader br = new BufferedReader(isreader);
           String line = null;
           while ((line = br.readLine()) != null)
           {
               System.out.println(line);
               //parse the line according to your needs 
           }
...