Что такое сокет java
Перейти к содержимому

Что такое сокет java

  • автор:

Пакет java.net, ServerSocket

На сегодняшний день использование клиентов служб мгновенного обмена сообщениями (instant messanger) стало незаменимым средством для всех пользователей Интернета. Существует множество клиентов (Skype, WhatsApp, Viber, ICQ и т. д.), о которых каждый слышал и которые мы ежедневно используем. Все они работают по определенным правилам, т.е. реализуют определенные протоколы взаимодействия.

Наиболее распространенный протокол HTTP (Hyper Text Transfert Protocol) определяет взаимодействие двух программ, клиента и сервера, которые могут быть запущены на разных и удаленных друг от друга машинах. Клиентом является приложение, которое пользуется каким-то сервисом, предоставляемым сервером, обычно размещенном на удаленном компьютере. Клиент должен подключиться к удаленному серверу, который постоянно находится в режиме ожидания соединения. После этого они могут обмениваться информацией.

HTTP использует протокол TCP/IP. В статье рассмотриваются возможности, предоставляемые Java для работы с этим протоколом.

Распределение протоколов по уровням модели TCP/IP

№ п.п. Название Протоколы
5 Прикладной HTTP, RTP, FTP, DNS
4 Транспортный TCP, UDP, SCTP, DCCP
3 Сетевой IP. Вспомогательные протоколы, вроде ICMP и IGMP, работают поверх IP.
4 Канальный Ethernet, IEEE 802.11 Wireless Ethernet, SLIP, Token Ring, ATM и MPLS
5 Физический Физическая среда и принципы кодирования информации, T1, E1

Протокол HTTP располагается на прикладном уровне и использует для собственной реализации протоколы более низких уровней. Основой HTTP является протокол транспортного уровня TCP.

Согласно протоколу IP (Internet Packet), каждый узел (компьютер, switch и т.п.) в сети имеет свой IP-адрес. На данный момент интернет работает по протоколу IPv4, где IP адрес записывается 4 числами от 0 до 255 — например, 127.0.0.1. Существует и другой способ идентификации компьютеров в сети через доменное имя, которое более удобное и нагляднее идентифицирует компьютер, чем простой набор чисел (например, java-oline.ru). В Интернете существуют специальные сервера DNS (Domain Name System), которые осуществляют преобразование доменного имени в IP-адрес и наоборот.

TCP протокол базируется на IP для доставки пакетов, но добавляет два важных свойства :

  • установление соединения между приложениями;
  • использование портов, а не просто узлов.

Таким образом, для идентификации компьютера (host’a) в сети используется IP-адрес; для идентификации приложения TCP добавляет понятие порта. Порт — это целое число от 1 до 65535 указывающее, какому приложению предназначается пакет.

Java для работы в сети имеет специальный пакет java.net, содержащий класс Socket, что в переводе означает «гнездо». Ключевыми классами для реализации взаимодействия программ по протоколу TCP являются :

  • java.net.ServerSocket — класс реализует серверный сокет, который ожидает запросы, приходящие от клиентов по сети, и может отправлять ответ.
  • java.net.Socket — класс реализует клиентский сокет.

Серверный сокет ServerSocket

Для создания серверного сокета ServerSocket можно использовать один из следующих конструкторов :

public ServerSocket() throws IOException; public ServerSocket(int port) throws IOException; public ServerSocket(int port, int backlog) throws IOException; public ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException;

Первым параметров в конструктор необходимо передать порт port, который будет привязан к серверному сокету. Если порт занят или запрещён к использованию политикой безопасности компьютера, то вызывается исключение IOException. Если значение передавамого порта равно 0, то система сама выделит номер свободного порта. Значение полученного порта можно узнать через вызов функции getLocalPort(). Несвязанный серверный сокет ServerSocket() необходимо «связывать» с IP-адресом и портом (см. ниже метод bind).

Параметр backlog устанавливает максимальное количество клиентских подключений. Если количество подключений достигло предела, то следующему клиенту в подключении будет отказано.

Для работы с IP-адресами в библиотеке Java имеется класс java.net.InetAddress, который используется в третьем конструкторе ServerSocket. С помощью InetAddress можно определить адрес IP локального узла, а также адреса удаленного узла, заданного доменным именем. Наиболее распространенные методы класса InetAddress :

public static InetAddress getLocalHost(); public static InetAddress getByName(String host); public static InetAddress[] getAllByName(String host); public byte[] getAddress(); public String toString(); public String getHostName(); public boolean equals(Object obj);

При разработке сетевых приложений на начальном этапе, как правило, используют один компьютер (host). Для этого создатели протокола IP определили специальный адрес, называемый localhost — это IP-адрес «локальной заглушки (local loopback)» для работы приложений без использования сети. Общий порядок получения этого адреса в Java следующий :

InetAddress address = InetAddress.getByName(null); address = InetAddress.getByName("localhost");

Если методу getByName() передать значение null, то по умолчанию будет использоваться localhost. Cодержимым InetAddress нельзя манипулировать. Для создания InetArddress можно использовать один из перегруженных статических методов класса getByName(), getAllByName() или getLocalHost().

Методы серверного сокета

В таблице представлены наиболее часто используемые методы серверного сокета ServerSocket.

Метод Описание
Socket accept() Ожидание подключения клиента
void bind(SocketAddress endpoint) Связывание ServerSocket c определенным адресом (IP-адрес и порт)
void close() Закрытие сокета
ServerSocketChannel getChannel() Получение объекта ServerSocketChannel, связанного с сокетом
InetAddress getInetAddress() Получение локального адреса сокета сервера
int getLocalPort() Получение номера порта, который серверный сокет слушает
SocketAddress getLocalSocketAddress() Получение адреса серверного сокета в виде объекта SocketAddress
int getReceiveBufferSize() Получение размера буфера серверного сокета
boolean isClosed() Проверка, закрыт ли серверный сокет
void setReceiveBufferSize(int size) Определение размера буфера серверного сокета

После создания в приложении серверного сокета ServerSocket необходимо вызвать функцию accept(), которая переводит приложение в режим ожидания подключения клиента. Дальнейший код не выполняется, пока клиент не подключится. Как только клиент подключается функция возвращает объект класса java.net.Socket, который следует использовать для взаимодействия сервера с клиентом.

Клиентский сокет Socket

Коиентский сокет Socket можно создать с использованием одного из следующих конструкторов :

public Socket(); public Socket(String host, int port); public Socket(InetAddress address, int port);

В строковой константе host можно указать как IP адрес сервера, так и его DNS имя. При этом программа автоматически выберет свободный порт на локальном компьютере и свяжет его с сокетом. При этом могут быть вызваны одно из двух видов исключений, связанного с неизвестным адресом хоста (в сети компьютер не будет найден) или отсутствием связи с этим сокетом.

Класс Socket имеет один интересный метод setSoTimeout :

public void setSoTimeout(int timeout) throws SocketException;

Метод setSoTimeout устанавливает время ожидания (timeout) для работы с сокетом. Если в течение этого времени никаких действий с сокетом не произведено (получение и отправка данных), то он самоликвидируется. Время задаётся в секундах, при установке timeout равным 0 сокет становится «вечным».

Примеры использования SocketServer и Socket

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

Листинг сервера

Сервер создает сокет ServerSocket, открывает порт и ждет подключений клиента. После подключения клиента сервер формирует отдельный поток Thread, в который передает порядковый номер клиента и сокет Socket для обмена сообщениями с клиентом. Сам сервер продолжает ожидать подключение следующего клиента.

Здесь следует отметить немаловажную особенность серверного приложения : оно может обслуживать сразу несколько клиентов одновременно. Теоретически, количество одновременных подключений неограниченно, но практически всё упирается в мощность компьютеров. Эта проблема конечной мощности компьютеров используется в DOS атаках на серверы: их просто закидывают таким количеством подключений, что компьютеры не справляются с нагрузкой и «падают».

В этом простом примере демонстрируется использование серверного сокета ServerSocket для обслуживания нескольких одновременных подключений: сокет каждого нового подключения отправляется на обработку в отдельный вычислительный поток.

