Основы программирования сокетов в Java

Программирование сокетов в Java используется для связи между приложениями, работающими на разных JRE. Он может быть ориентированным на соединение или без установления соединения. По сути, сокет — это способ установить соединение между клиентом и сервером.

Что это такое программирование сокетов?

Программирование сокетов — это способ соединения двух узлов в сети для связи друг с другом. Один сокет (узел) прослушивает определенный порт на IP-адресе, в то время как другой обращается к другому, чтобы сформировать соединение.

Связь клиент-сервер

Сервер формирует слушателя, которого клиент обращается к серверу. Классы Socket и Server Socket используются для программирования сокетов с установлением соединения.

Что такое сокет?

Сокет — это одна из конечных точек двустороннего канала связи между двумя программами, работающими в сети. Привязан к номеру порта, чтобы уровень TCP мог идентифицировать приложение, в которое должны быть отправлены данные.

Теперь, когда вы знаете, что такое Socket в Java, давайте продолжим и разберемся, как клиент взаимодействует с сервером и как сервер отвечает в ответ.

что такое сокет в java

Клиентское программирование

В случае программирования на стороне клиента клиент сначала будет ждать запуска сервера. Как только сервер будет запущен, он отправит запросы на сервер. После этого клиент будет ждать ответа от сервера. Итак, в этом вся логика взаимодействия клиента и сервера.

Чтобы инициировать запрос клиентов, вам необходимо выполнить следующие шаги:

1. Установите соединение

Самый первый шаг — установить соединение через сокет. Соединение через сокет подразумевает, что две машины имеют информацию о сетевом расположении друг друга (IP-адрес) и TCP-порте.

Вы можете создать Socket с помощью следующего оператора:

Socket socket = new Socket («127.0.0.1», 5000)
  • Здесь первый аргумент представляет собой IP-адрес сервера.
  • Второй аргумент представляет TCP-порт (число, обозначающее, какое приложение должно работать на сервере).

2. Связь

Для связи через соединение сокета потоки используются как для ввода, так и для вывода данных. После установления соединения и отправки запросов вам необходимо закрыть соединение.

3. Закрытие соединения

Соединение сокета явно закрывается после отправки сообщения на сервер.

Пример реализации сокетного соединения на стороне клиента

// A Java program for a ClientSide
import java.net.*;
import java.io.*;
public class ClientProgram
{
// initialize socket and input output streams
private Socket socket = null;
private DataInputStream input = null;
private DataOutputStream out = null;
// constructor to put ip address and port
public Client(String address, int port)
{
// establish a connection
try
{
socket = new Socket(address, port);
System.out.println("Connected");
// takes input from terminal
input = new DataInputStream(System.in);
// sends output to the socket
out = new DataOutputStream(socket.getOutputStream());
}
catch(UnknownHostException u)
{
System.out.println(u);
}
catch(IOException i)
{
System.out.println(i);
}// string to read message from input
String line = "";
// keep reading until "Over" is input
while (!line.equals("Over"))
{
try
{
line = input.readLine();
out.writeUTF(line);
}
catch(IOException i)
{
System.out.println(i);
}
}
// close the connection
try
{
input.close();
out.close();
socket.close();
}
catch(IOException i)
{
System.out.println(i);
}
}
public static void main(String args[]) {
Client client = new Client("127.0.0.1", 5000);
}
}

Программирование на стороне сервера

По сути, сервер создает экземпляр своего объекта и ждет запроса клиента. Как только клиент отправит запрос, сервер ответит на него.

Для кодирования серверного приложения вам понадобятся два сокета, и они следующие:

  • ServerSocket, который ожидает клиентских запросов (когда клиент создает новый Socket()).
  • Обычный старый сокет для связи с клиентом.

После этого вам нужно связаться с клиентом с ответом.

Общение

getOutputStream() используется для отправки вывода через сокет.

Закройте соединение

Когда все будет сделано, важно закрыть соединение, закрыв сокет, а также потоки ввода / вывода.

Пример реализации сокетного соединения на стороне сервера

// A Java program for a Serverside
import java.net.*;
import java.io.*;
public class ServerSide
{
//initialize socket and input stream
private Socket socket = null;
private ServerSocket server = null;
private DataInputStream in = null;
// constructor with port
public Server(int port)
{
// starts server and waits for a connection
try{
server = new ServerSocket(port);
System.out.println("Server started");
System.out.println("Waiting for a client ...");
socket = server.accept();
System.out.println("Client accepted");
// takes input from the client socket
in = new DataInputStream(
new BufferedInputStream(socket.getInputStream()));
String line = "";
// reads message from client until "Over" is sent
while (!line.equals("Over"))
{
try
{
line = in.readUTF();
System.out.println(line);



}
catch(IOException i)
{
System.out.println(i);
}
}
System.out.println("Closing connection");
// close connection
socket.close();
in.close();
}
catch(IOException i){
System.out.println(i);
}
}
public static void main(String args[]){
Server server = new Server(5000);
}
}

После настройки как клиентской, так и серверной стороны вы можете сначала запустить программу на стороне сервера. После этого вам необходимо запустить клиентскую программу и отправить запрос. Как только запрос будет отправлен со стороны клиента, сервер ответит вам.

1. Когда вы запускаете сценарий на стороне сервера, он запускается и ждет, пока клиент не запустится.

вывод на стороне сервера

2. Затем клиент подключается и вводит запрос в виде строки.

вывод на стороне клиента

3. Когда клиент отправляет запрос, сервер отвечает.

вывод серверной части

Вот как вам нужно выполнить программу сокета на Java. Вы также можете запускать эти программы в окне терминала или в командной строке. Но, поскольку Eclipse хорошо расширен своими функциями, вы можете просто запустить обе программы на консоли.

Оцените статью