Новые книги

Как придумать удачный дизайн? И как оценить качество дизайна? На эти вопросы отвечает Чип Кидд – знаменитый книжный дизайнер и один из самых остроумных спикеров ТЕД. В отличие от “просто” искусства, дизайн всегда решает какую-то конкретную проблему. Как сделать максимально понятным дорожный знак? Как нарисовать обложку, которая превратит книгу в бестселлер? Как придумать остроумный и подкупающий рекламный слоган? И как не поддаться соблазну циничной манипуляции, инструментом которой подчас становится дизайн (“Разумеется, это полезный продукт! Смотрите – на упаковке нарисована морковка!”)? К счастью, нам не обязательно быть дизайнерами, чтобы оценить, насколько хорошо дизайн решает проблемы. Ведь это наши проблемы.

В формате pdf A4 сохранен издательский дизайн.
Подумайте, сколько ценной информации хранится на вашем компьютере – начиная с достаточно безобидных сведений о вас и вашей работе и заканчивая действительно конфиденциальными данными (пароли к кредитным картам, финансовые документы, личная переписка и т. д.). А теперь представьте, что ваш компьютер взломали и вся зга информация стала доступна посторонним людям. Или злобный вирус уничтожил половину содержимого жесткого диска, и вы потеряли готовый проект, который необходимо сдавать через два дня. Представили? Понравилось?

Самое страшное, что эти случаи – вовсе не фантастика. Достаточно пару раз пренебречь несложными правилами компьютерной безопасности – и злоумышленнику не составит никакого труда получить доступ ко всей вашей информации, а вирусы будут плодиться на вашем компьютере один за другим. Согласитесь, вам есть что терять – и есть что защищать.

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

Использование датаграммных сокетов

Использование датаграммных сокетов

Оглавление

Сетевые приложения
Адрес IP
Адрес URL
Класс URL
Сокеты
Потоковые сокеты
Класс Socket
Датаграммные сокеты
Связь с Web
Аплет ShowChart
Приложения SocketServ и SocketClient
Аплет Form

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

Для работы с датаграммными сокетами приложение должно создать сокет на базе класса DatagramSocket, а также подготовить объект класса DatagramPacket, в который будет записан принятый от партнера по сети блок данных.

Канал, а также входные и выходные потоки создавать не нужно. Данные передаются и принимаются методами send и receive, определенными в классе DatagramSocket.

Класс DatagramSocket

Рассмотрим конструкторы и методы класса DatagramSocket, предназначенного для создания и использования датаграммных сокетов.

В классе DatagramSocket определены два конструктора, прототипы которых представлены ниже:

public DatagramSocket(int port);
public DatagramSocket();

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

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

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

Кстати, с помощью метода getLocalPort приложение всегда может узнать номер порта, закрепленного за данным сокетом:

public int getLocalPort();

Прием и передача данных на датаграммном сокете выполняется с помощью методов receive и send, соответственно:

public void receive(DatagramPacket p);
public void send(DatagramPacket p);

В качестве параметра этим методам передается ссылка на пакет данных (соответственно, принимаемый и передаваемый), определенный как объект класса DatagramPacket. Этот класс будет рассмотрен позже.

Еще один метод в классе DatagramSocket, которым вы будете пользоваться, это метод close, предназначенный для закрытия сокета:

public void close();

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

Класс DatagramPacket

Перед тем как принимать или передавать данные с использованием методов receive и send вы должны подготовить объекты класса DatagramPacket. Метод receive запишет в такой объект принятые данные, а метод send - перешлет данные из объекта класса DatagramPacket узлу, адрес которого указан в пакете.

Подготовка объекта класса DatagramPacket для приема пакетов выполняется с помощью следующего конструктора:

public DatagramPacket(byte ibuf[],
 int ilength);

Этому конструктору передается ссылка на массив ibuf, в который нужно будет записать данные, и размер этого массива ilength.

Если вам нужно подготовить пакет для передачи, воспользуйтесь конструктором, который дополнительно позволяет задать адрес IP iaddr и номер порта iport узла назначения:

public DatagramPacket(byte ibuf[],
  int ilength,
  InetAddress iaddr, int iport);

Таким образом, информация о том, в какой узел и на какой порт необходимо доставить пакет данных, хранится не в сокете, а в пакете, то есть в объекте класса DatagramPacket.

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

Метод getData возвращает ссылку на массив данных пакета:

public byte[] getData();

Размер пакета, данные из которого хранятся в этом массиве, легко определить с помощью метода getLength:

public int getLength();

Методы getAddress и getPort позволяют определить адрес и номер порта узла, откуда пришел пакет, или узла, для которого предназначен пакет:

public InetAddress getAddress();
public int getPort();

Если вы создаете клиент-серверную систему, в которой сервер имеет заранее известный адрес и номер порта, а клиенты - произвольные адреса и различные номера портов, то после получения пакета от клиента сервер может определить с помощью методов getAddress и getPort адрес клиента для установления с ним связи.

Если же адрес сервера неизвестен, клиент может посылать широковещательные пакеты, указав в объекте класса DatagramPacket адрес сети. Такая методика обычно используется в локальных сетях.

Как указать адрес сети?

Напомним, что адрес IP состоит из двух частей - адреса сети и адреса узла. Для разделения компонент 32-разрядного адреса IP используется 32-разрядная маска, в которой битам адреса сети соответствуют единицы, а битам адреса узла - нули.

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