Чат на Java (Серверная часть)
Всем доброго времени суток. На связи Алексей Гулынин. В данной статье я бы хотел написать серверную часть простого чата на Java. Все комментарии будут даны в коде.
Скачать уже готовый проект полностью можно по ссылке.
Проект серверной части будет состоять из 3 файлов:
- Server.java — класс, который описывает логику работы сервера.
- ClientHandler.java — класс, в котором обрабатывается подключение клиента к серверу.
- Main.java.
В классе Main будет просто создаваться экземпляр нашего сервера:
package server;
public class Main {
public static void main(String[] args) {
Server server = new Server();
}
}
Класс Server:
package server;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
public class Server {
// порт, который будет прослушивать наш сервер
static final int PORT = 3443;
// список клиентов, которые будут подключаться к серверу
private ArrayList<ClientHandler> clients = new ArrayList<ClientHandler>();
public Server() {
// сокет клиента, это некий поток, который будет подключаться к серверу
// по адресу и порту
Socket clientSocket = null;
// серверный сокет
ServerSocket serverSocket = null;
try {
// создаём серверный сокет на определенном порту
serverSocket = new ServerSocket(PORT);
System.out.println("Сервер запущен!");
// запускаем бесконечный цикл
while (true) {
// таким образом ждём подключений от сервера
clientSocket = serverSocket.accept();
// создаём обработчик клиента, который подключился к серверу
// this - это наш сервер
ClientHandler client = new ClientHandler(clientSocket, this);
clients.add(client);
// каждое подключение клиента обрабатываем в новом потоке
new Thread(client).start();
}
}
catch (IOException ex) {
ex.printStackTrace();
}
finally {
try {
// закрываем подключение
clientSocket.close();
System.out.println("Сервер остановлен");
serverSocket.close();
}
catch (IOException ex) {
ex.printStackTrace();
}
}
}
// отправляем сообщение всем клиентам
public void sendMessageToAllClients(String msg) {
for (ClientHandler o : clients) {
o.sendMsg(msg);
}
}
// удаляем клиента из коллекции при выходе из чата
public void removeClient(ClientHandler client) {
clients.remove(client);
}
}
Класс ClientHandler:
package server;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Scanner;
// реализуем интерфейс Runnable, который позволяет работать с потоками
public class ClientHandler implements Runnable {
// экземпляр нашего сервера
private Server server;
// исходящее сообщение
private PrintWriter outMessage;
// входящее собщение
private Scanner inMessage;
private static final String HOST = "localhost";
private static final int PORT = 3443;
// клиентский сокет
private Socket clientSocket = null;
// количество клиента в чате, статичное поле
private static int clients_count = 0;
// конструктор, который принимает клиентский сокет и сервер
public ClientHandler(Socket socket, Server server) {
try {
clients_count++;
this.server = server;
this.clientSocket = socket;
this.outMessage = new PrintWriter(socket.getOutputStream());
this.inMessage = new Scanner(socket.getInputStream());
} catch (IOException ex) {
ex.printStackTrace();
}
}
// Переопределяем метод run(), который вызывается когда
// мы вызываем new Thread(client).start();
@Override
public void run() {
try {
while (true) {
// сервер отправляет сообщение
server.sendMessageToAllClients("Новый участник вошёл в чат!");
server.sendMessageToAllClients("Клиентов в чате = " + clients_count);
break;
}
while (true) {
// Если от клиента пришло сообщение
if (inMessage.hasNext()) {
String clientMessage = inMessage.nextLine();
// если клиент отправляет данное сообщение, то цикл прерывается и
// клиент выходит из чата
if (clientMessage.equalsIgnoreCase("##session##end##")) {
break;
}
// выводим в консоль сообщение (для теста)
System.out.println(clientMessage);
// отправляем данное сообщение всем клиентам
server.sendMessageToAllClients(clientMessage);
}
// останавливаем выполнение потока на 100 мс
Thread.sleep(100);
}
}
catch (InterruptedException ex) {
ex.printStackTrace();
}
finally {
this.close();
}
}
// отправляем сообщение
public void sendMsg(String msg) {
try {
outMessage.println(msg);
outMessage.flush();
} catch (Exception ex) {
ex.printStackTrace();
}
}
// клиент выходит из чата
public void close() {
// удаляем клиента из списка
server.removeClient(this);
clients_count--;
server.sendMessageToAllClients("Клиентов в чате = " + clients_count);
}
}
В данной статье мы создали серверную часть простого чата на Java.
На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.




