0

嗨 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,地址:'127.0.0.1:64335',传输:'socket' 到达这里尝试连接到 localhost 8088 建立服务器连接。命令即将发送?

输出连接到目标虚拟机,地址:'127.0.0.1:64335',传输:'socket' 到达这里尝试连接到本地主机 8088 建立服务器连接。命令即将发送?

由于某种原因,客户端冻结在“命令即将发送”,并且由于某种原因,在将这些命令发送到服务器时并没有真正“写入”到套接字。

任何线索,我是否遗漏了什么,完全不合时宜?

谢谢!阿尔萨兰

4

1 回答 1

0

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

Readers & writers 是流之上的一个层,用于读取和写入文本。读取器和写入器使用字符编码将二进制数据从字符转换为字符。

基本上现在在我的 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);
        }
    }
}

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

谢谢阿萨兰!

于 2018-02-19T16:39:24.790 回答