package com.common; import java.io.*; import java.net.*; public class Server extends Thread < // открываемый порт сервера private static final int port = 6666; private String TEMPL_MSG = "The client '%d' sent me message : \n\t"; private String TEMPL_CONN = "The client '%d' closed the connection"; private Socket socket; private int num; public Server() <>public void setSocket(int num, Socket socket) < // Определение значений this.num = num; this.socket = socket; // Установка daemon-потока setDaemon(true); /* * Определение стандартного приоритета главного потока * int java.lang.Thread.NORM_PRIORITY = 5-the default * priority that is assigned to a thread. */ setPriority(NORM_PRIORITY); // Старт потока start(); >public void run() < try < // Определяем входной и выходной потоки сокета // для обмена данными с клиентом InputStream sin = socket.getInputStream(); OutputStream sout = socket.getOutputStream(); DataInputStream dis = new DataInputStream (sin ); DataOutputStream dos = new DataOutputStream(sout); String line = null; while(true) < // Ожидание сообщения от клиента line = dis.readUTF(); System.out.println( String.format(TEMPL_MSG, num) + line); System.out.println("I'm sending it back. "); // Отсылаем клиенту обратно эту самую // строку текста dos.writeUTF("Server receive text : " + line); // Завершаем передачу данных dos.flush(); System.out.println(); if (line.equalsIgnoreCase("quit")) < // завершаем соединение socket.close(); System.out.println( String.format(TEMPL_CONN, num)); break; >> > catch(Exception e) < System.out.println("Exception : " + e); >> //--------------------------------------------------------- public static void main(String[] ar) < ServerSocket srvSocket = null; try < try < int i = 0; // Счётчик подключений // Подключение сокета к localhost InetAddress ia; ia = InetAddress.getByName("localhost"); srvSocket = new ServerSocket(port, 0, ia); System.out.println("Server started\n\n"); while(true) < // ожидание подключения Socket socket = srvSocket.accept(); System.err.println("Client accepted"); // Стартуем обработку клиента // в отдельном потоке new Server().setSocket(i++, socket); >> catch(Exception e) < System.out.println("Exception : " + e); >> finally < try < if (srvSocket != null) srvSocket.close(); >catch (IOException e) < e.printStackTrace(); >> System.exit(0); > >

Листинг клиента

Клиентский пример использования класса java.net.Socket для подключения к серверу и обмена с ним сообщениями. Если серверу отправить сообщение «quit», то цикл обмена сообщениями будет прекращен, сервер закроет подключение (свой сокет) и клиентский сокет также следует закрыть.

package com.common; import java.net.*; import java.io.*; public class Client < private static final int serverPort = 6666; private static final String localhost = "127.0.0.1"; public static void main(String[] ar) < Socket socket = null; try< try < System.out.println("Welcome to Client side\n" + "Connecting to the server\n\t" + "(IP address " + localhost + ", port " + serverPort + ")"); InetAddress ipAddress; ipAddress = InetAddress.getByName(localhost); socket = new Socket(ipAddress, serverPort); System.out.println( "The connection is established."); System.out.println( "\tLocalPort = " + socket.getLocalPort() + "\n\tInetAddress.HostAddress = " + socket.getInetAddress() .getHostAddress() + "\n\tReceiveBufferSize (SO_RCVBUF) = " + socket.getReceiveBufferSize()); // Получаем входной и выходной потоки // сокета для обмена сообщениями с сервером InputStream sin = socket.getInputStream(); OutputStream sout = socket.getOutputStream(); DataInputStream in ; DataOutputStream out; in = new DataInputStream (sin ); out = new DataOutputStream(sout); // Создаем поток для чтения с клавиатуры. InputStreamReader isr; isr = new InputStreamReader(System.in); BufferedReader keyboard; keyboard = new BufferedReader(isr); String line = null; System.out.println( "Type in something and press enter"); System.out.println(); while (true) < // Пользователь должен ввести строку // и нажать Enter line = keyboard.readLine(); // Отсылаем строку серверу out.writeUTF(line); // Завершаем поток out.flush(); // Ждем ответа от сервера line = in.readUTF(); if (line.endsWith("quit")) break; else < System.out.println( "The server sent me this line :\n\t" + line); >> > catch (Exception e) < e.printStackTrace(); >> finally < try < if (socket != null) socket.close(); >catch (IOException e) < e.printStackTrace(); >> > >

Тестирование приложений

Результаты тестирования серверного и клиентского приложений будут выводиться в соответствующие «консоли». После подключения клиента к серверу он может отправлять сообщения. Сервер возвращает изменное сообщение клиента. Одновременно к серверу может подключиться несколько клиентов.

Сообщения сервера

Сервер после старта выводит соответствующее сообщение и ждет подключений клиентов. После подкючения клиента и получения от него сообщения сервер возвращает клиенту измененную строку. При получении сообщения «quit» сеанс завершается.

Server started Client accepted The client '0' sent me message : Привет I'm sending it back. The client '0' sent me message : quit I'm sending it back. The client '0' closed the connection
Сообщения клиента

После подключения клиента к серверу выводится информация о сокете. Далее серверу отправляется сообщение «Привет». Сервер информирует клиента, что получил это сообщение. При отправлении текста «quit» сеанс обмена сообщениями с сервером завершается.

