如何通过 NetManager 使用 Telnet 设置服务器-客户端通信 class
How to setup server-client communication using Telnet via a NetManager class
我们正在做一个学校项目,我们必须使用 Telnet(是的,我知道,我们不应该使用它等等,但是我们必须)服务器和客户端之间的通信。我们有两个 classes 设置,一个服务器和一个客户端,这是一个线程。我们调用我们的客户端 'NetManager',它可以发送和接收消息。
但是,我们还有其他 classes 需要向服务器发送消息,并处理服务器 returns 的输出。我们想通过 NetManager 来做到这一点,而不是为每个 class 单独设置一个新的线程和套接字。
但是,我们不知道该怎么做。理想情况下,我们希望在我们的 NetManager class 中有一个 while(working) { }
来读取服务器发送的行,但我们还需要在 while 循环内发送消息。消息需要变化,因此简单地将它们放入 while 循环是行不通的。有没有办法进行服务器-客户端通信,其中多个 classes 使用 NetManager class 从服务器发送和接收消息?
我在下面包含了我们的 NetManager class 的精简版本以供参考。这个版本只读取服务器发送的行,它还没有发送消息(这可以通过 out.println();
.
public class NetManager extends Thread {
private BufferedReader in;
private BufferedReader stdIn;
private PrintWriter out;
private String line;
@Override
public void run() {
boolean working = true;
try {
Socket sock = new Socket("localhost", 7789);
out = new PrintWriter(sock.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
while (working) {
try {
line = in.readLine();
System.out.println(line);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
这是我针对最佳情况制定的快速方案:
虽然我认为您的设计很好,但我也认为它对于您尝试做的事情来说可能过于复杂。如果多个 class 将使用同一个 NetManager 实例,那么您将不得不实施某种锁定 and/or 排队,因此一次只有一个 class 尝试访问 NetManager .然后您还必须想出一些方法来确保 NetManager 收到的任何响应都返回给适当的调用者。
说了这么多,我会让任何使用 NetManager 的 classes 在构造函数中接受它的一个实例。然后它会保存对该对象的引用并在必要时使用它。
我们正在做一个学校项目,我们必须使用 Telnet(是的,我知道,我们不应该使用它等等,但是我们必须)服务器和客户端之间的通信。我们有两个 classes 设置,一个服务器和一个客户端,这是一个线程。我们调用我们的客户端 'NetManager',它可以发送和接收消息。
但是,我们还有其他 classes 需要向服务器发送消息,并处理服务器 returns 的输出。我们想通过 NetManager 来做到这一点,而不是为每个 class 单独设置一个新的线程和套接字。
但是,我们不知道该怎么做。理想情况下,我们希望在我们的 NetManager class 中有一个 while(working) { }
来读取服务器发送的行,但我们还需要在 while 循环内发送消息。消息需要变化,因此简单地将它们放入 while 循环是行不通的。有没有办法进行服务器-客户端通信,其中多个 classes 使用 NetManager class 从服务器发送和接收消息?
我在下面包含了我们的 NetManager class 的精简版本以供参考。这个版本只读取服务器发送的行,它还没有发送消息(这可以通过 out.println();
.
public class NetManager extends Thread {
private BufferedReader in;
private BufferedReader stdIn;
private PrintWriter out;
private String line;
@Override
public void run() {
boolean working = true;
try {
Socket sock = new Socket("localhost", 7789);
out = new PrintWriter(sock.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
while (working) {
try {
line = in.readLine();
System.out.println(line);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
这是我针对最佳情况制定的快速方案:
虽然我认为您的设计很好,但我也认为它对于您尝试做的事情来说可能过于复杂。如果多个 class 将使用同一个 NetManager 实例,那么您将不得不实施某种锁定 and/or 排队,因此一次只有一个 class 尝试访问 NetManager .然后您还必须想出一些方法来确保 NetManager 收到的任何响应都返回给适当的调用者。
说了这么多,我会让任何使用 NetManager 的 classes 在构造函数中接受它的一个实例。然后它会保存对该对象的引用并在必要时使用它。