Я недавно начал изучать Android и в настоящее время изучаю основы Java на edx.org.Я создаю приложение чата (клиент / сервер).прямо сейчас все, что я хочу сделать, это отображать сообщение «пользователь подключен» всем пользователям, когда подключается любой новый пользователь.Я сохраняю поток вывода каждого пользователя в ArrayList.
1 - Это нормально?Должен ли я хранить полный сокет?
Во-вторых, сначала мой код на стороне сервера был следующим:
int serverPort = 11223;
List<PrintWriter> clientsOut = new ArrayList<PrintWriter>();
ServerSocket serverSocket = new ServerSocket(serverPort);
System.out.println("Listening...");
while(true) {
try (
Socket clientSocket = serverSocket.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
)
{
out.println("Hello from server");
clientsOut.add(out);
String ID = clientSocket.getInetAddress().getHostName();
for (PrintWriter client : clientsOut)
{
client.println("user(" + ID + ") : connected");
}
} catch (Exception e) {
System.out.print("ERROR : " + e.getMessage());
}
Я понял, что никто, кроме нового подключенного клиента, не получает сообщение оСам был подключен. Проблема была в том, что выходные потоки были закрыты, потому что они были объявлены в круглых скобках ( )
после блока try
, который автоматически закрывает их после блока try.
Я просто поместил кодпредставить в круглых скобках к фигурной скобке try
и все работает, но у меня все выходные потоки подключенных пользователей открыты.
2 - Это хорошо?Должен ли я повторно открыть поток ввода-вывода каждого подключенного клиента при циклическом массиве только для отправки сообщения?
Спасибо