Welcome to Client side Connecting to the server (IP address 127.0.0.1, port 6666) The connection is established. LocalPort = 57975 InetAddress.HostAddress = 127.0.0.1 ReceiveBufferSize (SO_RCVBUF) = 65536 Type in something and press enter Привет The server sent me this line : Server receive text : Привет quit

Скачать примеры

Рассмотренные на странице примеры использования ServerSocket, Socket для создания сетвых приложений в виде проекта Eclipse можно скачать здесь (24.8Кб).

Создание серверного приложения с использованием пакета util.concurrent рассмотрен на странице описания сокетов в устройствах Android.

Как работает сокет в java

Как работает сокет в java, как он подключает между собой клиент и сервер и позволяет им обмениваться данными?

Отслеживать
задан 18 июл 2019 в 11:55
user336762 user336762

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Если в 2х словах сокет — это канал связи между двумя приложениями в который оба пишут и читают сообщения.

Вот собрал Вам пример как соединить 2 приложения при помощи сокетов, запускайте сначала сервер, а потом уже клиент:

public class SocketExample extends JFrame < SocketExample(String name, Socket socket) throws IOException < JTextField field = new JTextField(); JTextArea area = new JTextArea(); JButton button = new JButton("send"); setTitle(name); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); area.setPreferredSize(new Dimension(400, 200)); area.setEditable(false); setLayout(new BorderLayout()); add(area, BorderLayout.CENTER); JPanel bottomPanel = new JPanel(new BorderLayout()); add(bottomPanel, BorderLayout.SOUTH); bottomPanel.add(field, BorderLayout.CENTER); bottomPanel.add(button, BorderLayout.EAST); pack(); setLocationRelativeTo(null); setVisible(true); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); button.addActionListener(a ->< area.setText(area.getText() + "you: " + field.getText() + '\n'); out.println(field.getText()); field.setText(""); >); Executors.newSingleThreadExecutor().submit(new Runnable() < @Override public void run() < while (true) < try < String inputLine; if ((inputLine = in.readLine()) != null) area.setText(area.getText() + "remote: " + inputLine + '\n'); >catch (IOException e) < System.out.println("remote disconnected" ); System.exit(1); >> > >); addCloser(this, socket, out, in); > private static class Server < public static void main(String[] args) throws IOException < ServerSocket serverSocket = new ServerSocket(6666); SocketExample server = new SocketExample("Server", serverSocket.accept()); addCloser(server, serverSocket); >> private static class Client < public static void main(String[] args) throws IOException < new SocketExample("Client", new Socket("localhost", 6666)); >> private static void addCloser(JFrame frame, Closeable. closeables) < frame.addWindowListener(new WindowAdapter() < @Override public void windowClosed(WindowEvent e) < for (Closeable closeable : closeables) < try < closeable.close(); >catch (IOException e1) < e1.printStackTrace(); >> > >); > > 

Что такое сокет java

Этот класс реализует клиентские сокеты (также вызванный, только «снабжает сокетом»). Сокет является конечной точкой для передачи между двумя машинами. Фактическая работа сокета выполняется экземпляром SocketImpl класс. Приложение, изменяя фабрику сокета, которая создает реализацию сокета, может сконфигурировать себя, чтобы создать сокеты, соответствующие локальному брандмауэру.

Сводка конструктора

Создает несвязанный сокет, с типом системного значения по умолчанию SocketImpl.
Создает потоковый сокет и соединяет это с указанным номером порта в указанном IP-адресе.
Осуждаемый.
Используйте DatagramSocket вместо этого для транспорта UDP.
Создает сокет и соединяет это с указанным удаленным адресом на указанном удаленном порту.

Создает несвязанный сокет, определяя тип прокси, если таковые вообще имеются, который должен использоваться независимо от любых других настроек.

Создает несвязанный Сокет с определенным пользователем SocketImpl.
Создает потоковый сокет и соединяет это с указанным номером порта на именованном узле.
Осуждаемый.
Используйте DatagramSocket вместо этого для транспорта UDP.
Создает сокет и соединяет это с указанным удаленным узлом на указанном удаленном порту.

Сводка метода

Методы

Модификатор и Тип Метод и Описание
void bind(SocketAddress bindpoint)

Связывает сокет с локальным адресом.
Завершения этот сокет.
Подключения этот сокет к серверу.
Подключения этот сокет к серверу с указанным значением тайм-аута.
Возвращает уникальное SocketChannel объект, связанный с этим сокетом, если любой.
Возвращает адрес, с которым соединяется сокет.
Возвращает входной поток для этого сокета.
Тесты, если SO_KEEPALIVE включается.
Получает локальный адрес, с которым связывается сокет.
Возвращает локальный номер порта, с которым связывается этот сокет.
Возвращает адрес конечной точки, этот сокет связывается с, или null если это еще не связывается.
Тесты, если OOBINLINE включается.
Возвращает поток вывода для этого сокета.
Возвращает удаленный номер порта, с которым соединяется этот сокет.

