|
Spec-Zone .ru
спецификации, руководства, описания, API
|
Давайте смотреть на простой пример, который иллюстрирует, как программа может установить соединение с программой сервера, используя Socket class и затем, как клиент может отправить данные и получить данные с сервера на сокет.
Пример программы реализует клиент, EchoClient, это соединяется с сервером Эха. Сервер Эха просто получает данные от своего клиента и повторяет их назад. Сервер Эха является известной службой, что клиенты могут рандеву с на порту 7.
EchoClient создает сокет, таким образом, получая соединение с сервером Эха. Это читает ввод от пользователя на стандартном входном потоке, и затем вперед что текст к серверу Эха при записи текста в сокет. Сервер повторяет ввод назад через сокет клиенту. Клиентская программа читает и выводит на экран данные, пасуемые назад к этому от сервера:
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();
}
}
Отметьте это EchoClient и записи к и чтения от его сокета, таким образом отправляя данные и получая данные от сервера Эха.
Давайте идти через программу и исследуем интересные части. Эти три оператора в try блок main метод является критическим. Эти строки устанавливают сокетное соединение между клиентом и сервером и открывают a PrintWriter и a BufferedReader на сокете:
echoSocket = new Socket("taranis", 7);
out = new PrintWriter(echoSocket.getOutputStream(), true);
in = new BufferedReader( new InputStreamReader(echoSocket.getInputStream()));
Первый оператор в этой последовательности создает новое Socket объект и имена это echoSocket. Socket конструктор использовал, здесь требует имени машины и номера порта, с которым Вы хотите соединиться. Пример программы использует имя хоста taranis. Это - имя гипотетической машины на нашей локальной сети. Когда Вы вводите и выполняете эту программу на своей машине, изменяете имя хоста на имя машины на Вашей сети. Удостоверьтесь, что имя, которое Вы используете, является полностью определенным именем IP машины, с которой Вы хотите соединиться. Вторым параметром является номер порта. Номер порта 7 является портом, на котором слушает сервер Эха.
Второй оператор получает поток вывода сокета и открывает a PrintWriter на этом. Точно так же третий оператор получает входной поток сокета и открывает a BufferedReader на этом. Пример использует читателей и писателей так, чтобы он мог записать символы Unicode по сокету.
Отправить данные через сокет к серверу, EchoClient просто потребности записать в PrintWriter. Получить ответ сервера, EchoClient чтения от BufferedReader. Остальная часть программы достигает этого. Если Вы еще не знакомы с классами ввода-вывода платформы Java, можно хотеть считать Основной ввод-вывод.
Следующая интересная часть программы while цикл. Цикл читает строку за один раз из стандартного входного потока и сразу отправляет его серверу при записи этого в PrintWriter соединенный с сокетом:
String userInput;
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput);
System.out.println("echo: " + in.readLine());
}
Последний оператор в while цикл читает строку информации от BufferedReader соединенный с сокетом. readLine метод ожидает, пока сервер не повторяет информацию назад к EchoClient. Когда readline возвраты, EchoClient печатает информацию к стандартному выводу.
while цикл продолжается, пока пользователь не вводит символ конца ввода. Таким образом, EchoClient ввод чтений от пользователя, отправляет это серверу Эха, получает ответ от сервера, и выводит на экран это, пока это не достигает конца ввода. while цикл тогда завершается, и программа продолжается, выполняя следующие четыре строки кода:
out.close(); in.close(); stdIn.close(); echoSocket.close();
Эти строки кода попадают в категорию обслуживания. Программа хорошего поведения всегда очищает, после непосредственно, и эта программа хорошего поведения. Эти операторы закрывают читателей и писателей, соединенных с сокетом и со стандартным входным потоком, и закрывают сокетное соединение с сервером. Порядок здесь важен. Следует закрыть любые потоки, соединенные с сокетом прежде, чем Вы закроете сокет непосредственно.
Эта клиентская программа является прямой и простой, потому что сервер Эха реализует простой протокол. Клиент отправляет текст серверу, и сервер повторяет это назад. Когда Ваши клиентские программы будут говорить с более сложным сервером, таким как сервер HTTP, Ваша клиентская программа будет также более усложнена. Однако, основы являются почти такими же, как они находятся в этой программе:
Только шаг 3 отличается от клиента клиенту, в зависимости от сервера. Другие шаги остаются в значительной степени тем же самым.