Добавить в сетевой чат запись локальной истории в текстовый файл на клиенте java
Хочу написать простой чат на Java сокетах без многопоточности.
1. Не очень понимаю как происходит соединение сокетом с другим компьютером, если передачей сокету ip, то как делать соединение по умолчанию при динамическом ip.
2. Какие классы ввода вывода использовать.
Поищите лучше библиотеку для работы с сокетами, я когда-то находил, но было давненько, поэтому точно не скажу название. Их не много, так что не заблудитесь)
Всё ещё ищете ответ? Посмотрите другие вопросы с метками java или задайте свой вопрос.
Похожие
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Site design / logo © 2022 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2022.5.11.42086
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Сетевой чат на Java. Финальный проект курса GeekBrains Java Core.
License: MIT License
TensorFlow
An Open Source Machine Learning Framework for Everyone
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
Запуск веб-приложения
Выполнив http://localhost:8080/javaweb/app , мы обратимся к нашему сервлету, т.к. обращение /app ранее мы "замапили" (то есть сопоставили) на сервлет App. Существует более быстрый способ проверить, как работает приложение. И в этом нам снова помогает система сборки. В build script нашего Gradle проекта мы можем добавить в секцию plugins новый плагин "Gretty": id "org.gretty" version "2.3.1" И теперь мы можем выполнять gradle task для запуска нашего приложения: gradle appRun
server
A server is a program made to process requests and deliver data to clients.
Создание веб-приложения
Работы с современным Java-приложением уже трудно представить без использования систем автоматической сборки проектов. Одними из самых популярных систем являются Maven и Gradle. Воспользуемся для данного обзора Gradle. Установка Gradle описана на официальном сайте. Для создания нового приложения нам понадобится встроенный в Gradle плагин: "Build Init Plugin". Для создания Java-приложения необходимо выполнить следующую команду: gradle init --type java-application
После создания проекта нам понадобится отредактировать файл build.gradle. Это так называемый Build Script (подробнее см. документацию Gradle: "Writing Build Scripts"). В данном файле описывается то, каким образом необходимо собирать проект и другие аспекты работы с Java проектом. В блоке plugins описывается, какие "Gradle плагины" необходимо использовать для текущего Gradle проекта. Плагины расширяют возможности нашего проекта. Например, по умолчанию исопльзуется плагин "java". Данный плагин всегда используется, если нам нужна поддержка Java. Но вот плагин "application" нам не нужен, т.к. в его описании указано, что он служит для создания "executable JVM application", т.е. выполняемых JVM приложений. Нам же нужно создание Web приложения в виде WAR архива. И если мы в документации Gradle поищем слово WAR, найдём и "War Plugin". Следовательно, укажем следующие плагины: Так же в "War Plugin Default Settings" сказано, что каталог со всем содержимым веб-приложения должен быть "src/main/webapp", там должен лежать тот самый каталог WEB-INF, в котором должен лежать web.xml. Создадим такой файл. Заполнять же его будем несколько позднее, т.к. мы ещё не имеем достаточно информации для этого. В блоке "dependencies" указываем зависимости нашего проекта, то есть те библиотеки/фрэймворки, без которых не может работать наше приложение. В данном случае, мы пишем веб-приложение, а значит мы не можем работать без Servlet API: providedCompile говорит о том, что зависимость не нужно включать в наш WAR архив веб-приложения: она нужна только для компиляции. А при выполнении данная зависимость будет предоставлена кем-то другим (то есть веб-сервером). Ну и оставляем в build script информацию о том, какой репозиторий зависимостей мы хотим использовать — из него будут скачаны все указанные dependencies: Всё остальное из файла build script'а убираем. Теперь отредактируем класс src\main\java\App.java. Сделаем из него сервлет. В спецификации Servlet API в главе "CHAPTER 2. The Servlet Interface" сказано, что Servlet Interface имеет базовую реализацию HttpServlet, которой должно быть достаточно в большинстве случаев и разработчикам достаточно унаследоваться от неё. А в главе "2.1.1 HTTP Specific Request Handling Methods" указаны основные методы, которые обрабатывают входящие запросы. Таким образом, перепишем класс App.java: Итак, у нас вроде всё готово. Осталось правильно написать дескриптор развёртывания. Из схемы скопируем в web.xml следующий текст: А также путь к схеме, который указан в ней: http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd Теперь посмотрим пример того, как должен выглядеть web.xml в спецификации Servlet API. Данный пример указан в главе "14.5.1 A Basic Example". Совместим то, что указано в схеме с примером, который указан в спецификации. Получим следующее: Как видно, мы использовали схему и schemaLocation, которые были указаны ранее. А описание самих элементов взяли из примера из главы 14.5.1. Если мы сделали всё правильно, выполним gradle задачу gradle war без ошибок:
Connectors
— На входе у нас есть Connectors (т.е. коннекторы), которые принимают входящие запросы от клиентов. HTTP коннектор в Tomcat реализован при помощи компонента "Coyote". Коннекторы принимают данные от клиента и передают их дальше в Tomcat Engine. Servlet Container — Tomcat Engine в свою очередь обрабатывает полученный от клиента request при помощи компонента "Catalina", который является сервлет контейнером. Подробнее см. документацию Tomcat : "Architecture Overview". Сущестуют и другие веб-серверы, поддерживающие спецификацию Servlet API. Например, "Jetty" или "Undertow". Их архитектура похожа, поэтому понимая принцип работы с одним сервлет контейнером, можно перестроиться на работу с другим.
Servlet API
Django
The Web framework for perfectionists with deadlines.
3 ответа 3
клиентская часть: сокет для подключения к серверу:
аналогично серверу, берем InputStream и OutputStream у сокета:
и с их помощью читаем и пишем данные
посланная в OutputStream строка придет в InputStream к пославшему и всем остальным клиентам, подключенным к серверу.
Вы сначала определитесь с архитектурой чата:
- peer-to-peer - то есть когда комп. соединяется с компом напрямую без посредника, например так организован BitTorrent
- client-server, когда есть централизованный сервер и все общение идет через него, пример Skype, ICQ
- Смешанная система - пример Yahoo Messenger
вообще то скайп еще до недавна был практически чистый p2p. И только с приходом Майкрософта он постепенно централизируется, но все равно он сейчас смешанный и ближе к p2p.
Highly active question. Earn 10 reputation (not counting the association bonus) in order to answer this question. The reputation requirement helps protect this question from spam and non-answer activity.
Visualization
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
Recommend Projects
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
java-network-chat's Introduction
Финальный проект курса GeekBrains Java Core.
- IDE: Idea
- Управление проектом: Maven
- Управление версиями: github
- Пользователь может зарегистрироваться, но если есть пользователь с таким именем, регистрация не удастся.
- Войдите, используя свое имя пользователя и пароль. После входа в систему вы сможете войти на сервер.
- На стороне сервера сервер может отслеживать всю информацию.
- В окне сервера сервер можете запустить или закрыть сервер вручную.
Laravel
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
Аннотации
Как мы видели, аннотации — это удобно. И не мы одни так подумали. Поэтому в спецификации Servlet API начиная с версии 3.0 появилась глава "CHAPTER 8 Annotations and pluggability", которая указывает, что сервлет контейнеры должны поддерживать возможность указывать то, что раньше указывалось в Deployment Descriptor'е через аннотации. Таким образом, web.xml можно совсем удалить из проекта, а над классом сервлета указывать аннотацию @WebServlet и указывать, на какой путь "мапить" сервлет. Тут вроде всё понятно. Но что делать, если мы к проекту подключили Spring, который требует более сложных настроек? Тут всё чуть-чуть сложнее. Во-первых, в документации Spring сказано, что для настройки Spring без web.xml нужно использовать свой класс, который будет реализовывать WebApplicationInitializer. Подробнее см. главу "1.1. DispatcherServlet". Получается, что это класс Spring'а. Как же тогда используется Servlet API тут? На самом деле, в Servlet API 3.0 был добавлен ServletContainerInitializer. Используя особый механизм в Java (называется SPI), Spring указывает свой инициализатор сервлет контейнера, который называется SpringServletContainerInitializer . В свою очередь, он уже ищет реализации WebApplicationInitializer и вызывает нужные методы и выполняет нужные настройки. Подробнее см. "How servlet container finds WebApplicationInitializer implementations". Вышеуказанные настройки можно выполнить так: Теперь при помощи "Java-based configuration" укажем, какой пакет сканировать + включим аннотации: А сам SpringController был перенесён в ru.javarush.javaweb.controllers , чтобы при сканировании конфигурация не находила сама себя, а искала только контроллеры.
Предварительные условия: введение потоков в программирование сокетов
В приведенной выше статье был создан простой сервер даты и времени, который обрабатывал несколько пользовательских запросов одновременно с использованием потоков. Объясняет основные концепции многопоточности в сетевом программировании. Те же самые концепции можно использовать с очень небольшими изменениями, чтобы расширить вышеприведенную идею и создать приложение для чата, подобное Facebook Messenger, WhatsApp и т. Д.
В следующей статье рассматривается реализация такого приложения с подробным объяснением, ограничениями и способами их решения.
В этом наборе мы обсудим программирование на стороне сервера (Server.java), а программирование на стороне клиента (Client.java) обсуждается в наборе 2 .
Программирование на стороне сервера (Server.java)
// Java-реализация на стороне сервера
// Содержит два класса: Server и ClientHandler
// Сохранить файл как Server.java
public class Server
// Вектор для хранения активных клиентов
static Vector ar = new Vector<>();
// счетчик для клиентов
static int i = 0 ;
public static void main(String[] args) throws IOException
// сервер прослушивает порт 1234
ServerSocket ss = new ServerSocket( 1234 );
// запуск бесконечного цикла для получения
// Принимаем входящий запрос
System.out.println( "New client request received : " + s);
// получить входной и выходной потоки
DataInputStream dis = new DataInputStream(s.getInputStream());
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
System.out.println( "Creating a new handler for this client. " );
// Создать новый объект-обработчик для обработки этого запроса.
ClientHandler mtch = new ClientHandler(s, "client " + i, dis, dos);
// Создать новую тему с этим объектом.
Thread t = new Thread(mtch);
System.out.println( "Adding this client to active client list" );
// добавить этого клиента в список активных клиентов
// увеличиваем i для нового клиента.
// я используется только для именования и может быть заменен
// по любой схеме именования
class ClientHandler implements Runnable
Scanner scn = new Scanner(System.in);
private String name;
final DataInputStream dis;
final DataOutputStream dos;
public ClientHandler(Socket s, String name,
DataInputStream dis, DataOutputStream dos)
this .name = name;
this .isloggedin= true ;
public void run()
if (received.equals( "logout" ))
this .isloggedin= false ;
String MsgToSend = st.nextToken();
String recipient = st.nextToken();
// поиск получателя в списке подключенных устройств.
// ar - это векторное хранилище клиента активных пользователей
for (ClientHandler mc : Server.ar)
// если получатель найден, напишите на его
if (mc.name.equals(recipient) && mc.isloggedin== true )
mc.dos.writeUTF( this .name+ " : " +MsgToSend);
> catch (IOException e)
> catch (IOException e)
Ограничения:
Хотя вышеуказанная реализация сервера справляется с большинством сценариев, в подходе, определенном выше, есть некоторые недостатки.
- Одно из четких наблюдений вышеперечисленных программ заключается в том, что если число клиентов увеличится, время поиска увеличится в классе обработчиков. Чтобы избежать этого увеличения, можно использовать две карты хешей. Один с именем в качестве ключа и индексом в активном списке в качестве значения. Другой с индексом в качестве ключа и связанным объектом-обработчиком в качестве значения. Таким образом, мы можем быстро найти две хеш-карты для поиска подходящего получателя. Читателям оставлено реализовать этот хак для повышения эффективности реализации.
- Следует также отметить, что эта реализация не работает, когда пользователи отключаются от сервера . Было бы выброшено много ошибок, потому что в этой реализации отключение не обрабатывается. Это может быть легко реализовано, как в предыдущих основных примерах TCP. Читателю также оставлено реализовать эту функцию в программе.
В клиентской программе (Client.java) есть огромная разница по сравнению с предыдущими статьями, поэтому она будет обсуждаться во втором наборе этой серии.
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Теперь о том как я это попытался реализовать
На деле получается вот что.
Чат на сокетах
Здравствуйте, хочу сделать чат на PHP с использованием сокетов. С самими сокетами я познакомился.
Чат на сокетах
Я создаю чат на С ++, только такой в котором 1 сервер который как и клиент также может отправлять и.
Чат на сокетах
Начал работу с сетью, пробую написать небольшой чат на tcp сокетах, на стороне сервера всё.
У вас в Network классе вообще ничего нет. Но есть нету accept клиентов и т.д.
Че-то я не понял. Вы пытаетесь открыть серверный сокет (в конструкторе NetWork) и в клиенте и в сервере на одном и том же порту 8283.
Естественно это не взлетит. Нужно открывать один серверный сокет на сервере.
На сервере - открываете серверный сокет, вызываете accept() - accept вернёт вам клиентский сокет в сервере. (То есть клиентский сокет на сервере руками создавать не нужно)
На клиенте - открываете только клиентский сокерт.
Да, я прочитал и понял это. И у меня возник не много другой вопрос.
Что если я хочу сделать чтоб одна и та же программа могла быть и передатчиком и приемником? Например на C++ builder можно кинуть 2 компонента на форма и программа сможет как принимать данные так и отправлять их, Можно ли такое же осуществить на JAVA?
Sluchayno, в классе Socket есть два метода getOutputStream() и getInputStream().
После того как соединение установилось. У вас и на клиенте и на сервере есть по одному объекту Socket.
Всё что вы запишите в OutputStream (полученный из getOutputStream) на сервере, клиент сможет прочитать из InputStream (полученный из getInputStream).
И наоборот: всё что вы запишите в OutputStream (полученный из getOutputStream) на клиенте, сервер сможет прочитать из InputStream (полученный из getInputStream).
Все равно не получается ((
Да я уже почитал кучу информации и понял в чем тут была ошибка, теперь проблема в другом. Я отправляю данные но на сервере они не приходят, вообще не понятно почему.
Зачем вы создаёте объект Client внутри конструктора Server? Вы хотите чтобы сервер подключался сам к себе? Это надо убрать.
И ещё перенесите всю логику из конструкторов Client/Server - в метод run(). А метод start() лучше вызывать извне, а не в самом конструкторе.
Sluchayno, возьмите книгу незабвенного Хорстманна, там приводится пример простого чата, на его основе напишите свой.
Чат на сокетах
Здравствуйте, форумчане. Сейчас занялся написанием чата на сокетах. Всё вроде бы хорошо, но уперся.
Чат на сокетах
Здрасьте. Знаю, что тема до невозможности бородатая, но возникла необходимость создания программы.
Чат на сокетах (Нюанс)
Здраствуйте. Сделал клиент,сервер на сокетах, на одном компе они работают- это понятно IP один и.
Recommend Topics
Contributors
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Веб-приложение (Web Application)
Итак, чтобы мы смогли запустить веб-приложение, нам нужен веб-сервер, который поддерживает Servlet API (т.е. в котором есть компонент-расширение, реализующее для веб-сервера поддержку Servlet API). Хорошо. А что же такое вообще веб-приложение? Согласно главе "10 Web Applications" спецификации Servlet API, Web application — это набор сервлетов, HTML страниц, классов и других ресурсов, которые составляют законечнное приложение на веб-сервере. Согласно главе "10.6 Web Application Archive File", веб-приложение может быть запаковано в Web ARchive (в архив с расширением WAR). Как сказано на странице "Glossary-219":
То есть WAR сделано вместо JAR, чтобы показать, что это веб-приложение. Следующий важный факт: у нас должна быть определённая структура каталогов в нашем WAR архиве. В спецификации Servlet API в главе "10.5 Directory Structure". В этой главе сказано, что есть особый каталог, который называется "WEB-INF". Данный каталог особен тем, что он не виден клиенту и напрямую ему не показывается, но он доступен для кода сервлетов. Также сказано, что может содержать каталог WEB-INF:
Для чего используется схема для XML файлов? В схемах указано, как правильно заполнять XML документ: какие элементы можно использовать, какого типа данные в элементах могут быть указаны, в каком порядке элементы должны идти, какие элементы обязательны и т.д. Можно сравнить схему XML документа с интерфейсом в Java, ведь схема в Java тоже указывает, каким образом должны быть написаны классы, которые удовлятворяют данному интерфейсу (т.е. которые реализуют данный интерфейс). Итак, мы вооружены тайными знаниями и готовы создавать своё первое веб-приложение!
Recommend Org
Web-server
We are working to build community through open source technology. NB: members must have two-factor auth.
Когда-то Java укрепил свои позиции благодаря тому, что выбрал приоритетным направлением веб-приложения. С первых дней Java пытался найти свой путь. Сначала — предложил апплеты. Это предоставило много возможностей разработчикам по созданию динамического контента (содержимого) на статических HTML страницах. Однако апплеты не оправдали ожиданий по многим причинам: безопасность, накладные расходы и другие. Тогда разработчики языка Java предложили альтернативу — Servlet API. И это оказалось правильным решением. Servlet API — это спецификация, на которой построено любое веб-приложение на Java, будь то приложение с веб-интерфейсом или веб-сервис, который возвращает информацию согласно запросу. Поэтому путь к пониманию работы веб-приложений на Java начинается с понимания Servlet API.
java-network-chat's People
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
Spring и Servlet API
Читайте также: