Java Оправа связи Введение и решать проблемы, которые могут возникнуть _JAVA - JAVA

Источник: Привет сеть обучения чувствительный и нетерпеливый форум www.piaodoo.com приветствовать , чтобы узнать друг от друга

предисловие

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

Java в сети связи на основе протокола TCP две категории: Socket и клиент ServerSocket сервер.

Оправа модель связи, показанная на фиг:

Привет сеть обучения

Независимо от того, как сложные функции Оправа связи, базовая структура любого процесса сокета связи является то же самое.

Основные шаги:

      Розетка и ServerSocket ① создавать отдельные экземпляры клиента и сервера; сервер через метод Признавайте () ожидает запросов и блоков. После получения запроса, чтобы установить соединение объекта сокета.

      ② открытым и входные и выходные потоки через getInputStream Методы getOutputStream клиент и сервер

      ③ IO поток операций чтения и записи с использованием

      ④ закрыть все сокеты ресурсы и потоки ресурсов.

В котором программирование, главным образом, на третьем этапе, другая часть кода, по существу, то же самое. Все шаги, скорее всего, бросить исключение IO!

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

Розетка устанавливается в конце данных PrintWriter написано, другой конец через сокет BufferedReader создан класс для чтения и вывода данных.

Если данные не записаны на дисплее, есть две возможные причины:

А Данные записи хранятся в буфере, поток не записывается IO:

Если вы не взять на себя инициативу вмешательства, данные всегда будут записываться в буфер кучи до тех пор, пока буфер не заполнен причиной JVM автоматического обновления буфера. Очевидно, что это не отвечает нашим потребностям. В этом случае класс PrintWriter предоставляет метод Flush (), чтобы заставить буфер обновления, буфер записи данных, поток ввода-вывода. Кроме того, конструктор класса PrintWriter имеет параметр «булево AutoFlush», этот параметр по умолчанию значение ЛОЖЬ, если значение ИСТИНА, он будет включать автоматическое обновление функции буфера. Заметим, однако, здесь автоматически обновит условия запуска, а именно: метод записи данных сусло Println PrintWriter класс, Printf, или методы форматирования будет вызывать автоматическое обновление. Если вызов метода записи (), чтобы написать этот тип данных, это не вызовет автоматическое обновление! Подводя итог, три точки: настройки AutoFlush параметров, с помощью выбранной записи и Println методы, вровень метод. Сочетание этих трех, когда данные записываются может гарантировать определенный конец Оправа Communications, будет в состоянии успешно записаны данные в поток ввода-вывода!

Во-вторых, данные считываются с помощью метода ReadLine (), который обычно не закончился:

Пожалуйста, обратите внимание, Readline BufferedReader класс () метод является функцией блокировки! То есть, после того сам метод, чтобы прочитать строку данных, но они не могут определить, что это называется «линия»! При вызове этого метода дочитал часть данных, он будет заблокирован и не возвращает его для чтения данных. Вот почему иногда четко установил правильный буфер данных записи, или путем считывания входного потока данных и отображаются причины.

Для метода ReadLine (), который будет разблокирован правый конец и возвращает значение чтения, только следующие ситуации:

      ① считывания данных содержит возврат каретки «\ г» или «новой строки \ N» или возврат каретки «\ г \ п»;

      ② для чтения данных записываются, на другом конце метода, как метод Println Println приходит новую строку;

      ③BufferedReader буфер класса полон, виртуальная машина будет автоматически обновлять буфер, чтобы освободить «накопление» данных (но с учетом размера буфера по умолчанию 8192 символов для связи небольших объемов данных, не может, по-видимому срабатывает);

      ④ Для чтения данных, записывает поток данных непосредственно с или ненормальным, то все Readline () она будет есть вертел данных. Он просто объясняет, почему в моей программе отключить сокет клиента соединение, сервер немедленно вызвать все выходные сообщения клиента.

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

Вот код, который я могу запустить успешно модифицировать, а именно клиент и на стороне сервера гнездо.

над!