Получает значение опции SO_RCVBUF для этого Socket, который является размером буфера, используемым платформой для ввода на этом Socket.

Возвращает адрес конечной точки, этот сокет соединяется с, или null если это несвязано.
Тесты, если SO_REUSEADDR включается.

Получите значение опции SO_SNDBUF для этого Socket, который является размером буфера, используемым платформой для вывода на этом Socket.

Установка возвратов для SO_LINGER.
Установка возвратов для SO_TIMEOUT.
Тесты, если TCP_NODELAY включается.
Получает класс трафика или тип службы в заголовке IP для пакетов, отправленных от этого Сокета
Возвращает обязательное состояние сокета.
Возвращает закрытое состояние сокета.
Возвращает состояние соединения сокета.
Возвраты, закрывается ли половина чтения сокетного соединения.
Возвраты, закрывается ли половина записи сокетного соединения.
Отправьте один байт срочных данных на сокете.
Включение/отключение SO_KEEPALIVE.

Позвольте/отключите OOBINLINE (получение TCP срочные данные) По умолчанию, эта опция отключается и TCP, срочные данные, полученные на сокете, тихо отбрасываются.

Предпочтение производительности наборов этому сокету.
Устанавливает опцию SO_RCVBUF в указанное значение для этого Socket.
Позвольте/отключите опции сокета SO_REUSEADDR.
Устанавливает опцию SO_SNDBUF в указанное значение для этого Socket.
Устанавливает клиентскую фабрику реализации сокета для приложения.
В секундах SO_LINGER включения/отключения с указанным задерживаются время.
Позвольте/отключите SO_TIMEOUT с указанным тайм-аутом в миллисекундах.
Позвольте/отключите TCP_NODELAY (отключите/позвольте алгоритм Нэйгла).
Класс трафика наборов или октет типа службы в заголовке IP для пакетов передались от этого Сокета.
Помещает входной поток для этого сокета в «конце потока».
Отключает поток вывода для этого сокета.
Преобразовывает этот сокет в a String .

Методы java.lang унаследованный от класса. Объект

Деталь конструктора

Сокет
public Socket()

Создает несвязанный сокет, с типом системного значения по умолчанию SocketImpl.

Сокет
public Socket(Proxy proxy)

  • Socket s = new Socket(Proxy.NO_PROXY); создаст простой сокет, игнорирующий любую другую конфигурацию прокси.
  • Socket s = new Socket(new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(«socks.mydom.com», 1080))); создаст сокет, соединяющийся через указанный прокси-сервер SOCKS.

Сокет
protected Socket(SocketImpl impl) throws SocketException

Создает несвязанный Сокет с определенным пользователем SocketImpl.

Сокет
public Socket(String host, int port) throws UnknownHostException, IOException

Создает потоковый сокет и соединяет это с указанным номером порта на именованном узле. Если указанным узлом является null, это — эквивалент определения адреса как InetAddress.getByName (null). Другими словами это эквивалентно определению адреса петлевого интерфейса. Если приложение определило, что сервер снабжает фабрику сокетом, что фабрика createSocketImpl метод вызывают, чтобы создать фактическую реализацию сокета. Иначе «простой» сокет создается. Если есть менеджер безопасности, checkConnect метод вызывают с адресом узла и port как его параметры. Это могло привести к SecurityException.

Сокет
public Socket(InetAddress address, int port) throws IOException

Создает потоковый сокет и соединяет это с указанным номером порта в указанном IP-адресе. Если приложение определило фабрику сокета, что фабрика createSocketImpl метод вызывают, чтобы создать фактическую реализацию сокета. Иначе «простой» сокет создается. Если есть менеджер безопасности, checkConnect метод вызывают с адресом узла и port как его параметры. Это могло привести к SecurityException.

Сокет
public Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException

Создает сокет и соединяет это с указанным удаленным узлом на указанном удаленном порту. Сокет также свяжет () с локальным адресом и предоставленным портом. Если указанным узлом является null, это — эквивалент определения адреса как InetAddress.getByName (null). Другими словами это эквивалентно определению адреса петлевого интерфейса. Локальный номер порта zero позволит системе поднимать франко-порт в bind работа. Если есть менеджер безопасности, checkConnect метод вызывают с адресом узла и port как его параметры. Это могло привести к SecurityException.

