我找到了一个聊天服务器的代码,我有一个简短的问题。这是关于以下摘录:
clientOutputStreams.add(作家)
显然这个字符串数组应该发送给聊天客户端,但是我不知道数组是如何更新的 - 即如何从特定的聊天客户端发送到服务器的字符串在数组中累积然后发送回到所有聊天客户端。你呢?非常感谢你的帮助。
import java.io.*;
import java.net.*;
import java.util.*;
public class VerySimpleChatServer {
ArrayList clientOutputStreams;
public class ClientHandler implements Runnable {
BufferedReader reader;
Socket sock;
public ClientHandler(Socket clientSOcket) {
try {
sock = clientSOcket;
InputStreamReader isReader = new InputStreamReader(sock.getInputStream());
reader = new BufferedReader(isReader);
} catch (Exception ex) { ex.printStackTrace(); }
}
public void run() {
String message;
try {
while ((message = reader.readLine()) != null) {
System.out.println("read " + message);
tellEveryone(message);
}
} catch (Exception ex) { ex.printStackTrace(); }
}
}
public static void main(String[] args) {
new VerySimpleChatServer().go();
}
public void go() {
clientOutputStreams = new ArrayList();
try {
ServerSocket serverSock = new ServerSocket(5000);
while(true) {
Socket clientSocket = serverSock.accept();
PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());
clientOutputStreams.add(writer);
Thread t = new Thread(new ClientHandler(clientSocket));
t.start();
System.out.println("got a connection");
}
} catch (Exception ex) { ex.printStackTrace(); }
}
public void tellEveryone(String message) {
Iterator it = clientOutputStreams.iterator();
while (it.hasNext()) {
try {
PrintWriter writer = (PrintWriter) it.next();
writer.println(message);
writer.flush();
} catch (Exception ex) { ex.printStackTrace(); }
}
}
}
答案 0 :(得分:0)
显然,这个字符串数组应该发送给聊天客户端,
这不是一个字符串数组。这是一系列PrintWriters,您可以从以下几行中看到:
PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());
clientOutputStreams.add(writer);
但我不了解数组如何更新 - 即如何从特定聊天客户端发送到服务器的字符串在数组中累积,然后发送回所有聊天客户端。你呢?
看起来字符串是通过函数
发送给聊天客户端的public void tellEveryone(String message)
此函数循环遍历每个PrintWriters,并将传递的字符串message
写入每个PrintWriter
。我猜这是每个客户看到消息的方式。
答案 1 :(得分:0)
clientOutputStreams
不是字符串数组。它是Writer的列表,用于向所有连接的客户端发送消息。当客户端向服务器发送消息时,服务器将消息(方法:tellEveryone
)发送到每个客户端(列表中的每个写入者)。 ClientHandler
类用于读取来自客户端的所有传入消息。希望能帮助您更好地理解代码。