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 отличается от клиента клиенту, в зависимости от сервера. Другие шаги остаются в значительной степени тем же самым.