Сокет
public Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException

Создает сокет и соединяет это с указанным удаленным адресом на указанном удаленном порту. Сокет также свяжет () с локальным адресом и предоставленным портом. Если указанным локальным адресом является null, это — эквивалент определения адреса, поскольку AnyLocal адресуются (см. InetAddress.isAnyLocalAddress ()). Локальный номер порта zero позволит системе поднимать франко-порт в bind работа. Если есть менеджер безопасности, checkConnect метод вызывают с адресом узла и port как его параметры. Это могло привести к SecurityException.

Сокет
@Deprecated public Socket(String host, int port, boolean stream) throws IOException

Осуждаемый. Используйте DatagramSocket вместо этого для транспорта UDP.

Создает потоковый сокет и соединяет это с указанным номером порта на именованном узле. Если указанным узлом является null, это — эквивалент определения адреса как InetAddress.getByName (null). Другими словами это эквивалентно определению адреса петлевого интерфейса. Если потоковый параметр true , это создает потоковый сокет. Если потоковый параметр false , это создает сокет дейтаграммы. Если приложение определило, что сервер снабжает фабрику сокетом, что фабрика createSocketImpl метод вызывают, чтобы создать фактическую реализацию сокета. Иначе «простой» сокет создается. Если есть менеджер безопасности, checkConnect метод вызывают с адресом узла и port как его параметры. Это могло привести к SecurityException. Если сокет UDP будет использоваться, TCP/IP, то связанные опции сокета не будут применяться.

Сокет
@Deprecated public Socket(InetAddress host, int port, boolean stream) throws IOException

Осуждаемый. Используйте DatagramSocket вместо этого для транспорта UDP.

Создает сокет и соединяет это с указанным номером порта в указанном IP-адресе. Если потоковый параметр true , это создает потоковый сокет. Если потоковый параметр false , это создает сокет дейтаграммы. Если приложение определило, что сервер снабжает фабрику сокетом, что фабрика createSocketImpl метод вызывают, чтобы создать фактическую реализацию сокета. Иначе «простой» сокет создается. Если есть менеджер безопасности, checkConnect с методом вызывают host.getHostAddress() и port как его параметры. Это могло привести к SecurityException. Если сокет UDP будет использоваться, TCP/IP, то связанные опции сокета не будут применяться.

Деталь метода

подключение
public void connect(SocketAddress endpoint) throws IOException

Подключения этот сокет к серверу.

подключение
public void connect(SocketAddress endpoint, int timeout) throws IOException

Подключения этот сокет к серверу с указанным значением тайм-аута. Тайм-аут нуля интерпретируется как бесконечный тайм-аут. Соединение тогда блокирует пока не установлено, или ошибка происходит.

связать
public void bind(SocketAddress bindpoint) throws IOException

Связывает сокет с локальным адресом. Если адрес null , тогда система поднимет эфемерный порт и допустимый локальный адрес, чтобы связать сокет.

getInetAddress
public InetAddress getInetAddress()

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

getLocalAddress
public InetAddress getLocalAddress()

Получает локальный адрес, с которым связывается сокет.

getPort
public int getPort()

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

getLocalPort
public int getLocalPort()

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

getRemoteSocketAddress
public SocketAddress getRemoteSocketAddress()

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

getLocalSocketAddress
public SocketAddress getLocalSocketAddress()

Возвращает адрес конечной точки, этот сокет связывается с, или null если это еще не связывается. Если сокет, связанный с конечной точкой, представленной InetSocketAddress closed , тогда этот метод будет продолжать возвращаться InetSocketAddress после того, как сокет закрывается. В этом случае возвращенный InetSocketAddress ‘s адрес wildcard адресуйтесь и его порт является локальным портом, с которым это было связано.

getChannel
public SocketChannel getChannel()

Возвращает уникальное SocketChannel объект, связанный с этим сокетом, если любой. У сокета будет канал, если, и только если, сам канал создавался через SocketChannel.open или ServerSocketChannel.accept методы.

getInputStream
public InputStream getInputStream() throws IOException
  • Сетевое программное обеспечение может отбросить байты, которые буферизуются сокетом. Байты, которые не отбрасываются сетевым программным обеспечением, могут быть считаны, используя read .
  • Если нет никаких байтов, буферизованных на сокете, или все буферизованные байты были использованы read , тогда все последующие звонки read бросит IOException .
  • Если нет никаких байтов, буферизованных на сокете, и сокет не был закрыт, используя close , тогда available возвратится 0 .
