无法通过套接字发送命令

时间:2014-04-21 13:41:39

标签: java sockets

我是Java的新手,现在我正在尝试创建一个套接字程序。我创建了一个服务器和一个客户端,但它们似乎没有用。现在我发布代码。

这是服务器:

import java.net.*;
import java.io.*;

public class TCPCmdServer 
{
public int port;
public ServerSocket server;

TCPCmdServer (int port)
{
    this.port = port;
    if(!createServer())
        System.out.println("Cannot start the server");
    else System.out.println("Server running on port " + port);
}

public boolean createServer ()
{
    try
    {
        server = new ServerSocket(port);
    }
    catch (IOException e)
    {
        e.printStackTrace();
        return false;
    }

    return true;
}

public static void main (String [] args)
{
    TCPCmdServer tcp = new TCPCmdServer(5000);

    boolean flag = true;
    while (flag)
    {
        try
        {
            Socket socket = tcp.server.accept();
            System.out.println("A client has connected");
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            out.write("Welcome on the server... type the commands you like, type END to close me\n");
            out.flush();

            String cmd = in.readLine();
            System.out.println("Recieved: " + cmd);
            if (cmd.equals("END"))
            {
                System.out.println("Shutting down server...");
                socket.close();
                in.close();
                out.close();
                flag = false;
            }
            else
            {
                Process p = Runtime.getRuntime().exec(cmd);
                BufferedReader pRead = new BufferedReader(new InputStreamReader(p.getInputStream()));

                String line;
                while ((line = pRead.readLine()) != null)
                {
                    System.out.println(line);
                    out.write(line + "\n");
                    out.flush();
                }
            }
        }
        catch (IOException ex)
        {
            ex.printStackTrace();
        }
    }
}
}

这是客户:

import java.net.*;
import java.io.*;

public class TCPCmdClient 
{
public Socket socket;
public int port;
public String ip;

TCPCmdClient (String ip, int port)
{
    this.ip = ip;
    this.port = port;
    if (!createSocket())
        System.out.println("Cannot connect to the server. IP: " + ip + " PORT: " + port);
    else System.out.println("Connected to " + ip + ":" + port);
}

public boolean createSocket ()
{
    try
    {
        socket = new Socket(ip, port);
    }
    catch (IOException e) 
    {
        e.printStackTrace(); 
        return false;
    }

    return true;
}

public static void main (String [] args)
{
    TCPCmdClient client = new TCPCmdClient("127.0.0.1", 5000);

    try
    {
        BufferedReader sysRead = new BufferedReader(new InputStreamReader(System.in));
        BufferedReader in = new BufferedReader(new InputStreamReader(client.socket.getInputStream()));
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(client.socket.getOutputStream()));

        String response = in.readLine();
        System.out.println("Server: " + response);

        boolean flag = true;
        while (flag)
        {
            System.out.println("Type a command... type END to close the server");
            String cmd = sysRead.readLine();
            out.write(cmd + "\n");
            out.flush();
            if (cmd.equals("END"))
            {
                client.socket.close();
                sysRead.close();
                in.close();
                out.close();
                flag = false;
            } else
            {
                String outputline;
                while ((outputline = in.readLine()) != null)
                    System.out.println(outputline);
            }
        }
    }
    catch (IOException ex)
    {
        ex.printStackTrace();
    }
}
}

[旧] 我相信问题在于输入和输出流,但我无法理解为什么它们不起作用。

预期的行为如下:客户端连接到服务器,然后服务器发送响应。客户端要求用户插入MS-DOS命令(或“END”命令),然后将命令发送到服务器。服务器在运行它的计算机上执行命令(如果命令为END,则关闭连接)。然后,服务器将命令的结果发送给客户端,客户端将其显示给用户。 [/旧]

现在唯一的问题是我必须在我想执行新命令时关闭并重新打开客户端

2 个答案:

答案 0 :(得分:1)

在您的服务器代码中,您将为从客户端收到的每个命令创建一个新套接字。这就是为什么每次要向服务器发送命令时都必须打开一个新客户端。要解决此问题,首先需要删除服务器代码中的while(flag)循环。然后,您可以使用以下内容建立与客户端的连接,并在它们之间发送和接收命令和输出。

        Socket socket = tcp.server.accept();
        System.out.println("A client has connected");
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        out.write("Welcome on the server... type the commands you like, type END to close me\n");
        out.flush();

        try {
            while(!(cmd = in.readLine()).equals("END")) {
                System.out.println("Recieved: " + cmd);

                Process p = Runtime.getRuntime().exec(cmd);
                BufferedReader pRead = new BufferedReader(new InputStreamReader(p.getInputStream()));

                String line;
                while ((line = pRead.readLine()) != null) {
                    System.out.println(line);
                    out.write(line + "\n");
                    out.flush();
                }
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            System.out.println("Shutting down server...");
            socket.close();
            in.close();
            out.close();
        }

答案 1 :(得分:0)

在TCPCmdServer.java中,尝试更改

out.write(“欢迎使用服务器...输入您喜欢的命令,输入END以关闭我”);

out.write(“欢迎使用服务器...输入您喜欢的命令,输入END以关闭我\ n”);

了out.flush();

另外,更改

out.write(buffer.toString());

out.write(buffer.toString()+“\ n”);

了out.flush();

在TCPCmdClient.java 中 变化

out.write(CMD);

out.write(cmd +“\ n”);

了out.flush();

response = in.readLine();

System.out.println(“服务器:”+响应);