java.io.BufferedReader Импорт, 
Импорт java.io.IOException; 
Импорт java.io.InputStream; 
Импорт java.io.InputStreamReader; 
Импорт java.io.OutputStream; 
Импорт java.io.PrintWriter; 
Импорт java.net.ServerSocket; 
Импорт java.net.Socket; 
Импорт java.io.BufferedWriter; 
Импорт java.io.OutputStreamWriter; 
класс ShakingServer общественности { 
 общественности статической силы основных (String [] арг) бросает IOException { 

 // создать экземпляр сокета сервера, чтобы установить порт прослушивания 2000 
 ServerSocket сервер = новый новый ServerSocket (2000); 
 // начать прослушивание запросов клиентов, а также блокирует 
 сокет = server.accept (); 
 // после получения запроса, автоматически установить соединение. Передача данных через поток ввода - вывода 
 System.out.println ( "соединение установлено"); 

 в OutputStream Socket.getOutputStream OS = ();
 PrintWriter Pw = новый новый PrintWriter (новый новый BufferedWriter (новый новый OutputStreamWriter (ОС)), истина); 
 pw.write ( «Добро пожаловать в мир Иисуса покачал головой!»); 
 Pw.flush (); 
  // потому что я закрыл выходной поток, так другой метод ReadLine обычно заканчивается до окончания 
 socket.shutdownOutput (); 

 в InputStream Socket.getInputStream IS = (); 
 в InputStreamReader InputStreamReader новый новый ISR = (ИУ); 
 в BufferedReader BR = новый новый BufferedReader (ISR); 
 это время (к истинному) { 
  STR String = br.readLine (); 
  IF (str.equals ( "бросить курить")) { 
  перерыва; 
  } 
  System.out.println ( "упомянутого клиента:" + STR); 
 } 
 socket.shutdownInput (); 
 //socket.shutdownOutput () ; 
 Socket.close (); 
 server.close (); 
 } 
}
java.io.BufferedReader Импорт; 
Импорт java.io.BufferedWriter; 
Импорт java.io.IOException; 
Импорт java.io.InputStreamReader; 
Импорт java.io.OutputStreamWriter; 
Импорт java.io.PrintWriter; 
Импорт java.net.Socket; 

общественности ShakingClient {класс 
 государственной статической силы основных (String [] арг) бросает IOException { 

 // создать клиентский сокет, настройки соединения IP адрес сервера и номер порта 
 сокета = новый сокет ( «169.254.132.203 », 2000); 
 // прочитать сервер передает информацию входного потока 
 BufferedReader в BufferedReader BR = новый новый (новый новый InputStreamReader (Socket.getInputStream ())); 
  // открыть автоматическое обновление буфера 
 PrintWriter Pw = новый PrintWriter (новый BufferedWriter (новый OutputStreamWriter (socket.getOutputStream ( ))), истина);   
  // считывание данных с клавиатуры
 II = BufferedReader новый новый BufferedReader (InputStreamReader новый новый (System.in)); 
 System.out.println (br.readLine ()); 
  // открыть из-за автоматического обновления, и вызов Println метод, он может не вызов вровень 
 PW .println ( «просьба войти в его голову Иисуса мир»); 
 //pw.flush (), 
 в то время как (истина) { 
  String = ii.readLine STR (); 
  // каретка используемый метод для того, чтобы другой конец нормальной ReadLine конец 
  pw.write (СИЛ + "\ Р & л"); 
  pw.flush (); 
  // если входной выйти из выхода IM 
  IF (str.equals ( "бросить курить")) { 
  ПАУЗА; 
  } 
 } 
 socket.shutdownInput (); 
 гнездо .shutdownOutput (); 
 Socket.close (); 
 } 
}

резюме

Это все, что для этой статьи, я надеюсь, что содержание этой статьи имеет некоторое эталонное значение обучения для всех нас, чтобы учиться или работать, если есть сомнения вы можете оставить обмен сообщений, спасибо за поддержку, чувствительный и нетерпеливый Форум / Привет обучения сети.

Оригинальный адрес: HTTP: //www.piaodoo.com/thread-13254-1-1.html чулок контроля www.txdah.com 131 за пределами www.buzc.org приятного обучение может помочь лучше узнать!

рекомендация

отwww.cnblogs.com/txdah/p/12093760.html