Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java客户端/服务器-通过套接字连接发送多个字符串_Java_Sockets_Tcp - Fatal编程技术网

Java客户端/服务器-通过套接字连接发送多个字符串

Java客户端/服务器-通过套接字连接发送多个字符串,java,sockets,tcp,Java,Sockets,Tcp,我有一个程序Client,它向服务器发送字符串LISTALL。 之后,服务器需要使用ps-e命令检查系统(Linux)上所有正在运行的进程,然后将结果返回给客户端。 显然,结果是由多个字符串组成的,那么如何让客户端接收并存储它们呢 现在,这是我从客户那里得到的: 发送到服务器的消息:LISTALL 从服务器收到的消息:null 并从服务器: 服务器已启动并正在侦听。。 从客户端收到的消息:LISTALL 然后它按预期列出了来自ps-e命令的结果 我的代码: 服务器: public class S

我有一个程序
Client
,它向服务器发送字符串
LISTALL
。 之后,服务器需要使用
ps-e
命令检查系统(Linux)上所有正在运行的进程,然后将结果返回给客户端。 显然,结果是由多个字符串组成的,那么如何让客户端接收并存储它们呢

现在,这是我从客户那里得到的:

发送到服务器的消息:LISTALL
从服务器收到的消息:null

并从服务器:

服务器已启动并正在侦听。。
从客户端收到的消息:LISTALL

然后它按预期列出了来自
ps-e
命令的结果

我的代码:

服务器:

public class Server
{

    private static Socket socket;

    public static void main(String[] args)
    {
        try
        {

            int port = 25000;
            ServerSocket serverSocket = new ServerSocket(port);
            System.out.println("Server Started and listening to the port 25000");

            //Server is running always. This is done using this while(true) loop
            while(true)
            {
                //Reading the message from the client
                socket = serverSocket.accept();
                InputStream is = socket.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                String list = br.readLine();
                System.out.println("Message received from client is "+list);


                //Sending the response back to the client.
                OutputStream os = socket.getOutputStream();
                OutputStreamWriter osw = new OutputStreamWriter(os);
                BufferedWriter bw = new BufferedWriter(osw);

                String returnMessage;
                try
                {
                    ProcessBuilder build = new ProcessBuilder("ps", "-e");
                    Process proc = build.start();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
                while (reader.readLine() != null) {
                    returnMessage=reader.readLine();
                          bw.write(returnMessage);

                    proc.waitFor();

                    System.out.println("Message sent to the client is "+returnMessage);
                    bw.flush();}
                }
                catch(NumberFormatException e)
                {
                    //Input was not a number. Sending proper message back to client.
                    returnMessage = "Please send a proper number\n";
                }


            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                socket.close();
            }
            catch(Exception e){}
        }
    }
}
public class Client
{

    private static Socket socket;

    public static void main(String args[])
    {
        try
        {
            String host = "localhost";
            int port = 25000;
            InetAddress address = InetAddress.getByName(host);
            socket = new Socket(address, port);

            //Send the message to the server
            OutputStream os = socket.getOutputStream();
            OutputStreamWriter osw = new OutputStreamWriter(os);
            BufferedWriter bw = new BufferedWriter(osw);

            String list = "LISTALL";

            String sendMessage = list + "\n";
            bw.write(sendMessage);
            bw.flush();
            System.out.println("Message sent to the server : "+sendMessage);

            //Get the return message from the server
            InputStream is = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            while (br.readLine() != null) {         
            String message = br.readLine();
            System.out.println("Message received from the server : " +message);
        }}
        catch (Exception exception)
        {
            exception.printStackTrace();
        }
        finally
        {
            //Closing the socket
            try
            {
                socket.close();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }
    }
}
客户端:

public class Server
{

    private static Socket socket;

    public static void main(String[] args)
    {
        try
        {

            int port = 25000;
            ServerSocket serverSocket = new ServerSocket(port);
            System.out.println("Server Started and listening to the port 25000");

            //Server is running always. This is done using this while(true) loop
            while(true)
            {
                //Reading the message from the client
                socket = serverSocket.accept();
                InputStream is = socket.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                String list = br.readLine();
                System.out.println("Message received from client is "+list);


                //Sending the response back to the client.
                OutputStream os = socket.getOutputStream();
                OutputStreamWriter osw = new OutputStreamWriter(os);
                BufferedWriter bw = new BufferedWriter(osw);

                String returnMessage;
                try
                {
                    ProcessBuilder build = new ProcessBuilder("ps", "-e");
                    Process proc = build.start();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
                while (reader.readLine() != null) {
                    returnMessage=reader.readLine();
                          bw.write(returnMessage);

                    proc.waitFor();

                    System.out.println("Message sent to the client is "+returnMessage);
                    bw.flush();}
                }
                catch(NumberFormatException e)
                {
                    //Input was not a number. Sending proper message back to client.
                    returnMessage = "Please send a proper number\n";
                }


            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                socket.close();
            }
            catch(Exception e){}
        }
    }
}
public class Client
{

    private static Socket socket;

    public static void main(String args[])
    {
        try
        {
            String host = "localhost";
            int port = 25000;
            InetAddress address = InetAddress.getByName(host);
            socket = new Socket(address, port);

            //Send the message to the server
            OutputStream os = socket.getOutputStream();
            OutputStreamWriter osw = new OutputStreamWriter(os);
            BufferedWriter bw = new BufferedWriter(osw);

            String list = "LISTALL";

            String sendMessage = list + "\n";
            bw.write(sendMessage);
            bw.flush();
            System.out.println("Message sent to the server : "+sendMessage);

            //Get the return message from the server
            InputStream is = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            while (br.readLine() != null) {         
            String message = br.readLine();
            System.out.println("Message received from the server : " +message);
        }}
        catch (Exception exception)
        {
            exception.printStackTrace();
        }
        finally
        {
            //Closing the socket
            try
            {
                socket.close();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }
    }
}

您的读取循环不正确。它们应为一般形式:

String line;
while ((line = reader.readLine()) != null) {
    // Do something with `line`
}

目前,您正在丢弃每一个奇数行,如果有奇数行,则打印空值。

出于某种原因,我仍然从客户端获得相同的输出。也就是说,它不是输出从服务器接收的
消息:…
,然后是正确的输出,而是显示从服务器接收的
消息:null
。仅当您没有执行此代码时。有了这个代码,这是不可能的,正如你自己所看到的。注意,你在两个地方犯了这个错误。所以我必须在写循环中进行相同的修复?你必须在犯相同错误的地方进行相同的修复。我没有看到任何写循环。您还需要关闭套接字。对不起,我指的是客户端的读取循环。我修复了客户端和服务器的读取循环,但它仍然给了我相同的结果。