• Открытие сокета.
• Открытие потока ввода и/или потока вывода для сокета.
• Чтение и запись в потоки согласно установленному протоколу общения с сервером.
• Закрытие потоков ввода-вывода.
• Закрытие сокета.
Пример 67.
import java.io.*;
import java.net.*;
public class EchoClient {
public static void main(String[] args) throws IOException {
Socket echoSocket = null;
PrintWriter out = null;
BufferedReader in = null;
try {
echoSocket = new Socket("taranis", 7);
out = new PrintWriter(echoSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(
echoSocket.getInputStream()));
} catch (UnknownHostException e) {
System.err.println("Don't know about host: taranis.");
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection to:" +
"taranis.");
System.exit(1);
}
BufferedReader stdIn = new BufferedReader(
new InputStreamReader(System.in));
String userInput;
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput);
System.out.println("echo: " + in.readLine());
}
out.close();
in.close();
stdIn.close();
echoSocket.close();
}
}
Класс ServerSocket
• Реализует серверный сокет и его функции
• Конструкторы
– ServerSocket()
– ServerSocket(int port)
– ServerSocket(int port, int backlog)
• Методы
– void close() – закрывает используемый сокет
– Socket accept() – приостагавливает выполнение программы и ожидает обращения клиента
– void bind(SocketAddress endpoint)
– И прочие…
Пример 68.
try {
serverSocket = new ServerSocket(4444);
} catch (IOException e) {
System.out.println(
"Could not listen on port: 4444");
System.exit(-1);
}
Socket clientSocket = null;
try {
clientSocket = serverSocket.accept();
} catch (IOException e) {
System.out.println("Accept failed: 4444");
System.exit(-1);
}
Сервер параллельной обработки запросов
Рисунок 43. Сервер параллельной обработки запросов
Дейтаграммы
Дейтаграмма – независимое, самодостаточное сообщение, посылаемое по сети, чья доставка, время (порядок) доставки и содержимое не гарантируются. Могут использоваться как для адресной, так и для широковещательной рассылки.
Рисунок 44. Передача дейтаграмм
DatagramPacket
• Экземпляры являются прототипами дейтаграмм-сообщений
• Конструкторы
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
И прочие…
• Методы
– byte[] getData()
– int getLength()
– int getOffset()
– SocketAddress getSocketAddress()
– void setSocketAddress(SocketAddress address)
– void setData(byte[] buf, int offset, int length)
– И прочие…
DatagramSocket
• Экземпляры являются не ориентированными на соединение сокетами
• Конструкторы
DatagramSocket()
DatagramSocket(int port, InetAddress laddr)
И другие…
• Методы
void bind(SocketAddress addr)
void close()
void connect(InetAddress address, int port)
void send(DatagramPacket p)
void receive(DatagramPacket p)
И другие…
Uniform Resource Locator
• URL – адрес ресурса в Интернет
• Имя протокола
Протокол, используемый для связи
• Имя хоста
Имя компьютера, на котором расположен ресурс
• Имя файла
Путь к файлу на компьютере
• Номер порта
Номер порта для соединения (необязателен, если порт не указан, то используется значение по умолчанию для указанного протокола)
• Ссылка
Ссылка на именованный якорь (необязательна)
• Может быть абсолютным и относительным
URL gamelan = new URL("http", "www.gamelan.com", 80, "pages/Gamelan.network.html");
Для простого извлечения содержимого заданного ресурса достаточно использовать метод openStream() класса URL. Этот метод возвращает объект InputStream. Прямое чтение из URL – пример 69.
Пример 69.
import java.net.*;
import java.io.*;
public class URLReader {
public static void main(String[] args) throws Exception
{
URL yahoo = new URL("http://www.yahoo.com/");
BufferedReader in = new BufferedReader(
new InputStreamReader(
yahoo.openStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
}
}
Для получения дополнительной информации о ресурсе потребуется использовать класс URLConnection, который предоставляет гораздо больше средств управления доступом к Web-ресурсам. Для получения объекта URLConnection нужно вызвать метод openConnection() класса URL. Чтение из URL-соединения – пример 70.
Пример 70.
import java. net.*;
import java. io.*;
public class URLConnectionReader {
public static void main( String[] args) throws Exception
{
URL yahoo = new URL("http://www.yahoo.com/");
URLConnection yc = yahoo.openConnection();
BufferedReader in = new BufferedReader(
new InputStreamReader(
yc.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
}
}
Существует несколько методов класса URLConnection, предназаначеннных для указания свойств соединения ещё до подключения к серверу. По умолчанию соединение получает входной поток для чтения, но не получает выходной поток для записи. Для получения выходного потока нужно вызвать метод setDoOutput(true). Запись в URL-соединение – пример 71.
Пример 71.
import java. io.*;
import java. net.*;
public class Reverse {
public static void main( String[] args) throws Exception {
if (args.length != 1) {
System.err.println("Usage: java Reverse" +
"string_to_reverse");
System.exit(1);
}
String stringToReverse = URLEncoder.encode(args[0], “US-ASCII”);
URL url = new URL("http://java.sun.com/cgi-bin/backwards");
URLConnection connection = url.openConnection();
connection.setDoOutput(true);
PrintWriter out = new PrintWriter(
connection.getOutputStream());
out.println("string=" + stringToReverse);
out.close();
BufferedReader in = new BufferedReader(
new InputStreamReader(
connection.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine); in.close();
}
}
Нововведения Java 5.0
• Статический импорт
• Автоупаковка и автораспаковка (автобоксинг)
• Аргументы переменной длины
• Настраиваемые типы
• Улучшенный цикл for
• Перечислимые типы
• Метаданные
• Форматированный ввод/вывод
• Изменения пакетов
Статический импорт
Статический импорт (static import) расширяет возможности ключевого слова import. Оператор языка import, снабженный ключевым словом static, следующим за ключевым словом import, может применяться для импорта статических членов класса или интерфейса. Благодаря наличию статического импорта стало возможным ссылаться на статические члены непосредственно по их именам без уточнения имени их класса. Это упрощает и сокращает синтаксис обращения к статическому члену.
В приведенном ниже фрагменте кода вычисляется гипотенуза прямоугольного треугольника. В программе используются два статических метода из встроенного в язык Java класса Math, являющегося частью пакета Java.lang. Первый метод, Math.pow(), возвращает значение, возведенное в определенную степень. Второй — Math.sqrt() — возвращает квадратный корень своего аргумента. Поскольку pow() и sqrt() — статические методы, они должны вызываться с использованием имени их класса, Math. Благодаря использованию статического импорта, вы можете избавиться от обязательного указания имени класса в подобных ситуациях.
Имеется:
hypot = Math.sqrt(Math.pow(side1, 2) + Math.pow(side2, 2));
Хотелось бы:
hypot = sqrt(pow(side1, 2) + pow(side2, 2));
Существуют два варианта синтаксической записи оператора import static. Первый вариант импортирует единичное имя.
Импорт элемента типа
Дата: 2019-02-19, просмотров: 272.