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

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

Жанры

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

Вязовик Н.А.

Шрифт:

Thread thread = new Thread(listener);

thread.start;

}

catch(IOException e) {

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

}

}

}

public void sleeps(long time) {

try {

Thread.sleep(time);

}

catch(InterruptedException e) {

}

}

}

Пример 16.2.

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

import java.io.*;

import java.net.*;

public class NetClient implements Runnable {

public static final int PORT = 2500;

public static final String HOST = "localhost";

public static final int CLIENTS_COUNT = 5;

public static final int READ_BUFFER_SIZE = 10;

private String name = null;

public static void main(String[] args) {

String name = "name";

for (int i=1; i<=CLIENTS_COUNT; i++) {

NetClient client = new NetClient(name+i);

Thread thread = new Thread(client);

thread.start;

}

}

public NetClient(String name) {

this.name = name;

}

public void run {

char[] readed = new char[READ_BUFFER_SIZE];

StringBuffer strBuff = new StringBuffer;

try {

Socket socket = new Socket(HOST, PORT);

InputStream in = socket.getInputStream;

InputStreamReader reader = new InputStreamReader(in);

while (true) {

int count = reader.read(readed, 0, READ_BUFFER_SIZE);

if (count==-1) break; strBuff.append(readed, 0, count);

Thread.yield;

}

}

catch (UnknownHostException e) {

e.printStackTrace;

}

catch (IOException e) {

e.printStackTrace;

}

System.out.println("client " + name + " read : " + strBuff.toString);

}

}

Пример 16.3.

Теперь рассмотрим UDP. Для работы с этим протоколом и на стороне клиента, и на стороне сервера используется класс DatagramSocket. У него есть следующие конструкторы:

DatagramSocket

DatagramSocket(int port)

DatagramSocket(int port, InetAddress laddr)

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

После открытия сокетов начинается обмен датаграммами. Они представляются экземплярами класса DatagramPacket. При отсылке сообщения применяется следующий конструктор:

DatagramPacket(byte[] buf, int length,

InetAddress address, int port)

Массив содержит данные для отправки (созданный пакет будет иметь длину, равную length ), а адрес и порт указывают получателя пакета. После этого вызывается метод send класса DatagramSocket.

try {

DatagramSocket s = new DatagramSocket;

byte data[]= {1, 2, 3};

InetAddress addr = InetAddress.getByName("localhost");

DatagramPacket p =

new DatagramPacket(data, 3, addr, 3456);

s.send(p);

System.out.println("Datagram sent");

s.close;

}

catch (SocketException e) {

e.printStackTrace;

}

catch (UnknownHostException e) {

e.printStackTrace;

}

catch (IOException e) {

e.printStackTrace;

}

Для получения датаграммы также создается экземпляр класса DatagramPacket, но в конструктор передается лишь массив, в который будут записаны полученные данные (также указывается ожидаемая длина пакета). Сокет необходимо создать с указанием порта, иначе, скорее всего, сообщение просто не дойдет до адресата. Используется метод receive класса DatagramSocket (аналогично методу ServerSocket.accept, этот метод также прерывает выполнение потока, пока не придет запрос от клиента). Пример реализации получателя:

try {

DatagramSocket s =

new DatagramSocket(3456);

byte data[]=new byte[3];

DatagramPacket p =

new DatagramPacket(data, 3);

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

s.receive(p);

System.out.println("Datagram received: "+

data[0]+", "+data[1]+", "+data[2]);

s.close;

}

catch (SocketException e) {

e.printStackTrace;

}

catch (IOException e) {

e.printStackTrace;

}

Если запустить сначала получателя, а затем отправителя, то можно увидеть, что первый напечатает содержимое полученной датаграммы, а потом программы завершат свою работу.

В заключение приведем пример сервера, который получает датаграммы и отправляет их обратно, дописав к ним слово received.

import java.io.*;

import java.net.*;

public class DatagramDemoServer {

public static final int PORT = 2000;

private static final int LENGTH_RECEIVE = 1;

private static final byte[] answer = ("received").getBytes;

private DatagramSocket servSocket = null;

private boolean keepRunning = true;

public static void main(String[] args) {

DatagramDemoServer server = new DatagramDemoServer;

server.service;

}

public DatagramDemoServer {

try {

servSocket = new DatagramSocket(PORT);

}

catch(SocketException e) {

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

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

Император Пограничья 7

Астахов Евгений Евгеньевич
7. Император Пограничья
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Император Пограничья 7

Геном хищника. Книга четвертая

Гарцевич Евгений Александрович
4. Я - Легенда!
Фантастика:
боевая фантастика
рпг
попаданцы
5.00
рейтинг книги
Геном хищника. Книга четвертая

Адвокат Империи 12

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

Двойник Короля 2

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

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

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

Черный рынок

Вайс Александр
6. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Черный рынок

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

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

Глэрд IX: Легионы во Тьме

Владимиров Денис
9. Глэрд
Фантастика:
боевая фантастика
попаданцы
фэнтези
5.00
рейтинг книги
Глэрд IX: Легионы во Тьме

Девяностые приближаются

Иванов Дмитрий
3. Девяностые
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Девяностые приближаются

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

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

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Солдат Империи

Земляной Андрей Борисович
1. Страж
Фантастика:
попаданцы
альтернативная история
6.67
рейтинг книги
Солдат Империи

Графиня с изъяном. Тайна живой стали

Лин Айлин
Фантастика:
фэнтези
героическая фантастика
киберпанк
5.00
рейтинг книги
Графиня с изъяном. Тайна живой стали

Ветер перемен

Ланцов Михаил Алексеевич
5. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Ветер перемен