— Салом, Амиго!
— Ассалому алейкум, Риша!
— Бугунги лекциямизнинг мавзуси – Сокетлар. Socket инглиз тилидан - Розетка демак.
Сен аллақачон билисанки, тармоқдаги ҳар бир компьютернинг уникал IP-манзили мавжуд.
— Ҳа.
— Ва энди тасаввур қилинг, сенда бир нечта компьютерлар бор ва ҳар бир компютерда интернет билан ишловчи ўнга яқин дастурлар ишга туширилган: Skype, ICQ ва ҳ.к.
Бу дастурлар бир-бирлари билан мулоқот қилишни хоҳлашади.
Уларни бир-бирлари билан "аралашиб кетмаслиги" учун керакли нарса қилиш керак. Skype – Skype'га, ICQ – ICQ'га ва ҳ.к. билан алоқа ўрнатиши лозим.
Бу муаммони URL ва веб-серверлар билан қандай ҳал қилишганини эслайсанми?
— Ҳа, портлар қўшишган.
— Айнан шундай.
Бу уйда кўп кичик хоналар қилиш ва уни кўп квартирали деб эълон қилиш билан баробар. Ҳар бир порт – алоҳида квартира каби.
Шундай қилиб, IP-манзил – бу компютернинг уникал рақами, ва IP-манзил+порт – бу компютердаги кандайдир "квартира" (ячея)нинг уникал рақами, уни дастур эгаллаши мумкин.
Бу уникал ячея сокет деб аталади.
Сокетнинг унинг уникал рақами бор, у IP-манзилдан ва порт рақамидан иборат.
— Ҳа. Демак, сокет – бу компютердаги қандайдир виртуал ячеянинг рақами, уни дастур эгаллаши мумкин? Бошқа дастур унинг учун бу ячейкага хабар юборади ва шу йўл билан улар алоқа қилади?
— Сен буни қандай тушундинг, билмайман, лекин айнан шундай.
— Буни менинг роботинтуициям айтди.
— Жуда яхши. Энди батафсилроқ кўриб чиқайлик.
Сокетлар – бу дастурларни тармоқлараро ўзаро ҳамкорлик қилишнинг энг асосий ва энг содда усулидир.
Java доирасида сокетлар билан ишлаш учун икки класс бор. Бу класслар Socket ва ServerSocketдир.
ServerSocket – бу махсус класс бўлиб, унинг объектлари сервер ролини бажаради – яъни муайян сокетга келган сўровларни хизмат қила олади.
Socket класи – бу асосан Socket-клиент, у орқали биз сокетга хабар юборишимиз ва жавоб олишимиз мумкин.
Қандай қилиб сокетга хабар юбориш мумкин:
//сокет яратамиз
Socket clientSocket = new Socket("localhost", 4444);
//OutputStream'ни оламиз
OutputStream outputStream = clientSocket.getOutputStream();
PrintWriter out = new PrintWriter(outputStream, true);
out.println("Kiss my shiny metal ass!");
out.flush();
//жавобни ўқимоқдамиз
InputStream inputStream = clientSocket.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
String answer = in.readLine();
— Ҳаммаси интернетдан файл юклаб олишга ўхшайди.
— Чунки, бу, йигитим, айнан шундай, чунки у ерда ҳам сокетлар фойдаланилади.
Сокетлар тармоқ билан боғлиқ бўлган барча нарсаларнинг асосида ётади, ёки деярли ҳаммаси.
Бу ерда бу ерда қўшимча маълумотларни ўқишинг мумкин.
— Лекция учун раҳмат, Риша.
— Ҳали ҳаммасини тушунмадим. ўйлаб кўр.
Энди сервер сокети қандай ишлаётганини кўриб чиқамиз.
У бироз қийинроқ ишлайди.
//сервер-сокет объект яратамиз
ServerSocket serverSocket = new ServerSocket(4444); //порт
//келувчи уланишларни ҳал қилиши учун циклда.
while (true)
{
//accept усули кутмоқда, кимдир уланади.
Socket socket = serverSocket.accept();
//хабарни ўқиш
InputStream inputStream = socket.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
String message = in.readLine();
//жавоб ўйлаб топамиз – сатрни тескари ўғириб қойамиз
String reverseMessage = new StringBuilder(message).reverse().toString();
//жавоб юбориш
OutputStream outputStream = socket.getOutputStream();
PrintWriter out = new PrintWriter(outputStream, true);
out.println(reverseMessage);
out.flush();
}
Бир нечта нуқталарга диққатингизни бураман.
Нуқта 1: Сокет яратиш учун IP-манзилни (ёки доменни) ва портни кўрсатиш керак. Сервер сокет яратиш учун – фақат порт. Сервер сокет фақат уни яратган компютерда пайдо бўлади.
Нуқта 2: ServerSocket классининг accept() усули бор, унга қўнғироқ қилинса, кирувчи уланишни кутмоқда. Яъни усул чекланмасдан туриб амалга оширилади, фақат бирор мижоз сокет унга мурожаат қилмаса. Шунда accept() усули уланишни қабул қилади, келишиш учун сокет объект яратади ва шундан сўнг ушбу объектни қайтаради.
Java дастурчиси нуқтаи назаридан, сокет – бу икки оқим – InputStream, ундан хабарларни/маълумотларни ўқиш мумкин ва OutputStream, унга хабарларни/маълумотларни ёзиш мумкин.
Сен сервер сокет яратганингда, аслида сокетимиз номер порти ва компютеримизнинг IP-манзили тўғри кўрсатилиши керак бўлган порт пайдо бўлади. Ёки унинг домен номи.
Манбу сингари қизиқадий мисол, уни таҳлил қилишинг ва амалга оширишинг мумкин:
http://habrahabr.ru/post/69136/
У ерда барча маъно шундаки, сервер сокет орқали жуда содда веб-сервер ёзилади, унга фақат браузердан мурожаат қилиш мумкин.
— Ўу, веб-сервер? Жуда аъло! Мен уни жуда диққат билан ўрганаман.
Раҳмат, Риша.
— Хўш, Амиго, дам олишга йўл оласиз!
GO TO FULL VERSION