Java SimpleClient& SimpleServer发送命令很奇怪

时间:2018-02-19 14:51:00

标签: java distributed distributed-apps

您好Stackover流程世界,

以为我发送了一些东西,因为我还没有在一段时间内分享一个问题。我对最奇怪的,可能是最简单的问题感到非常难过,我在网上找到了各种不同的回答。

基本上,我有一个看起来如此的SimpleServer:

// A generic server that listens on a port and connects to any clients it
// finds. Made to extend Thread, so that an application can have multiple
// server threads servicing several ports, if necessary.

public class SimpleServer
{
    protected int portNo = 8082; // Port to listen to for clients
    protected ServerSocket clientConnect;

    public SimpleServer(int port) throws IllegalArgumentException {
        if (port <= 0)
            throw new IllegalArgumentException(
                    "Bad port number given to SimpleServer constructor.");

        // Try making a ServerSocket to the given port
        System.out.println("Connecting server socket to port...");
        try { clientConnect = new ServerSocket(port); }
        catch (IOException e) {
            System.out.println("Failed to connect to port " + port);
            System.exit(1);
        }

        // Made the connection, so set the local port number
        this.portNo = port;
    }

    public static void main(String argv[]) {
        int port = 8088;
        if (argv.length > 0) {
            int tmp = port;
            try {
                tmp = Integer.parseInt(argv[0]);
            }
            catch (NumberFormatException e) {}

            port = tmp;
        }

        SimpleServer server = new SimpleServer(port);
        System.out.println("SimpleServer running on port " + port + "...");
        server.listen();
    }

    public void listen() {
        // Listen to port for client connection requests.
        try {
            System.out.println("Waiting for clients...");
            while (true) {
                Socket clientReq = clientConnect.accept();
                System.out.println("Got a client...");
                serviceClient(clientReq);
            }
        }
        catch (IOException e) {
            System.out.println("IO exception while listening for clients.");
            System.exit(1);
        }
    }

    public void serviceClient(Socket clientConn) {
        SimpleCmdInputStream inStream = null;
        DataOutputStream outStream = null;
        try {
            inStream = new SimpleCmdInputStream(clientConn.getInputStream());
            outStream = new DataOutputStream(clientConn.getOutputStream());
        }
        catch (IOException e) {
            System.out.println("SimpleServer: Error getting I/O streams.");
        }

        SimpleCmd cmd = null;
        System.out.println("Attempting to read commands...");
        while (cmd == null || !(cmd instanceof DoneCmd)) {
            try { cmd = inStream.readCommand(); }
            catch (IOException e) {
                System.out.println("SimpleServer: " + e);
                System.exit(1);
            }

            if (cmd != null) {
                String result = cmd.Do();
                try { outStream.writeBytes(result); }
                catch (IOException e) {
                    System.out.println("SimpleServer: " + e);
                    System.exit(1);
                }
            }
        }
    }

    public synchronized void end() {
        System.out.println("Shutting down SimpleServer running on port "
                + portNo);
    }
}

然后我有一个看起来如此的SimpleClient:

public class SimpleClient
{
    // Our socket connection to the server
    protected Socket serverConn;

    // The input command stream from the server
    protected SimpleCmdInputStream inStream;

    public SimpleClient(String host, int port)
            throws IllegalArgumentException {
        try {
            System.out.println("Trying to connect to " + host + " " + port);
            serverConn = new Socket(host, port);
        }
        catch (UnknownHostException e) {
            throw new IllegalArgumentException("Bad host name given.");
        }
        catch (IOException e) {
            System.out.println("SimpleClient: " + e);
            System.exit(1);
        }

        System.out.println("Made server connection.");
    }

    public static void main(String argv[]) {
        if (argv.length < 2) {
            System.out.println("Usage: java SimpleClient [host] [port]");
            System.exit(1);
        }

        System.out.println("Getting here");

        String host = argv[0];
        int port=0;
        try {
            port = Integer.parseInt(argv[1]);
        }
        catch (NumberFormatException e) {}

        SimpleClient client = new SimpleClient(host, port);
        System.out.println("Commands are about to send?");

        client.sendCommands();
    }

