Чтение онлайн

на главную - закладки

Жанры

Программирование на Java

Вязовик Н.А.

Шрифт:

try {

ServerSocket ss = new ServerSocket(3456);

Socket client=ss.accept;

// Метод не возвращает

// управление, пока не подключится клиент

}

catch (IOException e) {

e.printStackTrace;

}

Клиент для подключения к серверу также использует класс Socket. Его простейший конструктор принимает два параметра - адрес сервера (в виде строки, или экземпляра InetAddress ) и номер порта. Если сервер принял запрос, то сокет конструируется успешно и далее можно воспользоваться методами getInputStream или getOutputStream.

try {

Socket s = new Socket("localhost", 3456);

InputStream is = s.getInputStream;

is.read;

}

catch (UnknownHostException e) {

e.printStackTrace;

}

catch (IOException e) {

e.printStackTrace;

}

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

На стороне сервера класс Socket используется точно таким же образом – через методы getInputStream и getOutputStream. Приведем более полный пример:

import java.io.*;

import java.net.*;

public class Server {

public static void main(String args[]) {

try {

ServerSocket ss = new ServerSocket(3456);

System.out.println("Waiting...");

Socket client=ss.accept;

System.out.println("Connected");

client.getOutputStream.write(10);

client.close;

ss.close;

}

catch (IOException e) {

e.printStackTrace;

}

}

}

Сервер по запросу клиента отправляет число 10 и завершает работу. Обратите внимание, что при завершении вызываются методы close для открытых сокетов.

Класс клиента:

import java.io.*;

import java.net.*;

public class Client {

public static void main(String args[]) {

try {

Socket s = new Socket("localhost", 3456);

InputStream is = s.getInputStream;

System.out.println("Read: "+is.read);

s.close;

}

catch (UnknownHostException e) {

e.printStackTrace;

}

catch (IOException e) {

e.printStackTrace;

}

}

}

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

Рассмотрим эти классы более подробно. Во-первых, класс ServerSocket имеет конструктор, в который передается, кроме номера порта, еще и адрес машины. Это может показаться странным, ведь сервер открывается на той же машине, где работает программа, зачем специально указывать ее адрес? Однако, если компьютер имеет несколько сетевых интерфейсов ( сетевых карточек ), то он имеет и несколько сетевых адресов. С помощью такого детализированного конструктора можно указать, по какому именно адресу ожидать подключения. Это должен быть именно локальный адрес машины, иначе возникнет ошибка.

Аналогично, класс Socket имеет расширенный конструктор для указания как локального адреса, с которого будет устанавливаться соединение, так и локального порта (иначе операционная система выделяет произвольный свободный порт).

Во-вторых, можно воспользоваться методом setSoTimeout(int timeout) класса ServerSocket, чтобы указать время в миллисекундах, на протяжении которого нужно ожидать подключение клиента. Это позволяет серверу не "зависать", если никто не пытается начать с ним работать. Тайм-аут задается в миллисекундах, нулевое значение означает бесконечное время ожидания.

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

import java.io.*;

import java.net.*;

public class NetServer {

public static final int PORT = 2500;

private static final int TIME_SEND_SLEEP = 100;

private static final int COUNT_TO_SEND = 10;

private ServerSocket servSocket;

public static void main(String[] args) {

NetServer server = new NetServer;

server.go;

}

public NetServer {

try {

servSocket = new ServerSocket(PORT);

}

catch(IOException e) {

System.err.println("Unable to open Server Socket : " + e.toString);

}

}

public void go {

// Класс-поток для работы с

//подключившимся клиентом

class Listener implements Runnable {

Socket socket;

public Listener(Socket aSocket) {

socket = aSocket;

}

public void run {

try {

System.out.println("Listener started");

int count = 0;

OutputStream out = socket.getOutputStream;

OutputStreamWriter writer = new

OutputStreamWriter(out);

PrintWriter pWriter = new PrintWriter(writer);

while (count<COUNT_TO_SEND) {

count++;

pWriter.print(((count>1)?",":"")+ "Say" + count);

sleeps(TIME_SEND_SLEEP);

}

pWriter.close;

}

catch(IOException e) {

System.err.println("Exception : " + e.toString);

}

}

}

// Основной поток, циклически выполняющий метод accept

System.out.println("Server started");

while (true) {

try {

Socket socket = servSocket.accept;

Listener listener = new Listener(socket);

Поделиться:
Популярные книги

Как я строил магическую империю 7

Зубов Константин
7. Как я строил магическую империю
Фантастика:
попаданцы
постапокалипсис
аниме
фантастика: прочее
5.00
рейтинг книги
Как я строил магическую империю 7

Моров. Том 3

Кощеев Владимир
2. Моров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Моров. Том 3

Кодекс Охотника. Книга XXXIV

Винокуров Юрий
34. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXXIV

Сильнейший Столп Империи. Книга 4

Ермоленков Алексей
4. Сильнейший Столп Империи
Фантастика:
фэнтези
аниме
фантастика: прочее
попаданцы
5.00
рейтинг книги
Сильнейший Столп Империи. Книга 4

В теле пацана

Павлов Игорь Васильевич
1. Великое плато Вита
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
В теле пацана

Бояръ-Аниме. Романов. Том 3

Кощеев Владимир
2. Романов
Фантастика:
фэнтези
альтернативная история
6.57
рейтинг книги
Бояръ-Аниме. Романов. Том 3

Двойник короля 21

Скабер Артемий
21. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 21

Кровь на эполетах

Дроздов Анатолий Федорович
3. Штуцер и тесак
Фантастика:
альтернативная история
7.60
рейтинг книги
Кровь на эполетах

Черный Маг Императора 17

Герда Александр
17. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Черный Маг Императора 17

Как я строил магическую империю

Зубов Константин
1. Как я строил магическую империю
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Как я строил магическую империю

Газлайтер. Том 8

Володин Григорий
8. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 8

Мажор. Дилогия.

Соколов Вячеслав Иванович
Фантастика:
боевая фантастика
8.05
рейтинг книги
Мажор. Дилогия.

Шайтан Иван 3

Тен Эдуард
3. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
7.17
рейтинг книги
Шайтан Иван 3

Страж Кодекса. Книга II

Романов Илья Николаевич
2. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Страж Кодекса. Книга II