getOutputStream
public OutputStream getOutputStream() throws IOException

Возвращает поток вывода для этого сокета. Если у этого сокета есть связанный канал тогда, получающийся поток вывода делегирует все свои операции к каналу. Если канал будет в неблокировании режима тогда, то операции write потока вывода бросят IllegalBlockingModeException . Закрытие возвращенного OutputStream закроет связанный сокет.

setTcpNoDelay

Позвольте/отключите TCP_NODELAY (отключите/позвольте алгоритм Нэйгла).

getTcpNoDelay

Тесты, если TCP_NODELAY включается.

setSoLinger

В секундах SO_LINGER включения/отключения с указанным задерживаются время. Максимальное значение тайм-аута является определенной платформой. Установка только влияет на сокет близко.

getSoLinger

Установка возвратов для SO_LINGER.-1 возврат подразумевает, что опция отключается. Установка только влияет на сокет близко.

sendUrgentData

Отправьте один байт срочных данных на сокете. Байт, который будет отправлен, составляет самые низкие восемь битов параметра данных. Срочный байт отправляется после любых предыдущих записей к сокету OutputStream и перед любым будущим пишет в OutputStream.

setOOBInline

Позвольте/отключите OOBINLINE (получение TCP срочные данные) По умолчанию, эта опция отключается и TCP, срочные данные, полученные на сокете, тихо отбрасываются. Если пользователь хочет получить срочные данные, то эта опция должна быть включена. Когда включено, срочные данные получаются встроенные с нормальными данными. Отметьте, только ограниченная поддержка оказывается для того, чтобы обработать входящие срочные данные. В частности никакое уведомление о входящих срочных данных не обеспечивается и нет никакой возможности различить нормальные данные и срочные данные если не обеспечено высокоуровневым протоколом.

getOOBInline

Тесты, если OOBINLINE включается.

setSoTimeout

Позвольте/отключите SO_TIMEOUT с указанным тайм-аутом в миллисекундах. С этим набором опции к ненулевому тайм-ауту чтение () обращается к InputStream, связанному с этим Сокетом, блокирует для только этого количества времени. Если тайм-аут истекает, java.net. SocketTimeoutException повышается, хотя Сокет все еще допустим. Опция должна быть включена до ввода работы блокирования, чтобы иметь эффект. Тайм-аут должен быть> 0. Тайм-аут нуля интерпретируется как бесконечный тайм-аут.

getSoTimeout

Установка возвратов для SO_TIMEOUT. 0 возвратов подразумевают, что опция отключается (то есть, тайм-аут бесконечности).

setSendBufferSize

Устанавливает опцию SO_SNDBUF в указанное значение для этого Socket. Опция SO_SNDBUF используется сетевым кодом платформы в качестве подсказки для размера, чтобы установить базовые сетевые буферы ввода-вывода. Поскольку SO_SNDBUF является подсказкой, приложения, которые хотят проверить то, во что был установлен размер буферы, должны вызвать getSendBufferSize() .

getSendBufferSize

Получите значение опции SO_SNDBUF для этого Socket, который является размером буфера, используемым платформой для вывода на этом Socket.

setReceiveBufferSize
  1. Для сокетов, принятых от ServerSocket, это должно быть сделано, вызывая ServerSocket.setReceiveBufferSize(int) прежде, чем ServerSocket связывается с локальным адресом.
  2. Для клиентских сокетов, setReceiveBufferSize () должен быть вызван прежде, чем соединить сокет с его удаленной коллегой.
getReceiveBufferSize

Получает значение опции SO_RCVBUF для этого Socket, который является размером буфера, используемым платформой для ввода на этом Socket.

setKeepAlive

Включение/отключение SO_KEEPALIVE.

getKeepAlive

Тесты, если SO_KEEPALIVE включается.

setTrafficClass

  • IPTOS_LOWCOST (0x02)
  • IPTOS_RELIABILITY (0x04)
  • IPTOS_THROUGHPUT (0x08)
  • IPTOS_LOWDELAY (0x10)

Setting bits in the precedence field may result in a SocketException indicating that the operation is not permitted.

As RFC 1122 section 4.2.4.2 indicates, a compliant TCP implementation should, but is not required to, let application change the TOS field during the lifetime of a connection. So whether the type-of-service field can be changed after the TCP connection has been established depends on the implementation in the underlying platform. Applications should not assume that they can change the TOS field after the connection.

For Internet Protocol v6 tc is the value that would be placed into the sin6_flowinfo field of the IP header.

getTrafficClass

