01 января 2008

Сокеты

Сокеты позволяют реализовать клиент серверную архитектуру клиент - сервер.
Клиент, подключается к определённому порту сервера зная его имя или IP адрес. Большинство сетевых программ построенны именно на этой архитектуре. Рассмотрим как это реализуется в Java с помощью сокетов.
Итак, начнём с рассмотрения создания сокет сервера. Его основная задача: принимать входящие соеденения на какой то зарание определённый порт. Это реализуется с помощью класса java.net.ServerSocket. Следующий кусок кода отвечает за открытие порта №5000 на текущем компьютере (сервере) и приёме входящих подключений к серверу и создание экземпляра класса java.net.Socket для дальнейшей работы с подключённым клиентом.

try {
int port = 5000;
ServerSocket srv = new ServerSocket(port);
Socket socket = srv.accept();
} catch (IOException e) { }

Ну что ж сервер мы написали, следующий этап - написание клиента - программы которая будет подключатся к серверу. Номер порта сервера нам известен - №5000, в учебных целях клиент и сервер будем запускать на одном компьютере, тогда в качестве имени хоста можна использовать ключевое слово : localhost или IP адрес 127.0.0.1

try {
InetAddress addr = InetAddress.getByName("localhost");
int port = 5000;
Socket socket = new Socket(addr, port);
} catch (UnknownHostException e) {
} catch (IOException e) { }

Итак, на клиенте мы просто создаём новый сокет с указанными параметрами, если в момент запуска клиента сервер уже будет работать, значит подключение пройдёт успешно, без генерации исключений и мы сможем отправлять и получать данные.
В итоге мы имеем два работающих Socket, один на программе - сервере, второй на программе - клиенте. Реализуем возможность клиентом отправлять на сервер некую строку данных , а серверу получать её, обрабатывать и выводить в консоль, тогда на сервере надо создать экземпляр класса java.io.BufferedReader :

try {
BufferedReader rd = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String str;
while ((str = rd.readLine()) != null) {
System.out.println(str);
}
rd.close ();
} catch (IOException e) { }

который прослушивает сокет и выводит на экран текст из потока ввода, до тех пор, пока из потока ввода поступают данные. На клиенте мы создадим экземпляр класса java.io.BufferedWriter, который будет передавать полученный текст в сокет:

try {
BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
wr.write("Hello server");
wr.flush();
} catch (IOException e) {
}

В результате мы получили примитивное но вполне рабочее клиент - серверное приложение, которое способно обмениватся данными.

Комментариев нет: