我有以下情况。
我有一个服务器类。我有一个客户课程。我有一个 MultiServerThread 类。
当客户端连接到服务器时,服务器会创建一个新的 MultiServerThread,它正在处理来自客户端的输入。这样我就可以拥有多个客户。到目前为止,一切都很好。连接通过 TCP。
一个简短的例子:
服务器类:
...
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = null;
boolean listening = true;
try {
serverSocket = new ServerSocket(9999);
} catch (IOException e) {
System.err.println("Could not listen on port: " + serverSocket.getLocalPort() + ".");
System.exit(-1);
}
while (listening) {
new MultiServerThread(serverSocket.accept()).start();
}
serverSocket.close();
}
...
客户端类:
...
public static void main(String[] args) throws IOException {
socket = new Socket(hostname, port);
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
stdIn = new BufferedReader(new InputStreamReader(System.in));
String fromServer;
String fromUser;
while ((fromServer = in.readLine()) != null) {
System.out.println("Server: " + fromServer);
if (fromServer.equals("Bye.")) {
break;
}
fromUser = stdIn.readLine();
if (fromUser != null) {
System.out.println("Client: " + fromUser);
out.println(fromUser);
}
}
out.close();
in.close();
stdIn.close();
socket.close();
}
...
MultiServerThread 类:
...
public MultiServerThread(Socket socket) throws SocketException {
super("MultiServerThread");
this.socket = socket;
// dSocket = new DatagramSocket(4445);
}
public void run() {
try {
PrintWriter myOutput = new PrintWriter(socket.getOutputStream(), true);
BufferedReader myInput = new BufferedReader(new InputStreamReader(socket.getInputStream()));
myOutput.println("Connected to client and ready to accept commands.");
while ((clientInput = myInput.readLine()) != null) {
//A SIMPLE LOGIN A USER
if (clientInput.contains("!login")) {
//save some string given by client into loggedUser
String loggedUser = clientInput.substring(7);
}
myOutput.close();
myInput.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
我需要的是:
例如,当用户名是“Bob”时,我需要实现来自服务器的通知。如果用户名是“Bob”,服务器应该通知客户端“Bob 又来了!”。在我的项目/作业中,这应该使用 Java 中的数据报来完成。
因此,如果客户端输入是“!login bob”,则应将带有消息(“Bob 又来了!”)的数据报包发送到客户端。
问题:我应该把数据报请求的代码放在哪里?我可以将数据报包请求放入 MultiServerThread 或 Client 中吗?
在 MultiServerThread 中会更容易,因为它已经处理了!登录。这里:
if (clientInput.contains("!login")) {
//save some string given by client into loggedUser
String loggedUser = clientInput.substring(7);
//send datagram request to Server???
}
但这有悖于联网原则吗?