Програмування сокетів на java

Ви хочете розробити мережеву програму на Джаві - іграшку, чат, або те й інше разом ... Ви знайшли правильну статтю - тут ви зможете ознайомитися з захоплюючим світом сокетов в Java. Прочитавши цю статтю, вам буде видно світло в кінці тунелю - стане очевидним призначення сокетов і то, як розробити просту програму з використанням сокетів на мові програмування Джава.

Що таке сокет?

Якщо скласти докупи вище описані рівняння, то отримаємо:

_____ = унікально визначає програму в мережі.

Якщо ви здогадалися до цього самі - значить мої зусилля не пропали дарма. Якщо немає, тоді прочитайте ще раз все спочатку або скористайтеся Google для пошуку кращої статті.

_____ - це і є ... сокети!

Як програмувати з використанням сокетів?

Досить про теорію, давайте перейдемо до дій. Розробимо дуже простий і наочний код на Java, який продемонструє можливості використання сокетів. Спробуємо реалізувати наступний список дій:

1) Одна Джава програма буде намагатися зв'язатися з іншого Java програмою (яка відчайдушно чекає когось, щоб з нею зв'язався). Назвемо першу програму Клієнтом, а другу Сервером.

2) Після успішного зв'язування з сервером, клієнт чекає введення даних від вас і відсилає текст сервера.

3) Серверна програма відсилає клієнтові назад той; t текст (для того щоб показати, що вона вміє робити навіть таке корисне дію).

4) Отриманий від сервера текст, клієнт показує вам, щоб показати вам думка сервера про вас. Приготувалися приступити до розробки? Почнемо. Зазначу тільки, що я не буду вчити вас програмування на Java з чистого аркуша, а тільки поясню код, який відноситься до сокета. Створіть 2 нових Джава програми і назвіть їх Server.java і Client.java. Я навів код нижче, тільки не лякайтеся, я все поясню.


import java.net. *;
import java.io. *;
public class Server public static void main (String [] ar) int port = 6666; // випадковий порт (може бути будь-яке число від 1025 до 65535)
try ServerSocket ss = new ServerSocket (port); // створюємо сокет сервера і прив'язуємо його до вищезазначеного порту
System.out.println ( "Waiting for a client.");

Socket socket = ss.accept (); // змушуємо сервер чекати підключень і виводимо повідомлення коли хтось зв'язався з сервером
System.out.println ( "Got a client :). Finally, someone saw me through all the cover!");
System.out.println ();

// Беремо вхідний і вихідний потоки сокета, тепер можемо отримувати і відсилати дані клієнта.
InputStream sin = socket.getInputStream ();
OutputStream sout = socket.getOutputStream ();

// Конвертуємо потоки в інший тип, щоб легше обробляти текстові повідомлення.
DataInputStream in = new DataInputStream (sin);

DataOutputStream out = new DataOutputStream (sout);

String line = null;
while (true) line = in.readUTF (); // очікуємо поки клієнт надішле рядок тексту.
System.out.println ( "The dumb client just sent me this line." + Line);
System.out.println ( "I'm sending it back.");
out.writeUTF (line); // відсилаємо клієнту назад ту саму рядок тексту.
out.flush (); // змушуємо потік закінчити передачу даних.
System.out.println ( "Waiting for the next line.");
System.out.println ();
>
> Catch (Exception x)
>
>

import java.net. *;
import java.io. *;

// Беремо вхідний і вихідний потоки сокета, тепер можемо отримувати і відсилати дані клієнтом.
InputStream sin = socket.getInputStream ();
OutputStream sout = socket.getOutputStream ();

// Конвертуємо потоки в інший тип, щоб легше обробляти текстові повідомлення.
DataInputStream in = new DataInputStream (sin);
DataOutputStream out = new DataOutputStream (sout);

// Створюємо потік для читання з клавіатури.
BufferedReader keyboard = new BufferedReader (new InputStreamReader (System.in));
String line = null;
System.out.println ( "Type in something and press enter. Will send it to the server and tell ya what it thinks.");
System.out.println ();

while (true) line = keyboard.readLine (); // чекаємо поки користувач введе щось і натисне кнопку Enter.
System.out.println ( "Sending this line to the server.");
out.writeUTF (line); // відсилаємо введений рядок тексту сервера.
out.flush (); // змушуємо потік закінчити передачу даних.
line = in.readUTF (); // чекаємо поки сервер відішле рядок тексту.
System.out.println ( "The server was very polite. It sent me this." + Line);
System.out.println ( "Looks like the server is pleased with us. Go ahead and enter more lines.");
System.out.println ();
>
> Catch (Exception x) x.printStackTrace ();
>
>
>

Тепер скомпілюємо код:

javac Server.java Client.java

Відкриємо два командних вікна (DOS). В одному вікні введемо:

Обов'язково в такому порядку.

Тепер введіть рядок тексту в вікні, де запущений клієнт, і натисніть кнопку Enter. Спостерігайте за двома вікнами і побачите що трапилося. В кінці, натисніть Ctrl-C для того щоб зупинити програми.

Пояснення коду роботи з сокетами

Розглянемо наступну частину коду сервера:

ServerSocket ss = new ServerSocket (port);
Socket socket = ss.accept ();

Клас ServerSocket трохи відрізняється від класу Socket. Клас Socket - це і є сокет. Головна відмінність ServerSocket полягає в тому, що він уміє змушувати програму чекати підключень від клієнтів. Коли ви його створюєте, потрібно вказувати порт, з яким він буде працювати, і викликати його метод accept (). Цей метод змушує програму чекати підключень через порт. Виконання програми зависає в цьому місці, поки покупець не підключиться. Після успішного підключення клієнтом, створюється нормальний Socket об'єкт, який ви можете використовувати для виконання все існуючий операцій з сокетом. Зауважимо також, що цей Socket об'єкт відображає інший кінець з'єднання. Якщо ви хочете відіслати дані клієнта, то ви не можете використовувати для цього ваш власний сокет.

InetAddress ipAddress = InetAddress.getByName (address);

Після того як ми створили InetAddress, то можна створити Socket:

Socket socket = new Socket (ipAddress, serverPort);

InputStream sin = socket.getInputStream ();
OutputStream sout = socket.getOutputStream ();

Наступні рядки просто конвертують потоки в інші типи потоків. Після цього нам легше буде працювати з String об'єктами. Цей код нічого не робить з мережею.

DataInputStream in = new DataInputStream (sin);
DataOutputStream out = new DataOutputStream (sout);

Все інше дуже просто - прості маніпуляції з об'єктами потоків (ніяких сокетов). Ви можете використовувати ваші улюблені потоки, викликати ваші улюблені методи, і засвідчуватися в передачі даних в другій кінець. Якщо ви не дуже обізнані в використанні потоків, рекомендую вам знайти статтю про них і прочитати.

Схожі статті