Програмування Java Socket використовується для зв'язку між програмами, що працюють на різних JRE.
Програмування Java Socket може бути орієнтованим на підключення або без нього.
Класи Socket і ServerSocket використовуються для програмування сокетів, орієнтованих на підключення, а класи DatagramSocket і DatagramPacket використовуються для програмування сокетів без підключення.
Клієнт у програмуванні сокетів повинен знати дві відомості:
- IP-адреса сервера та
- Номер порту.
Тут ми збираємося створити односторонній зв’язок між клієнтом і сервером. У цій програмі клієнт надсилає повідомлення на сервер, сервер читає повідомлення та друкує його. Тут використовуються два класи: Socket і ServerSocket. Клас Socket використовується для зв'язку між клієнтом і сервером. За допомогою цього класу ми можемо читати та писати повідомлення. Клас ServerSocket використовується на стороні сервера. Метод accept() класу ServerSocket блокує консоль до підключення клієнта. Після успішного підключення клієнта він повертає екземпляр Socket на стороні сервера.
Клас розетки
Сокет — це просто кінцева точка для зв’язку між машинами. Клас Socket можна використовувати для створення сокета.
Важливі методи
метод | опис |
---|---|
1) публічний InputStream getInputStream() | повертає InputStream, приєднаний до цього сокета. |
2) public OutputStream getOutputStream() | повертає OutputStream, приєднаний до цього сокета. |
3) публічний синхронізований void close() | закриває цей сокет |
Клас ServerSocket
Клас ServerSocket можна використовувати для створення серверного сокета. Цей об'єкт використовується для встановлення зв'язку з клієнтами.
Важливі методи
метод | опис |
---|---|
1) public Socket accept() | повертає сокет і встановлює з'єднання між сервером і клієнтом. |
2) публічний синхронізований void close() | закриває серверний сокет. |
Приклад програмування Java-сокетів
Створення сервера:
Щоб створити серверну програму, нам потрібно створити екземпляр класу ServerSocket. Тут ми використовуємо номер порту 6666 для зв’язку між клієнтом і сервером. Ви також можете вибрати будь-який інший номер порту. Метод accept() очікує клієнта. Якщо клієнт підключається до заданого номера порту, він повертає екземпляр Socket.
ServerSocket ss=new ServerSocket(6666); Socket s=ss.accept();//establishes connection and waits for the client
Створення клієнта:
Щоб створити клієнтську програму, нам потрібно створити екземпляр класу Socket. Тут нам потрібно передати IP-адресу або ім’я хоста сервера та номер порту. Тут ми використовуємо «localhost», оскільки наш сервер працює в тій же системі.
Socket s=new Socket('localhost',6666);
Давайте розглянемо просте програмування Java-сокета, де клієнт надсилає текст, а сервер отримує та друкує його.
Файл: MyServer.java
import java.io.*; import java.net.*; public class MyServer { public static void main(String[] args){ try{ ServerSocket ss=new ServerSocket(6666); Socket s=ss.accept();//establishes connection DataInputStream dis=new DataInputStream(s.getInputStream()); String str=(String)dis.readUTF(); System.out.println('message= '+str); ss.close(); }catch(Exception e){System.out.println(e);} } }
Файл: MyClient.java
import java.io.*; import java.net.*; public class MyClient { public static void main(String[] args) { try{ Socket s=new Socket('localhost',6666); DataOutputStream dout=new DataOutputStream(s.getOutputStream()); dout.writeUTF('Hello Server'); dout.flush(); dout.close(); s.close(); }catch(Exception e){System.out.println(e);} } }завантажити цей приклад
Щоб виконати цю програму, відкрийте два командні рядки та виконайте кожну програму в кожному командному рядку, як показано на малюнку нижче.
Після запуску клієнтської програми на консолі сервера з’явиться повідомлення.
Приклад програмування Java-сокетів (читання-запис з обох сторін)
У цьому прикладі клієнт спочатку напише на сервер, а потім сервер отримає та надрукує текст. Потім сервер напише клієнту, а клієнт отримає та надрукує текст. Крок йде далі.
Файл: MyServer.java
import java.net.*; import java.io.*; class MyServer{ public static void main(String args[])throws Exception{ ServerSocket ss=new ServerSocket(3333); Socket s=ss.accept(); DataInputStream din=new DataInputStream(s.getInputStream()); DataOutputStream dout=new DataOutputStream(s.getOutputStream()); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String str='',str2=''; while(!str.equals('stop')){ str=din.readUTF(); System.out.println('client says: '+str); str2=br.readLine(); dout.writeUTF(str2); dout.flush(); } din.close(); s.close(); ss.close(); }}
Файл: MyClient.java
import java.net.*; import java.io.*; class MyClient{ public static void main(String args[])throws Exception{ Socket s=new Socket('localhost',3333); DataInputStream din=new DataInputStream(s.getInputStream()); DataOutputStream dout=new DataOutputStream(s.getOutputStream()); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String str='',str2=''; while(!str.equals('stop')){ str=br.readLine(); dout.writeUTF(str); dout.flush(); str2=din.readUTF(); System.out.println('Server says: '+str2); } dout.close(); s.close(); }}