我正在用java编写一个基本的聊天服务器,但是我遇到了一些问题。当有人创建客户端或服务器时,我希望他们能够输入命令行参数,该参数用作他们发送的任何消息的前缀。这个论点也应该是可选的。我有一定程度的工作,由于某种原因,当我发送消息它发送前缀两次,也不是可选的。任何帮助表示赞赏,干杯!
public class ReadWriteThread extends Thread {
private BufferedReader input;
private PrintWriter output;
private String prefix;
public ReadWriteThread(InputStream input, OutputStream output, String prefix) {
this.input = new BufferedReader(new InputStreamReader(input));
this.output = new PrintWriter(output, true);
this.prefix = prefix;
}
public void run() {
try {
String line;
while ((line = input.readLine()) != null) {
output.println(prefix + " " + line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class Server {
public static void main(String[] args) {
try {
int port = Integer.parseInt(args[0]);
System.out.println("HELLO " + args[1]);
String prefix = args[1];
ServerSocket serverSocket = new ServerSocket(port);
System.err.println("Waiting for a client to connnect");
Socket socket = serverSocket.accept();
System.err.println("Accepted connection on port " + port);
new ReadWriteThread(System.in, socket.getOutputStream(), prefix).start();
new ReadWriteThread(socket.getInputStream(), System.out, prefix).start();
} catch (Exception e) {
e.printStackTrace();
System.err.println("\nUsage: java Server <port>");
}
}
}
public class Client {
public static void main(String[] args) {
Socket socket = null;
try {
int port = Integer.parseInt(args[0]);
String prefix = args[2];
socket = new Socket(args[1], port);
System.err.println("Connected to " + args[1] + " on port " + port);
new ReadWriteThread(System.in, socket.getOutputStream(), prefix).start();
new ReadWriteThread(socket.getInputStream(), System.out, prefix).start();
} catch (Exception e) {
e.printStackTrace();
System.err.println("\nUsage: java Client <port>");
}
}
}
输入
启动服务器java Server 7777 OPTIONALPREFIX
输入
启动客户端java Client 7777 localhost
服务器上的当前输出
Waiting for a client to connnect
Accepted connection on port 7777
-->-->hello
-->-->whats up
答案 0 :(得分:1)
客户端和服务器都在其邮件前加前缀,您可能已将-->
设置为两者的前缀。
所以客户端可能会发送
--> hello
然后服务器接收它并在将其登录到控制台之前预先设置自己的前缀
--> --> hello
为什么前缀不是可选的?因为你总是试图阅读它,所以你永远不会检查传递给程序的参数数量。
String prefix = args[1];
要访问args[1]
,首先需要检查args
是否包含两个参数。