След: Пользовательские Сети
Урок: Все О Сокетах
Чтение из и Запись в Сокет
Домашняя страница > Пользовательские Сети > Все О Сокетах

Чтение из и Запись в Сокет

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

  1. Откройте сокет.
  2. Откройте входной поток и поток вывода к сокету.
  3. Читайте из и запишите в поток согласно протоколу сервера.
  4. Закройте потоки.
  5. Закройте сокет.

Только шаг 3 отличается от клиента клиенту, в зависимости от сервера. Другие шаги остаются в значительной степени тем же самым.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Каков Сокет?
Следующая страница: Запись Стороны сервера Сокета



Spec-Zone.ru - all specs in one place