Socket, также известный как сокеты, является одной из основных технологий для коммуникации компьютерной сети. Сегодня большинство веб-программного обеспечения, такое как браузеры, инструменты обмена мгновенными сообщениями и даже загрузки P2P, реализованы на основе сокета. В этой статье будет представлена программирование сокетов на основе TCP/IP и как написать клиентскую/серверную программу.
Предварительный десерт
Система ввода и вывода Unix (IO) следует за рабочими шаблонами, такими как открытая записка. Перед тем, как пользовательский процесс выполняет операции ввода -вывода, он должен вызовать открыть, чтобы указать и получить разрешения на работу файла или устройства для чтения или записи. После открытия объекта операции ввода -вывода пользовательский процесс может выполнять одну или несколько операций чтения или записи на объекте. Операция чтения используется для чтения данных из операционных объектов IO и передачи данных в пользовательский процесс. Операция записи используется для передачи данных (записать) в пользовательских процессах в эксплуатационные объекты. В конце концов, операции чтения и записи завершены, пользовательский процесс должен вызовать близкую, чтобы уведомить систему, что она завершает использование объекта IO.
Когда UNIX начал поддерживать межпроцессную связь (IPC), интерфейс IPC был разработан для того, чтобы быть аналогичным операционному интерфейсу файла. В UNIX в процессе будет набор дескрипторов IO, которые можно прочитать и записано. Дескриптор IO может быть файлом, устройством или каналом связи (гнездо). Дескриптор файла состоит из трех частей: создание (открытие сокета), чтение и написание данных (принятие и отправка в сокет) и уничтожение (закрытие сокета).
В системах UNIX, BSD-подобная версия интерфейса IPC реализована как слой над протоколами TCP и UDP. Пункт назначения сообщения представлен адресом сокета. Адрес сокета - это идентификатор связи, состоящий из сетевого адреса и номер порта.
Межпроцессские операции связи требуют пары розетков. Межпроцессная связь осуществляется путем передачи данных между одним сокетом в одном процессе и другим гнездом в другом процессе. Когда сообщение выполняется и отправляется, сообщение в очередь в очереди на отправке, пока сетевой протокол нижнего уровня не отправит сообщения. Когда сообщение достигнет гнезда на приемном конце, оно также будет в очереди, пока процесс на приемном конце не получит сообщение.
TCP и UDP Communication
Что касается программирования сокетов, у нас есть два протокола связи на выбор. Одним из них является общение с Datagram, а другой - Stream Communication.
Коммуникация Datagram
Протокол связи Datagram - это то, что мы часто называем UDP (протокол пользовательских данных). UDP - это протокол без соединения, что означает, что каждый раз, когда мы отправляем DataGrams, нам нужно одновременно отправлять дескриптор сокета нативного машины и дескриптор сокета приемника. Поэтому нам нужно отправлять дополнительные данные каждый раз, когда мы общаемся.
Поток связи
Протокол связи потока, также известный как TCP (протокол управления передачи), также называется TCP (протокол управления передачи). В отличие от UDP, TCP является протоколом на основе подключения. Перед использованием потоковой связи мы должны установить связь между парой коммуникации сокетов. Один из розеток служит сервером для прослушивания запросов на соединение. Другой делает запросы на соединение в качестве клиента. Как только два розета установили соединение, они могут передавать данные в одностороннем или двухстороннем.
Прочитав это, у нас есть несколько вопросов о том, используем ли мы UDP или TCP для программирования сокетов. Выбор программирования сокетов, основанный на том, какой протокол основан на вашем конкретном сценарии приложения, зависит от вашей конкретной программы клиентского сервера. Ниже мы кратко проанализируем разницу между протоколами TCP и UDP, которые могут помочь вам лучше выбрать, какой из них использовать.
В UDP каждый раз, когда отправляется датаграмма, необходимо включить дескриптор сокета нативной машины и дескриптор сокета приемника. Поскольку TCP является протоколом на основе соединений, между парами коммуникаций необходимо установить соединение, поэтому в протоколе TCP будет проходить много времени программирование подключения.
В UDP данные Datagram имеют предел 64 КБ в размере. В TCP нет такого ограничения. После того, как пара сокетов связи TCP установит соединение, связь между ними аналогична потоку ввода -навода, и все данные будут прочитаны в порядке, который оно будет принято.
UDP является ненадежным протоколом, и отправленные дейтаграммы не обязательно принимаются принимающим гнетом в том порядке, в котором они отправляются. Тогда TCP является надежным протоколом. Заказ пакетов, полученных приемным концом, согласуется с заказом пакетов на отправке.
Короче говоря, TCP подходит для сетевых служб, таких как удаленный логин (Rlogin, Telnet) и передача файлов (FTP). Потому что размер этих данных, которые необходимо передавать, неясен. UDP проще и легче TCP. UDP используется для внедрения некоторых услуг, которые более в режиме реального времени или не имеют значения потери пакетов. Скорость потери пакетов UDP в LAN относительно низкая.
Программирование сокетов на Java
В следующем разделе я объясню, как использовать сокет для написания клиентских и серверных программ с помощью некоторых примеров.
Примечание. В следующем примере я буду использовать программирование сокетов на основе протокола TCP/IP, потому что этот протокол используется гораздо более широко, чем UDP/IP. И все классы, связанные с сокетами, расположены в пакете Java.net, поэтому нам нужно представить этот пакет, когда мы выполняем программирование сокетов.
Написание клиента
Включите розетку
Если вы находитесь на стороне клиента, вам нужно написать следующий код, чтобы открыть розетку.
String host = "127.0.0.1"; int port = 8919; Socket Client = New Socket (Host, Port);
В приведенном выше коде хост - это машина, к которой необходимо подключиться клиенту, а порт - это порт, используемый сервером для прослушивания запроса. При выборе порта одна вещь, на которую вам нужно обратить внимание, это то, что такие порты, как 0 ~ 1023, были зарезервированы системой. Эти порты используются некоторыми часто используемыми службами, такими как Mail, FTP и HTTP. Когда вы пишете код на стороне сервера и выбираете порт, выберите порт более 1023.
Напишите данные
Далее следует написать данные запроса. Мы получаем объект outputstream из объекта сокета клиента, а затем запишем данные. Очень похоже на код обработки ввода -вывода.
public class clientsocket {public static void main (string args []) {string host = "127.0.0.1"; int port = 8919; try {socket client = new Socket (host, port); Writer writer = new outputstreamwriter (client.getOutputStream ()); writer.write ("Привет от клиента"); writer.flush (); writer.close (); client.close (); } catch (ioException e) {e.printstackTrace (); }}}Закрыть объект IO
Подобно файлу io, после прочтения и написания данных, мы должны закрыть объект IO, чтобы обеспечить правильный выпуск ресурсов.
Серверная написание
Откройте сокет на стороне сервера
int port = 8919; serversocket server = new Serversocket (порт); Socket Socket = server.accep ();
Приведенный выше код создает гнездо на стороне сервера, а затем вызывает метод принятия, чтобы прослушать и получить сокет запроса клиента. Метод принятия - это метод блокировки, который ожидает блокировки до тех пор, пока соединение не будет выполнено между сервером и клиентом.
Прочитать данные
Получите объект InputStream через объект сокета, полученный выше, а затем установите файл io для чтения данных. Здесь мы распечатываем контент.
public class serverclient {public static void main (string [] args) {int port = 8919; try {serversocket server = new serversocket (port); Сокет сокет = server.accept (); Reader Reader = new InputStreamReader (socket.getInputStream ()); char chars [] = new char [1024]; int len; StringBuilder Builder = new StringBuilder (); while ((len = reader.read (chars))! = -1) {builder.append (new String (chars, 0, len)); } System.out.println ("Получить от клиентского сообщения =:" + builder); reader.close (); Socket.Close (); server.close (); } catch (Exception e) {e.printstackTrace (); }}}Закрыть объект IO
Это не может быть забыто. Наконец, мне нужно правильно закрыть объект IO, чтобы обеспечить правильный выпуск ресурсов.
Обратите внимание на пример
Здесь мы добавляем пример, используя Socket для реализации сервера Echo, то есть сервер передаст данные, отправленные клиентом обратно клиенту. Код очень прост.
импортировать java.io.*; import java.net.*; Строка; DataInputStream IS; PrintStream OS; Socket Clientsocket = null; // Попробуйте открыть сокет сервера на порту 9999 // Обратите внимание, что мы не можем выбрать порт менее 1023, если мы не являемся // привилегированными пользователями (root) Try {echoserver = New Serversocket (9999); } catch (ioException e) {System.out.println (e); } // Создать объект сокета из Serversocket, чтобы прослушать и принять // соединения. // Открыть потоки ввода и вывода Try {clientocket = echoserver.accept (); is = new DataInputStream (clientsocket.getInputStream ()); OS = New PrintStream (clientsocket.getOutputStream ()); // до тех пор, пока мы получаем данные, повторяют, что данные обратно клиенту. while (true) {line = is.readline (); Os.println (Line); }} catch (ioException e) {System.out.println (e); }}}Скомпилируйте и запустите приведенный выше код и сделайте следующий запрос, вы можете увидеть содержимое данных, передаваемых запросом клиента.
15:00 $ curl http://127.0.0.1:9999/?111get/?
Суммировать
Довольно интересно выполнять программирование клиентского сервера, а программирование сокетов на Java проще и быстрее, чем другие языки (такие как C).
Пакет Java.net содержит много мощных и гибких классов для разработчиков для программных сетей. При программировании сети рекомендуется использовать API под этим пакетом. В то же время пакет Sun.* также содержит много классов, связанных с сетевым программированием, но не рекомендуется использовать API под этим пакетом, потому что этот пакет может измениться. Кроме того, этот пакет не может быть гарантированно включен на все платформы.
Выше приведено сборник информации о сокетах Java. Мы будем продолжать добавлять соответствующие знания в будущем. Спасибо за поддержку этого сайта!