Gets traffic class or type-of-service in the IP header for packets sent from this Socket As the underlying network implementation may ignore the traffic class or type-of-service set using setTrafficClass(int) this method may return a different value than was previously set using the setTrafficClass(int) method on this Socket.

setReuseAddress

Enable/disable the SO_REUSEADDR socket option. When a TCP connection is closed the connection may remain in a timeout state for a period of time after the connection is closed (typically known as the TIME_WAIT state or 2MSL wait state). For applications using a well known socket address or port it may not be possible to bind a socket to the required SocketAddress if there is a connection in the timeout state involving the socket address or port. Enabling SO_REUSEADDR prior to binding the socket using bind(SocketAddress) allows the socket to be bound even though a previous connection is in a timeout state. When a Socket is created the initial setting of SO_REUSEADDR is disabled. The behaviour when SO_REUSEADDR is enabled or disabled after a socket is bound (See isBound() ) is not defined.

getReuseAddress

Tests if SO_REUSEADDR is enabled.

close

Closes this socket. Any thread currently blocked in an I/O operation upon this socket will throw a SocketException . Once a socket has been closed, it is not available for further networking use (i.e. can’t be reconnected or rebound). A new socket needs to be created. Closing this socket will also close the socket’s InputStream and OutputStream . If this socket has an associated channel then the channel is closed as well.

shutdownInput

Places the input stream for this socket at «end of stream». Any data sent to the input stream side of the socket is acknowledged and then silently discarded. If you read from a socket input stream after invoking shutdownInput() on the socket, the stream will return EOF.

shutdownOutput

Disables the output stream for this socket. For a TCP socket, any previously written data will be sent followed by TCP’s normal connection termination sequence. If you write to a socket output stream after invoking shutdownOutput() on the socket, the stream will throw an IOException.

toString
public String toString()

Converts this socket to a String .

isConnected
public boolean isConnected()

Returns the connection state of the socket. Note: Closing a socket doesn’t clear its connection state, which means this method will return true for a closed socket (see isClosed() ) if it was successfuly connected prior to being closed.

isBound
public boolean isBound()

Returns the binding state of the socket. Note: Closing a socket doesn’t clear its binding state, which means this method will return true for a closed socket (see isClosed() ) if it was successfuly bound prior to being closed.

isClosed
public boolean isClosed()

Returns the closed state of the socket.

isInputShutdown
public boolean isInputShutdown()

Returns whether the read-half of the socket connection is closed.

isOutputShutdown
public boolean isOutputShutdown()

Returns whether the write-half of the socket connection is closed.

setSocketImplFactory
public static void setSocketImplFactory(SocketImplFactory fac) throws IOException

Sets the client socket implementation factory for the application. The factory can be specified only once. When an application creates a new client socket, the socket implementation factory’s createSocketImpl method is called to create the actual socket implementation. Passing null to the method is a no-op unless the factory was already set. If there is a security manager, this method first calls the security manager’s checkSetFactory method to ensure the operation is allowed. This could result in a SecurityException.

setPerformancePreferences
public void setPerformancePreferences(int connectionTime, int latency, int bandwidth)

Sets performance preferences for this socket. Sockets use the TCP/IP protocol by default. Some implementations may offer alternative protocols which have different performance characteristics than TCP/IP. This method allows the application to express its own preferences as to how these tradeoffs should be made when the implementation chooses from the available protocols. Performance preferences are described by three integers whose values indicate the relative importance of short connection time, low latency, and high bandwidth. The absolute values of the integers are irrelevant; in order to choose a protocol the values are simply compared, with larger values indicating stronger preferences. Negative values represent a lower priority than positive values. If the application prefers short connection time over both low latency and high bandwidth, for example, then it could invoke this method with the values (1, 0, 0). If the application prefers high bandwidth above low latency, and low latency above short connection time, then it could invoke this method with the values (0, 1, 2). Invoking this method after this socket has been connected will have no effect.

Java™ Platform
Standard Ed. 7

Представьте ошибку или функцию
For further API reference and developer documentation, see Java SE Documentation . That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2011, Oracle and/or its affiliates. All rights reserved.

Socket

— Тема сегодняшней лекции – Сокеты. 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-адрес нашего компьютера. Ну, или его доменное имя.

Вот тебе интересный пример, можешь попробовать разобрать его и выполнить:

Там весь смысл в том, что с помощью серверного сокета пишется примитивнейший веб-сервер, к которому можно просто обращаться из браузера.

— Ого! Веб-сервер? Круто! Я изучу его очень внимательно.

— Все, Амиго, иди отдыхать!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *