Мрежови Основи на примера на конзолата за чат
Теория - IP, порт, цокъл
За да се реши този проблем, е необходимо, заедно с информацията за трансфер на данни за това каква програма са предназначени. Тази информация е от пристанището.
В този случай, всяка една от програмите (или по-скоро, програмисти, които ги пишат) трябва да определят какво пристанище иска да комуникира с мрежата. Сървърът, от своя страна, също трябва да бъдат наясно, че порт и изпращане на данни за него.
Кой е най-мистериозните този порт? Можете да вземете отвертка и да премине през целия компютър, но на пристанището не беше намерен. Това е просто число, което се предава заедно с данните. Теоретично, тя може да бъде в диапазона от 1 до 65535, но пристанища 1..1024 използвани системни програми и да ги държат не е необходимо. Ето защо, на пристанището трябва да бъде избран в диапазона 1025..65535.
Дори и в такава проста програма като чат, не просто се изкачи в ИДЕИ напише нещо неразбираемо. Първо, нека да разберат теорията, с което ни е познато (не го пропускайте, нали?) И да се разбере значението в контекста на нашата програма.
На първо място, в проекти, които са проектирани да работят с мрежата, трябва две програми (не същата, тя се изпраща съобщения). Един от тях е на сървъра. и от друга - на клиента. Оттук и Първата последица:
- Изисква два режима на работа на програмата - сървър и клиент
Възможно е да се създаде или две различни програми, или един и поиска от потребителя, който режим, за да го стартирате. Първият метод е по-добре от факта, че сървърът не трябва да се съхранява файловете за страната на клиента. От друга страна, за да се провери работата на сървъра и клиента ще трябва да изтеглите и стартирате две различни програми. Нека разгледаме втория начин - в една единствена програма, в зависимост от вашите желания, ние ще се пуска сървър или клиент режим.
Тогава е време да се мисли за архитектура. С две ползва от всички потребители лесно - те просто взаимно си изпращат съобщения. Но както знаем, планирахме да говорите мултиплейър. Дръжте всеки клиент списък на всички други потребители безсмислени (това трябва да се разбира, че в този случай, клиентът, а потребителят - едно и също нещо). Ето защо, ние да направите това:
- Сървърът ще бъде един, а потребителите - произволен брой. Всеки потребител се свързва със сървъра и изпраща съобщенията ви. Сървърът поддържа списък на всички потребители в чата и ги изпраща на всички съобщения, получени.
И последното нещо, което трябва да се разбере е протокол - алгоритъма на програми за взаимодействие в мрежата. Очевидно е, че и двата сървъра и клиентът трябва да изпращат съобщения един на друг в един алгоритъм. В крайна сметка, ако клиентът изпраща низ, докато сървърът ще чака броя, те няма да се разбират помежду си, и няма да работи коректно.
Всеки потребител ще бъде много, би било хубаво да се идентифицират по някакъв начин. За да направите това, след като се свържете клиентът трябва да изпрати на сървъра псевдоним. След това клиентът изпраща съобщение до чата, докато друго съобщение не е равно на «изхода». Това означава, че потребителят иска да напускате стаята за чат и да затворите програмата.
програма писане
Сега, когато всичко времето за подготовка са ясни, може да пробие до най-интересното - за написването на програмата.
Файлове и структура на един пакет
Разбира се, вие знаете, че всяка програма за Javanachinaetsya с метод на Майн (String [] аргументи). За по-голяма яснота, ние няма да го добавите към другите класове, и да се създаде отделен клас Maini пакет за него - главен. Във всеки програма вероятно ще бъдат някои константи. Аз предпочитам да ги направят в отделен файл във форма publicstaticpoley така ще създаде предста клас също го добавите към основния пакет.
Тъй като ние не забравяйте, програмата трябва да работи в режим клиент или сървър. Създаване на два съответния клас Clienti Server.
В резултат на това дърво пакет изглежда по следния начин:
Избор на режима на работа
Първо трябва да изберете кой режим да стартирате програма - сървър или клиент. Това, което трябва на първо място да се учим от страна на потребителя, така че основен метод (...), въведете следното:
Тук всичко е съвсем проста - попитайте как да стартирате програмата, като прочете писмото от отговора и да стартирате съответния клас. Трябва да се обясни само на класа Scanner - стандартна библиотека клас, който го прави лесно да се работи с въвеждане на данни от конзолата. Тя се инициализира на стандартен вход поток.
режим на клиент
Нека се от прости до сложни и първа извърши режим клиент.
Ако сървърът е просто започна и с нетърпение очакваме да потребителите, клиентите трябва да покажат някаква дейност, а именно - да се свърже със сървъра. За да направите това, което трябва да знаете неговия порт за свързване IPI. Port е константа, така че от него да Const.java:
Constobyavlen като абстрактно, защото Тя съдържа само статични данни и ще създаде екземпляр от него нищо.
IPdolzhen влиза потребителя, така Client конструктор напишете:
Сега имаме всички необходими данни - ИП, пристанището, начина на работа на програмата. Можете да се свържете със сървъра. Първо, създаване на контакт:
В този случай, след като връзката е направена и можете да изпращате и четене на данни. Но как да стане това, ако данните се предават само чрез потоците? Всяка Socketsoderzhit вход и изход потоци InputStreami клас OutputStream. Можете да работите директно с тях, но по-добре е за удобство на "обвива" ги в нещо по-функционално:
Всички операции с конци и контакти трябва да се движат в рамките на try..catch единица да се справят с грешки.
Сега можете да започнете сървър за съобщения. Тъй като ние не забравяйте, протоколът трябва първо да премине потребителско име и след това влезе от всеки (в конзола) Съобщението се изпраща на сървъра. Така че ще правим:
() Метод println outotpravlyaet възрази данни към сървъра, както и метод Readline () in-обект чете получените данни. Но как да печатате на конзолата съобщения, получени от сървъра? В края на краищата, ние трябва да очакваме едновременно съобщения от конзолата (потребителя) и съобщенията от потока (от сървъра). Ще трябва да направя, за да се създаде допълнителна нишка.
Резбоване Java клас, който реализира като незаменим нещо като многонишково. Това е възможност за осъществяване на програмата в същото време по-различен набор от действия. Само това, което имаме нужда сега.
Нека да се създаде вътрешен клас, които ще получавате съобщения от сървъра и да ги показва на конзолата.
До тогава, докато потокът се спира, той просто чете всички съобщения от сървъра и ги показва в конзолата.
В конструктора, ние създаваме обект от този клас и да започне тема:
Полученият файл Client.java с останалите, изброени в края на статията.
сървърен режим
Сървър, за разлика от клиента не работи с класа Socket, както и с ServerSocket. При създаването на своя обект, програмата не се свързва навсякъде, но просто създава сървъра на порт предава на строителя.
Цялата логика на работа с даден потребител ще бъде във вътрешния клас връзка и Serverbudet приемат само нови връзки и да работят съществуващите. Нека да започнем "отдолу" и да се създаде клас Connection, която трябва да отведе потребителя на съобщението в отделна нишка, и да ги изпращате на други клиенти:
връзка е масив с всички връзка на потребителя. Когато трябва да изпрати някакъв вид послание към всички, ние се преминава през този масив и се обадете на всеки клиент.
Дизайнер, както и в класа на Клиент, преобразува потоци, свързани с контакта. пробег () метод работи в отделна нишка и работи в паралел с останалата част от програмата. В него, в съответствие с протокола, за първи път прочетох името на потребителя, а след това и всички други съобщения се изпращат до всички клиенти чат. Когато дадено съобщение идва в "Изход", потребителят е изключен от чата, както и всички потоци близо близо () метод, свързани с нея.
Сега остава само да се създаде сървър, който приема връзки, създаване на обекти Connectioni ги добавите към масива. В Сървър клас конструктор напишете:
server.accept () метод дава информация на сървъра да слуша за връзки. Веднага след като някой клиент се свързва със сървъра, методът връща Socket обекта, свързани с тази връзка. След това създава обект Connection, инициализира с това гнездо и се добавя към масива. Не забравяйте за try..catchi край в близост всички контакти с метод стрийминг closeAll а ();
Vlad_Lastname Katch Slewcel Letos Darwind_ skilgal Andrey_G c0nst andrfas Ambal memor1s Litman Amboss un1acker Baev88 копър dozor720 Bunny911 pristroistvo_ek SkunS Fesya alexace013 Gio любопитството valeska114 hardxx