Чат на сокетах Java


Готов новый проект – чат Java. В нем посредством классов ServerSocket и Socket реализован обмен текстовыми сообщениями и файлами. Программа состоит из двух приложений - сервер и клиент. Первоначально запускается сервер, ждет подключения (запуска) клиента. После запуска клиента, они автоматически соединяются, и появляется возможность обмениваться по сокетам информацией. Работа происходит на одном компьютере (localhost, 127.0.0.1).



Как сервер, так и клиент могут отправлять друг другу тексты и файлы любого формата с помощь интерфейса Swing. История переписки хранится в базе данных типа SQLIte на сервере. Клиент и сервер могут вывести историю переписки за указанный период времени (год-месяц-число-час-минута). Клиент может быть только один.

В общем, все просто. Запускаете сервер, он ждет подключение клиента. После запуска клиента он автоматически подключается к серверу – все показывается на обоих экранах. После подключения вводите текст и нажимаете «Enter» - он отправляется собеседнику.

Если компоненты не в таком порядке, как на скрине, то можно порастягивать окно и потом в коде поставить нужные значения.

Можно отправлять файлы – кнопка «Отправить файл» - он появится рядом с файлом программы. Чтобы показать переписку, необходимо выбрать дату и время начала (часы и минуты), а также дату и время конца.

База данных SQlite состоит из одной таблицы, Чтобы посмотреть, что внутри файла baza001.sqlite, можно использовать DB Browser for SQLite - это чтобы было проще смотреть внутренности, я часто использую.

Код

Получилось два проекта: IntelliJ IDEA сервер, в Eclipse – клиент. Но вообще проекты универсальные и откроются в любой распространенной IDE для java.

Каждый код в своем файле. Server.java и Client.java. Есть небольшие комментарии, в методах используется обработка ошибок. Код написан правильно, но не идеально – так, как будто писал студент, а не реальный программист.

Вот, например, метод для записи сообщения в базу данных:

 
private static void InsertMail(String message, int tip) throws SQLException {
        Connection dbConnection = null;
        Statement statement = null;
        long unixTime = System.currentTimeMillis() / 1000L;
        if (tip!=1) {
            String insertSQL = "INSERT INTO mails (id, mail, 'datetim') values (NULL , '" + message +  "', '" + unixTime + "')";
            try {
                dbConnection = getDBConnection();
                statement = dbConnection.createStatement();

                // выполнить SQL запрос
                statement.execute(insertSQL);
                System.out.println("Успешно!");
            } catch (SQLException e) {
                System.out.println(e.getMessage());
            } finally {
                if (statement != null) {
                    statement.close();
                }
                if (dbConnection != null) {
                    dbConnection.close();
                }
            }
        }
    }
В этом коде вообще говоря лучше бы использовать класс PreparedStatement и его метод executeUpdate(), но и код выше вполне рабочий и отлично подойдет для учебного проекта.

Также необязательно использовать NULL для id таблицу у которой настроен автоинкремент на это поле. Но это не ошибка, а, скажем так, мелочь о которой студент не обязательно знает.

Если вам нужна готовая программа на java или консультация по программированию на этом языке – пишите. Все услуги платные.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, программы, java, чат, сокеты




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Урок 31. Функции JavaScript: параметры по умолчанию
Подключение к sql-серверу и асинхронность
Урок 45. Область видимости переменной C#