Термин « сетевое программирование» относится к написанию программ, которые выполняются на нескольких устройствах (компьютерах), в которых все устройства подключены друг к другу с помощью сети.
Пакет java.net API-интерфейсов J2SE содержит набор классов и интерфейсов, которые предоставляют подробные сведения о низкоуровневом взаимодействии, что позволяет вам писать программы, ориентированные на решение проблемы.
Пакет java.net обеспечивает поддержку двух общих сетевых протоколов:
-
TCP — TCP означает Протокол управления передачей, который обеспечивает надежную связь между двумя приложениями. TCP обычно используется через Интернет-протокол, который называется TCP / IP.
-
UDP — UDP означает User Datagram Protocol, протокол без установления соединения, который позволяет передавать пакеты данных между приложениями.
TCP — TCP означает Протокол управления передачей, который обеспечивает надежную связь между двумя приложениями. TCP обычно используется через Интернет-протокол, который называется TCP / IP.
UDP — UDP означает User Datagram Protocol, протокол без установления соединения, который позволяет передавать пакеты данных между приложениями.
Эта глава дает хорошее понимание следующих двух тем:
-
Программирование на сокете — это наиболее широко используемая концепция в сети, и она была подробно объяснена.
-
Обработка URL — это будет рассмотрено отдельно. Нажмите здесь, чтобы узнать об обработке URL на языке Java.
Программирование на сокете — это наиболее широко используемая концепция в сети, и она была подробно объяснена.
Обработка URL — это будет рассмотрено отдельно. Нажмите здесь, чтобы узнать об обработке URL на языке Java.
Программирование сокетов
Сокеты обеспечивают механизм связи между двумя компьютерами, использующими TCP. Клиентская программа создает сокет на своем конце связи и пытается подключить этот сокет к серверу.
Когда соединение установлено, сервер создает объект сокета на своем конце связи. Клиент и сервер теперь могут общаться, записывая и считывая данные из сокета.
Класс java.net.Socket представляет собой сокет, а класс java.net.ServerSocket предоставляет механизм для серверной программы для прослушивания клиентов и установления соединений с ними.
Следующие шаги выполняются при установлении соединения TCP между двумя компьютерами с использованием сокетов:
-
Сервер создает экземпляр объекта ServerSocket, определяющий, по какому номеру порта должна происходить связь.
-
Сервер вызывает метод accept () класса ServerSocket. Этот метод ожидает, пока клиент не подключится к серверу по указанному порту.
-
После ожидания сервера клиент создает экземпляр объекта Socket, указывая имя сервера и номер порта для подключения.
-
Конструктор класса Socket пытается подключить клиента к указанному серверу и номеру порта. Если связь установлена, у клиента теперь есть объект Socket, способный связываться с сервером.
-
На стороне сервера метод accept () возвращает ссылку на новый сокет на сервере, который подключен к клиентскому сокету.
Сервер создает экземпляр объекта ServerSocket, определяющий, по какому номеру порта должна происходить связь.
Сервер вызывает метод accept () класса ServerSocket. Этот метод ожидает, пока клиент не подключится к серверу по указанному порту.
После ожидания сервера клиент создает экземпляр объекта Socket, указывая имя сервера и номер порта для подключения.
Конструктор класса Socket пытается подключить клиента к указанному серверу и номеру порта. Если связь установлена, у клиента теперь есть объект Socket, способный связываться с сервером.
На стороне сервера метод accept () возвращает ссылку на новый сокет на сервере, который подключен к клиентскому сокету.
После того, как соединения установлены, связь может происходить с использованием потоков ввода / вывода. Каждый сокет имеет и OutputStream, и InputStream. OutputStream клиента подключен к InputStream сервера, а InputStream клиента подключен к OutputStream сервера.
TCP является двусторонним протоколом связи, поэтому данные могут передаваться по обоим потокам одновременно. Ниже приведены полезные классы, предоставляющие полный набор методов для реализации сокетов.
Методы класса ServerSocket
Класс java.net.ServerSocket используется серверными приложениями для получения порта и прослушивания клиентских запросов.
Класс ServerSocket имеет четыре конструктора —
Sr.No. | Метод и описание |
---|---|
1 |
public ServerSocket (int port) выдает IOException Попытки создать серверный сокет, связанный с указанным портом. Исключение происходит, если порт уже связан другим приложением. |
2 |
public ServerSocket (int port, int backlog) выдает IOException Как и в предыдущем конструкторе, параметр backlog указывает, сколько входящих клиентов нужно сохранить в очереди ожидания. |
3 |
public ServerSocket (int port, int backlog, адрес InetAddress) выбрасывает IOException Как и в предыдущем конструкторе, параметр InetAddress указывает локальный IP-адрес для привязки. InetAddress используется для серверов, которые могут иметь несколько IP-адресов, что позволяет серверу указывать, по какому из его IP-адресов принимать запросы клиентов. |
4 |
public ServerSocket () выбрасывает IOException Создает несвязанный сокет сервера. При использовании этого конструктора используйте метод bind (), когда будете готовы связать сокет сервера. |
public ServerSocket (int port) выдает IOException
Попытки создать серверный сокет, связанный с указанным портом. Исключение происходит, если порт уже связан другим приложением.
public ServerSocket (int port, int backlog) выдает IOException
Как и в предыдущем конструкторе, параметр backlog указывает, сколько входящих клиентов нужно сохранить в очереди ожидания.
public ServerSocket (int port, int backlog, адрес InetAddress) выбрасывает IOException
Как и в предыдущем конструкторе, параметр InetAddress указывает локальный IP-адрес для привязки. InetAddress используется для серверов, которые могут иметь несколько IP-адресов, что позволяет серверу указывать, по какому из его IP-адресов принимать запросы клиентов.
public ServerSocket () выбрасывает IOException
Создает несвязанный сокет сервера. При использовании этого конструктора используйте метод bind (), когда будете готовы связать сокет сервера.
Если конструктор ServerSocket не выдает исключение, это означает, что ваше приложение успешно связано с указанным портом и готово для клиентских запросов.
Ниже приведены некоторые из распространенных методов класса ServerSocket.
Sr.No. | Метод и описание |
---|---|
1 |
public int getLocalPort () Возвращает порт, который прослушивает сокет сервера. Этот метод полезен, если вы передали 0 в качестве номера порта в конструкторе и позволили серверу найти порт для вас. |
2 |
public Socket accept () выдает IOException Ждет входящего клиента. Этот метод блокируется до тех пор, пока клиент не подключится к серверу на указанном порту или не истечет время ожидания сокета, при условии, что значение времени ожидания было установлено с помощью метода setSoTimeout (). В противном случае этот метод блокируется на неопределенный срок. |
3 |
public void setSoTimeout (int timeout) Устанавливает значение времени ожидания для того, как долго сокет сервера ожидает клиента во время accept (). |
4 |
public void bind (хост SocketAddress, int backlog) Связывает сокет с указанным сервером и портом в объекте SocketAddress. Используйте этот метод, если вы создали экземпляр ServerSocket с помощью конструктора без аргументов. |
public int getLocalPort ()
Возвращает порт, который прослушивает сокет сервера. Этот метод полезен, если вы передали 0 в качестве номера порта в конструкторе и позволили серверу найти порт для вас.
public Socket accept () выдает IOException
Ждет входящего клиента. Этот метод блокируется до тех пор, пока клиент не подключится к серверу на указанном порту или не истечет время ожидания сокета, при условии, что значение времени ожидания было установлено с помощью метода setSoTimeout (). В противном случае этот метод блокируется на неопределенный срок.
public void setSoTimeout (int timeout)
Устанавливает значение времени ожидания для того, как долго сокет сервера ожидает клиента во время accept ().
public void bind (хост SocketAddress, int backlog)
Связывает сокет с указанным сервером и портом в объекте SocketAddress. Используйте этот метод, если вы создали экземпляр ServerSocket с помощью конструктора без аргументов.
Когда ServerSocket вызывает accept (), метод не возвращается, пока клиент не подключится. После того, как клиент все-таки подключится, ServerSocket создает новый сокет для неуказанного порта и возвращает ссылку на этот новый сокет. Теперь между клиентом и сервером существует TCP-соединение, и связь может начаться.
Методы класса сокета
Класс java.net.Socket представляет собой сокет, который клиент и сервер используют для связи друг с другом. Клиент получает объект Socket, создав его экземпляр, тогда как сервер получает объект Socket из возвращаемого значения метода accept ().
Класс Socket имеет пять конструкторов, которые клиент использует для подключения к серверу.
Sr.No. | Метод и описание |
---|---|
1 |
public Socket (String host, int port) генерирует исключение UnknownHostException, IOException. Этот метод пытается подключиться к указанному серверу через указанный порт. Если этот конструктор не выдает исключение, соединение установлено успешно, и клиент подключен к серверу. |
2 |
public Socket (InetAddress host, int port) выдает IOException Этот метод идентичен предыдущему конструктору, за исключением того, что хост обозначается объектом InetAddress. |
3 |
public Socket (String host, int port, InetAddress localAddress, int localPort) выдает IOException. Подключается к указанному хосту и порту, создавая сокет на локальном хосте по указанному адресу и порту. |
4 |
public Socket (хост InetAddress, int-порт, InetAddress localAddress, int localPort) выдает IOException. Этот метод идентичен предыдущему конструктору, за исключением того, что хост обозначается объектом InetAddress вместо String. |
5 |
общедоступный сокет () Создает неподключенный сокет. Используйте метод connect () для подключения этого сокета к серверу. |
public Socket (String host, int port) генерирует исключение UnknownHostException, IOException.
Этот метод пытается подключиться к указанному серверу через указанный порт. Если этот конструктор не выдает исключение, соединение установлено успешно, и клиент подключен к серверу.
public Socket (InetAddress host, int port) выдает IOException
Этот метод идентичен предыдущему конструктору, за исключением того, что хост обозначается объектом InetAddress.
public Socket (String host, int port, InetAddress localAddress, int localPort) выдает IOException.
Подключается к указанному хосту и порту, создавая сокет на локальном хосте по указанному адресу и порту.
public Socket (хост InetAddress, int-порт, InetAddress localAddress, int localPort) выдает IOException.
Этот метод идентичен предыдущему конструктору, за исключением того, что хост обозначается объектом InetAddress вместо String.
общедоступный сокет ()
Создает неподключенный сокет. Используйте метод connect () для подключения этого сокета к серверу.
Когда конструктор Socket возвращается, он не просто создает экземпляр объекта Socket, но фактически пытается подключиться к указанному серверу и порту.
Некоторые методы, представляющие интерес для класса Socket, перечислены здесь. Обратите внимание, что и клиент, и сервер имеют объект Socket, поэтому эти методы могут вызываться как клиентом, так и сервером.
Sr.No. | Метод и описание |
---|---|
1 |
public void connect (хост SocketAddress, int timeout) выдает IOException Этот метод подключает сокет к указанному хосту. Этот метод необходим только при создании экземпляра Socket с помощью конструктора без аргументов. |
2 |
public InetAddress getInetAddress () Этот метод возвращает адрес другого компьютера, к которому подключен этот сокет. |
3 |
public int getPort () Возвращает порт, к которому привязан сокет на удаленной машине. |
4 |
public int getLocalPort () Возвращает порт, к которому привязан сокет на локальной машине. |
5 |
public SocketAddress getRemoteSocketAddress () Возвращает адрес удаленного сокета. |
6 |
public InputStream getInputStream () генерирует IOException Возвращает входной поток сокета. Входной поток подключен к выходному потоку удаленного сокета. |
7 |
public OutputStream getOutputStream () бросает IOException Возвращает выходной поток сокета. Выходной поток подключен к входному потоку удаленного сокета. |
8 |
public void close () выбрасывает IOException Закрывает сокет, что делает этот объект Socket больше не способным снова подключаться к любому серверу. |
public void connect (хост SocketAddress, int timeout) выдает IOException
Этот метод подключает сокет к указанному хосту. Этот метод необходим только при создании экземпляра Socket с помощью конструктора без аргументов.
public InetAddress getInetAddress ()
Этот метод возвращает адрес другого компьютера, к которому подключен этот сокет.
public int getPort ()
Возвращает порт, к которому привязан сокет на удаленной машине.
public int getLocalPort ()
Возвращает порт, к которому привязан сокет на локальной машине.
public SocketAddress getRemoteSocketAddress ()
Возвращает адрес удаленного сокета.
public InputStream getInputStream () генерирует IOException
Возвращает входной поток сокета. Входной поток подключен к выходному потоку удаленного сокета.
public OutputStream getOutputStream () бросает IOException
Возвращает выходной поток сокета. Выходной поток подключен к входному потоку удаленного сокета.
public void close () выбрасывает IOException
Закрывает сокет, что делает этот объект Socket больше не способным снова подключаться к любому серверу.
Методы класса InetAddress
Этот класс представляет IP-адрес. Вот следующие полезные методы, которые вам понадобятся при программировании сокетов:
Sr.No. | Метод и описание |
---|---|
1 |
статический InetAddress getByAddress (byte [] addr) Возвращает объект InetAddress с учетом необработанного IP-адреса. |
2 |
статический InetAddress getByAddress (String host, byte [] addr) Создает InetAddress на основе предоставленного имени хоста и IP-адреса. |
3 |
статический InetAddress getByName (Строка хоста) Определяет IP-адрес хоста, учитывая имя хоста. |
4 |
Строка getHostAddress () Возвращает строку IP-адреса в текстовом представлении. |
5 |
Строка getHostName () Получает имя хоста для этого IP-адреса. |
6 |
статический InetAddress InetAddress getLocalHost () Возвращает локальный хост. |
7 |
Строка toString () Преобразует этот IP-адрес в строку. |
статический InetAddress getByAddress (byte [] addr)
Возвращает объект InetAddress с учетом необработанного IP-адреса.
статический InetAddress getByAddress (String host, byte [] addr)
Создает InetAddress на основе предоставленного имени хоста и IP-адреса.
статический InetAddress getByName (Строка хоста)
Определяет IP-адрес хоста, учитывая имя хоста.
Строка getHostAddress ()
Возвращает строку IP-адреса в текстовом представлении.
Строка getHostName ()
Получает имя хоста для этого IP-адреса.
статический InetAddress InetAddress getLocalHost ()
Возвращает локальный хост.
Строка toString ()
Преобразует этот IP-адрес в строку.
Пример Socket Client
Следующий GreetingClient — это клиентская программа, которая подключается к серверу с помощью сокета и отправляет приветствие, а затем ожидает ответа.
пример
// File Name GreetingClient.java import java.net.*; import java.io.*; public class GreetingClient { public static void main(String [] args) { String serverName = args[0]; int port = Integer.parseInt(args[1]); try { System.out.println("Connecting to " + serverName + " on port " + port); Socket client = new Socket(serverName, port); System.out.println("Just connected to " + client.getRemoteSocketAddress()); OutputStream outToServer = client.getOutputStream(); DataOutputStream out = new DataOutputStream(outToServer); out.writeUTF("Hello from " + client.getLocalSocketAddress()); InputStream inFromServer = client.getInputStream(); DataInputStream in = new DataInputStream(inFromServer); System.out.println("Server says " + in.readUTF()); client.close(); } catch (IOException e) { e.printStackTrace(); } } }
Пример сокет-сервера
Следующая программа GreetingServer является примером серверного приложения, которое использует класс Socket для прослушивания клиентов по номеру порта, указанному в аргументе командной строки:
пример
// File Name GreetingServer.java import java.net.*; import java.io.*; public class GreetingServer extends Thread { private ServerSocket serverSocket; public GreetingServer(int port) throws IOException { serverSocket = new ServerSocket(port); serverSocket.setSoTimeout(10000); } public void run() { while(true) { try { System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "..."); Socket server = serverSocket.accept(); System.out.println("Just connected to " + server.getRemoteSocketAddress()); DataInputStream in = new DataInputStream(server.getInputStream()); System.out.println(in.readUTF()); DataOutputStream out = new DataOutputStream(server.getOutputStream()); out.writeUTF("Thank you for connecting to " + server.getLocalSocketAddress() + "\nGoodbye!"); server.close(); } catch (SocketTimeoutException s) { System.out.println("Socket timed out!"); break; } catch (IOException e) { e.printStackTrace(); break; } } } public static void main(String [] args) { int port = Integer.parseInt(args[0]); try { Thread t = new GreetingServer(port); t.start(); } catch (IOException e) { e.printStackTrace(); } } }
Скомпилируйте клиент и сервер, а затем запустите сервер следующим образом:
$ java GreetingServer 6066 Waiting for client on port 6066...
Проверьте клиентскую программу следующим образом —