为什么来自用户的输入没有出现在 Java 控制台中,而是出现在输出文本中?

时间:2021-03-10 20:05:51

标签: java sockets intellij-idea

我有一个通过 TCP/IP 运行的客户端/服务器协议。没有代码:

String fileName = "output.txt";
final boolean append = true, autoflush = true;
PrintStream printStream = new PrintStream(new FileOutputStream(fileName,append));
...
...
System.setOut(printStream);

我可以在服务器端得到我想要的输出。但是,当我添加代码(从上面)时,只有终端的一部分显示输出,其余部分保存在文本文件中。我很高兴它保存在文本文件中,但我希望它也输出到终端以进行演示。

如何更改代码以实现将其输出到终端,同时将终端保存在 output.txt 文件中?

如果您想测试,下面是服务器和客户端代码。

Server.java

package TCPSocket;
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class TCPServer{
    private ServerSocket server;

    /**
     * The TCPServer constructor initiate the socket
     * @param ipAddress
     * @param port
     * @throws Exception
     */
    public TCPServer(String ipAddress, int port) throws Exception {
        if (ipAddress != null && !ipAddress.isEmpty())
            this.server = new ServerSocket(port, 1, InetAddress.getByName(ipAddress));
        else
            this.server = new ServerSocket(0, 1, InetAddress.getLocalHost());
    }

    /**
     * The listen method listen to incoming client's datagrams and requests
     * @throws Exception
     */


    private void listen() throws Exception {
        // listen to incoming client's requests via the ServerSocket
        //add your code here
        String data = null;
        Socket client = this.server.accept();
        String clientAddress = client.getInetAddress().getHostAddress();
        System.out.println("\r\nNew client connection from " + clientAddress);

        String serverIP = "192.168.56.1"; // local IP address
        int port = 7077;

        String fileName = "output.txt";
        final boolean append = true, autoflush = true;
        PrintStream printStream = new PrintStream(new FileOutputStream(fileName,append));


        // print received datagrams from client
        BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));

        while ( (data = in.readLine()) != null && !data.equals("QUIT")) {


            try {
                if (data.startsWith("HELLO")) {
                    System.out.println("\r\nC: " + data);
                    System.out.println("\r\nS: 250 " + data.toLowerCase() + ", pleased to meet you");
                } else if (data.startsWith("MAIL FROM: ")) {
                    System.out.println("\r\nC: " + data);
                    System.out.println("\r\nS: 250 ok");
                } else if (data.startsWith("RCPT TO: ")) {
                    System.out.println("\r\nC: " + data);
                    System.out.println("\r\nS: 250 ok");
                } else if (data.equals("DATA")) {
                    System.out.println("\r\nC: " + data);
                    System.out.println("\r\nS: 354 End data with <CR><LF>.<CR><LF>");
                } else if (data.equals(".")) {
                    System.out.println("\r\nC: " + data);
                    System.out.println("\r\nS: 250 ok Message accepted for delivery");
                } else
                    System.out.println("\r\nC: " + data);

                client.sendUrgentData(1);
                System.setOut(printStream);


            } catch (IOException e) {
                System.out.println(e);
            }

        }

                System.out.println("\r\nC: " + data);
                System.out.println("\r\nS: 221 " + serverIP + " closing connection");
    }





    public InetAddress getSocketAddress() {
        return this.server.getInetAddress();
    }

    public int getPort() {
        return this.server.getLocalPort();
    }


    public static void main(String[] args) throws Exception {
        // set the server address (IP) and port number
        //add your code here
        String serverIP = "192.168.56.1"; // local IP address
        int port = 7077;

        if (args.length > 0) {
            serverIP = args[0];
            port = Integer.parseInt(args[1]);
        }
        // call the constructor and pass the IP and port
        //add your code here
        TCPServer server = new TCPServer(serverIP, port);
        System.out.println("\r\nRunning Server: " +
                "Host=" + server.getSocketAddress().getHostAddress() +
                " Port=" + server.getPort());
        System.out.println("220 gov.uk");
        server.listen();
    }

}

客户端.java

package TCPSocket;
import java.io.*;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;

public class TCPClient{
    private Socket tcpSocket;
    private InetAddress serverAddress;
    private int serverPort;
    private Scanner scanner;


    /**
     * @param serverAddress
     * @param serverPort
     * @throws Exception
     */
    private TCPClient(InetAddress serverAddress, int serverPort) throws Exception {
        this.serverAddress = serverAddress;
        this.serverPort = serverPort;

        //Initiate the connection with the server using Socket.
        //For this, creates a stream socket and connects it to the specified port number at the specified IP address.
        //add your code here
        this.tcpSocket = new Socket(this.serverAddress, this.serverPort);
        this.scanner = new Scanner(System.in);
    }

    /**
     * The start method connect to the server and datagrams
     * @throws IOException
     */
    private void start() throws IOException {
        String input;
        //create a new PrintWriter from an existing OutputStream (i.e., tcpSocket).
        //This convenience constructor creates the necessary intermediateOutputStreamWriter, which will convert characters into bytes using the default character encoding
        while (true) {
            input = scanner.nextLine();
            PrintWriter output = new PrintWriter(this.tcpSocket.getOutputStream(), true);
            output.println(input);
            output.flush();

            try{
                if(input.equals("QUIT")){
                    tcpSocket.close();
                    break;
                }
            }catch (IOException e) {
                System.out.println(e);
            }
        }
    }


    public static void main(String[] args) throws Exception {
        // set the server address (IP) and port number
        //add your code here
        InetAddress serverIP = InetAddress.getByName("192.168.56.1"); // local IP address
        int port = 7077;

        if (args.length > 0) {
            serverIP = InetAddress.getByName(args[0]);
            port = Integer.parseInt(args[1]);
        }

        // call the constructor and pass the IP and port
        //add your code here
        TCPClient client = new TCPClient(serverIP, port);
        System.out.println("\r\n Connected to Server: " + client.tcpSocket.getInetAddress());
        client.start();
    }
}

1 个答案:

答案 0 :(得分:0)

我设法修复它以便它在终端和 Output.txt 中显示的方法是使用 @sorifiend 建议的 printStream 方法。

通过在 if 语句之前移动 printStream.println("\r\nC: " + data); 将客户端消息首先保存在文本文件中

private void receiveMessage() throws Exception {
    // listen to incoming client's requests via the ServerSocket
    //add your code here
    String data = null;
    Socket client = this.server.accept();
    String clientAddress = client.getInetAddress().getHostAddress();
    System.out.println("\r\nNew client connection from " + clientAddress);

    String serverIP = "192.168.56.1"; // local IP address
    int port = 8088;

    PrintStream originalSysOut=System.out;

    String fileName = "output.txt";
    final boolean append = true, autoflush = true;
    PrintStream printStream = new PrintStream(new FileOutputStream(fileName,append));

    // print received datagrams from client
    BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
    while ( (data = in.readLine()) != null && !data.equals("QUIT")) {

        try {
            printStream.println("\r\nC: " + data);
            if (data.startsWith("HELLO")) {
                System.out.println("\r\nC: " + data);
                System.out.println("\r\nS: 250 " + data.toLowerCase() + ", pleased to meet you");
                printStream.println("\r\nS: 250 " + data.toLowerCase() + ", pleased to meet you");
            } else if (data.startsWith("MAIL FROM: ")) {
                System.out.println("\r\nC: " + data);
                System.out.println("\r\nS: 250 ok");
                printStream.println("\r\nS: 250 ok");
            } else if (data.startsWith("RCPT TO: ")) {
                System.out.println("\r\nC: " + data);
                System.out.println("\r\nS: 250 ok");
                printStream.println("\r\nS: 250 ok");
            } else if (data.equals("DATA")) {
                System.out.println("\r\nC: " + data);
                System.out.println("\r\nS: 354 End data with <CR><LF>.<CR><LF>");
                printStream.println("\r\nS: 354 End data with <CR><LF>.<CR><LF>");
            } else if (data.equals(".")) {
                System.out.println("\r\nC: " + data);
                System.out.println("\r\nS: 250 ok Message accepted for delivery");
                printStream.println("\r\nS: 250 ok Message accepted for delivery");
            } else
                System.out.println("\r\nC: " + data);

            client.sendUrgentData(1);

        } catch (IOException e) {
            System.out.println(e);
        }
    }
    System.setOut(printStream);
    System.out.println("\r\nC: " + data);
    System.out.println("\r\nS: 221 " + serverIP + " closing connection");

}
相关问题