    public void sendCommands() {
        try {
            OutputStreamWriter wout =
                    new OutputStreamWriter(serverConn.getOutputStream());
            BufferedReader rin = new BufferedReader(
                    new InputStreamReader(serverConn.getInputStream()));

            wout.write("what is a man is a good man\n");
            wout.flush();
            rin.readLine();

            System.out.println("getting here yo");
            // Send a GET command...
            wout.write("GET goodies ");
            // ...and receive the results
            String result = rin.readLine();
            System.out.println(result + "I am here");
            System.out.println("Server says: \"" + result + "\"");

            // Now try a POST command
            wout.write("POST goodies ");
            // ...and receive the results
            result = rin.readLine();
            System.out.println("Server says: \"" + result + "\"");

            // All done, tell the server so
            wout.write("DONE ");
            result = rin.readLine();
            System.out.println("Server says: \"" + result + "\"");
        }
        catch (IOException e) {
            System.out.println("SimpleClient: " + e);
            System.exit(1);
        }
    }

    public synchronized void end() {
        System.out.println("Closing down SimpleClient...");
        try { serverConn.close(); }
        catch (IOException e) {
            System.out.println("SimpleClient: " + e);
            System.exit(1);
        }
    }
}

连接到目标VM,地址:&#39; 127.0.0.1:64335&#39;,transport:&#39; socket&#39; 到这里来 尝试连接到localhost 8088 制作服务器连接。 命令即将发送?

输出 连接到目标VM,地址:&#39; 127.0.0.1:64335&#39;,transport:&#39; socket&#39; 到这里来 尝试连接到localhost 8088 制作服务器连接。 命令即将发送?

出于某种原因,客户端冻结的命令即将发送,并且出于某种原因,并没有真正地写出&#39;将这些命令发送到服务器时到套接字。

任何线索,我错过了什么,完全不在这里?

谢谢! 阿尔萨兰

1 个答案:

答案 0 :(得分:0)

想出来,似乎有很多关于所有类型的流,作家,读者等的戏剧性。似乎我的样本以某种方式错误地使用了这些流的类型,因为明显区别于理解是流用于实现输出或输入流的所有内容,主要用于读取或写入二进制数据。

读者&amp;编写者是用于读取和写入文本的流上方的一层。读者和编写者使用字符编码从字符转换二进制数据。

基本上现在在我的SimpleClient中执行此操作

public class SimpleClient
{
    // Our socket connection to the server
    protected Socket serverConn;

    // The input command stream from the server
    protected SimpleCmdInputStream inStream;

    public SimpleClient(String host, int port)
            throws IllegalArgumentException {
        try {
            System.out.println("Trying to connect to " + host + " " + port);
            serverConn = new Socket(host, port);
        }
        catch (UnknownHostException e) {
            throw new IllegalArgumentException("Bad host name given.");
        }
        catch (IOException e) {
            System.out.println("SimpleClient: " + e);
            System.exit(1);
        }

        System.out.println("Made server connection.");
    }

    public static void main(String argv[]) {
        if (argv.length < 2) {
            System.out.println("Usage: java SimpleClient [host] [port]");
            System.exit(1);
        }

        System.out.println("Getting here");

        String host = argv[0];
        int port=0;
        try {
            port = Integer.parseInt(argv[1]);
        }
        catch (NumberFormatException e) {}

        SimpleClient client = new SimpleClient(host, port);
        client.sendCommands();
    }

    public void sendCommands() {
        try {
            DataOutputStream wout =
                    new DataOutputStream(serverConn.getOutputStream());
            DataInputStream rin = new DataInputStream(serverConn.getInputStream());

            // Send a GET command...
            wout.writeChars("GET goodies ");
            // ...and receive the results
            String result = rin.readLine();
            System.out.println("Server says: \"" + result + "\"");

            // Now try a POST command
            wout.writeChars("POST goodies ");
            // ...and receive the results
            result = rin.readLine();
            System.out.println("Server says: \"" + result + "\"");

            // All done, tell the server so
            wout.writeChars("DONE ");
            result = rin.readLine();
            System.out.println("Server says: \"" + result + "\"");
        }
        catch (IOException e) {
            System.out.println("SimpleClient: " + e);
            System.exit(1);
        }
    }

    public synchronized void end() {
        System.out.println("Closing down SimpleClient...");
        try { serverConn.close(); }
        catch (IOException e) {
            System.out.println("SimpleClient: " + e);
            System.exit(1);
        }
    }
}

注意输出和输入流的新类型,而不是编写器。

谢谢Arsalan!