我有一个通过 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();
}
}
答案 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");
}