首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java执行ipconfig、Client-Server

Java执行ipconfig、Client-Server
EN

Stack Overflow用户
提问于 2014-04-27 13:27:55
回答 2查看 496关注 0票数 0

我正在制作一个程序,您可以在客户机中输入ifconfig(Linux)或ipconfig(Windows),然后将其发送到服务器,然后在那里执行shell。

它执行ok,在服务器中,我可以正确地看到ipconfig,但是我不知道如何将服务器的结果返回给客户机。

客户端:

代码语言:javascript
复制
public class ShellClient {  
public static void main(String[] args) throws IOException {
        String comand;
        Socket server =null;
        server = new Socket("localhost", 1234);
        while(true){
        System.out.println("Insert ipconfig(windows)/ ifconfig(Linux): ");
        @SuppressWarnings("resource")
        Scanner keyboard = new Scanner(System.in);

        comando = keyboard.next();

        try{
             System.out.println("Conecting...");
             DataOutputStream out = new DataOutputStream(new BufferedOutputStream(server.getOutputStream()));
             DataInputStream in = new DataInputStream(new BufferedInputStream(server.getInputStream()));

                out.writeUTF(comand);
                out.flush();
                String result = in.readUTF();
                System.out.println(result);


                if (comand == "0"){server.close();
                System.out.println("Finish. Thank You!");
                System.exit(0);}

        }catch(IOException ioe){
            System.err.println(ioe);
        }
      } 
    }
  }

服务器端:

代码语言:javascript
复制
public class ShellServer {

    public static void main(String[] args) throws IOException {
        ServerSocket socket = null;
        Socket client = null;
        String result;
        String comand ;
        String s = null;
        socket = new ServerSocket(1234);  

        System.out.println("The server keep working...");
        client = socket.accept();
        System.out.println("The client is connected");
        DataInputStream in = new DataInputStream(new BufferedInputStream(client.getInputStream()));
        DataOutputStream out = new DataOutputStream(new BufferedOutputStream(client.getOutputStream()));

            comand = in.readUTF();
            result = Shell.CheckCommand(comand);
            //out.writeUTF(result);
            //out.flush();

         // Ejcutamos el comando
            Process p = Runtime.getRuntime().exec(result);

            BufferedReader stdInput = new BufferedReader(new InputStreamReader(
                            p.getInputStream()));

            while ((s = stdInput.readLine()) != null) {
                System.out.println(s);
        }

            if(comand == "0"){client.close();
                         socket.close();}
            }
        }

提前谢谢各位!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-27 21:07:11

如果不想使用任何威胁,则每个请求都需要一个新连接,而且每次只能处理一个连接。

尝尝这个

客户端

代码语言:javascript
复制
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.Scanner;

public class ShellClient {

    public static void main(String[] args) throws IOException {
        String comando;

        while (true) {
            System.out.println("Introduce ipconfig(windows)/ ifconfig(Linux): ");
            @SuppressWarnings("resource")
            Scanner keyboard = new Scanner(System.in);

            comando = keyboard.next();

            System.out.println("Conectando...");
            // We need a new connection for every request
            Socket server = new Socket("localhost", 1234);
            DataOutputStream out = new DataOutputStream(new BufferedOutputStream(server.getOutputStream()));
            DataInputStream in = new DataInputStream(new BufferedInputStream(server.getInputStream()));

            out.writeUTF(comando);
            out.flush();
            // We close the output stream so the server knows we have finished the request
            server.shutdownOutput();
            if ("0".equals(comando)) {
                System.out.println("Finalizado. Gracias!");
                System.exit(0);
            }
            BufferedReader input = new BufferedReader(new InputStreamReader(server.getInputStream(), "UTF-8"));
            String line;
            while ((line = input.readLine()) != null) {
                System.out.println(line);
            }
            // See above - we need a new connection for every request
            server.close();
        }
    }
}

服务器

代码语言:javascript
复制
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class ShellServer {

    public static void main(String[] args) throws IOException {
        ServerSocket socket = null;
        Socket client = null;
        String resultado;
        String comando;
        String s = null;
        socket = new ServerSocket(1234);

        System.out.println("El servidor sigue funcionando...");
        while (true) {
            client = socket.accept();
            System.out.println("El cliente se ha conectado");
            DataInputStream in = new DataInputStream(new BufferedInputStream(client.getInputStream()));
            DataOutputStream out = new DataOutputStream(new BufferedOutputStream(client.getOutputStream()));

            comando = in.readUTF();
            if ("0".equals(comando)) {
                System.exit(0);
            }
            resultado = Shell.CheckCommand(comando);

            // Ejcutamos el comando
            Process p = Runtime.getRuntime().exec(comando);

            BufferedReader stdInput = new BufferedReader(new InputStreamReader(
                    p.getInputStream()));

            while ((s = stdInput.readLine()) != null) {
                out.write(s.getBytes("UTF-8"));
                out.write('\n');
                // we want to see each line as fast as we can
                out.flush();
                System.out.println(s);
            }
            client.close();            
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2014-04-27 19:42:11

服务器:

当您调用进程并从输入流读取时,将收到的内容发送到out流。现在,客户端完全没有接收到任何信息,所以它没有什么可显示的。我会使用BufferedReader (InputStreamReader)从客户端读取数据。

代码语言:javascript
复制
PrintWriter out = new PrintWriter(server.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(server.getInputStream()));

out.println(comand);

String result;
while ((result = in.readLine()) != null )
{
    System.out.println(result);
}

Client:只从服务器流接收它正在发送的内容,例如:

代码语言:javascript
复制
PrintWriter out = new PrintWriter(server.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(server.getInputStream()));
out.println(comand);

String result;
while ((result = in.readLine()) != null )
{
    System.out.println(result);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23324009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档