1. Две основные проблемы в сетевом программировании
Одним из них является то, как точно найти один или несколько хостов в сети, а другой - как надежно и эффективно передавать данные после поиска хоста.
В протоколе TCP/IP уровень IP в основном отвечает за местоположение сетевого хоста и маршрутизацию передачи данных. IP -адрес может однозначно определить хоста в Интернете.
Уровень TCP обеспечивает надежный (TCP) или не надежный (UDP) механизм передачи данных для применения, который является основным объектом сетевого программирования, и, как правило, не нужно заботиться о том, как обрабатывает данные IP-уровня.
Самая популярная модель сетевого программирования в настоящее время - структура клиента/сервера (C/S). То есть одна из сторон связи выступает в качестве сервера, чтобы дождаться, пока клиент отправит запрос и ответит. Клиент обращается к серверу, когда необходима служба. Сервер, как правило, всегда работает как демон, слушая сетевой порт. Как только клиент запрашивает его, он начнет процесс обслуживания, чтобы ответить на клиента и в то же время продолжать слушать сам сервисный порт, чтобы более поздние клиенты также могли своевременно получать услуги.
2. Два типа протоколов передачи: TCP; UDP
TCP-это аббревиатура Tranfer Control Protocol , протокол, ориентированного на соединение, который обеспечивает надежную передачу. Передача через протокол TCP приводит к порядку без ошибок потоков данных. Между двумя парами розетчиков и приемника должно быть установлено соединение, чтобы общаться на основе протокола TCP. Когда один сокет (обычно серверный гнездо) ждет для установления соединения, другой розетку может потребовать подключения. После того, как эти два розета подключены, они могут выполнить двустороннюю передачу данных, и обе стороны могут выполнять операции отправки или приема.
UDP - это аббревиатура User Datagram Protocol . Это протокол без соединения. Каждая Datagram является независимой информацией, включая полный адрес источника или назначения. Он передается в пункт назначения в сети любым возможным пути. Следовательно, может ли он достичь пункта назначения, время для достижения пункта назначения, и правильность содержания не может быть гарантирована.
Сравнивать:
UDP:
TCP:
приложение:
3. Программирование сети Java на основе сокетов
1. Что такое розетка
Две программы в сети реализуют обмен данными с помощью двухстороннего связи. Один конец этой двусторонней ссылки называется гнездами. Сокет обычно используется для подключения между клиентами и поставщиками услуг. Сокет является очень популярным интерфейсом программирования протокола TCP/IP. Гребень уникально определяется IP -адресом и номером порта.
Тем не менее, типы протоколов, поддерживаемых сокетами, являются не только TCP/IP, поэтому между ними нет необходимого соединения. В среде Java программирование сокетов в основном относится к сетевому программированию на основе протокола TCP/IP.
2. Процесс связи сокета
Слушайте сервер (слушает), есть ли запрос на подключение на определенном порте. Сторона клиента выдает запрос Connect на сторону сервера, а сторона сервера отправляет сообщение принять обратно на сторону клиента. Соединение установлено. Как сервер, так и клиентская сторона могут общаться друг с другом с помощью отправки, записи и других методов.
Для полностью функционального розетки он должен включать следующую базовую структуру, а его рабочий процесс включает в себя следующие четыре основных шага:
(1) создать гнездо;
(2) открыть вход/отток, подключенный к розетку;
(3) прочитать/написать гнездо в соответствии с определенным протоколом;
(4) Закрыть гнездо. (В реальных приложениях отображаемое закрытие не используется. Хотя многие статьи рекомендуют это, в моей программе, это может не оказать никакого влияния, поскольку сама программа относительно проста и имеет низкие требования.)
3. Создать сокет
Сокет (адрес inetaddress, int port); Сокет (адрес inetaddress, int port, логический поток); Сокет (String Host, Int Prot); Сокет (строка хост, int prot, логический поток); Сокет (SocketImpl Impl) сокет (String Host, int port, inetaddress localaddr, int localport) сокет (адрес inetadress, порт int, inetadress localaddr, int localport) serversocket (int port); Serversocket (int port, int backlog); Serversocket (int port, int backlog, inetAddress bindaddr), где адрес, хост и порт являются IP -адресом, именем хоста и номером порта другой стороны в двухнаправленном подключении соответственно. Поток указывает, является ли розетка племенной розеткой или гнездой данных. Localport указывает номер порта локального хоста, LocalAddr и BindAddr является адресом локальной машины (адрес хоста Serversocket). Impl - это родительский класс сокета, который можно использовать для создания Serversocket и создания сокетов. COUNT представляет максимальное количество подключений, которые может поддерживать сервер. Например: обучение видео -сети http://www.xxspw.com socket client = new Socket ("127.0.01.", 80); Serversocket Server = New Serversocket (80);Обратите внимание, что вы должны быть осторожны при выборе порта. Каждый порт предоставляет конкретную услугу. Только путем предоставления правильного порта может быть получена соответствующая служба. Номера портов от 0 ~ 1023 зарезервированы системой. Например, номер порта службы HTTP составляет 80, номер порта сервиса Telnet составляет 21, а номер порта службы FTP составляет 23. Поэтому, когда мы выбираем номер порта, лучше всего выбрать номер, превышающий 1023, чтобы предотвратить конфликты.
Если при создании сокета возникает ошибка, будет сгенерировано ioException, и она должна быть обработана в программе. Таким образом, при создании сокета или Serversocket исключения должны быть пойманы или брошены.
4. Простая клиентская/серверная программа
1. Клиентская программа
импортировать java.io.*; Импорт java.net.*; открытый класс TalkClient {public static void main (string args []) {try {socket socket = new Socket ("127.0.0.1", 4700); // Отправить клиент -запрос в порт 4700 машины BufferedReader SIN = новый BufferedReader (новый inputStreamReader (System.in)); // Создание объекта BufferedReader из системы System Standard Device Device PrintWriter OS = New PrintWriter (Socket.getOutputStream ()); // Получить выходной поток из объекта сокета и построить объект PrintWriter BufferedReader is = new BufferedReader (New InputStreamReader (socket.getInputStream ())); // Получить входной поток из объекта сокета и построить соответствующую строку считывания BufferedReader строки; readline = sin.readline (); // Читать строку с стандартного ввода системы while (! Readline.equals ("bye")) {// Если строка считывается с стандартного ввода "bye", остановите цикл Os.println (readline); // Вывод строки считывается из системного стандартного ввода в Server OS.Flush (); // обновить выходной поток, чтобы сервер сразу же получил строку System.out.println ("client:"+readline); // Распечатать систему чтения строки. // Читать строку с сервера и распечатать ее на стандартный выходной readline = sin.readline (); // Читать строку с системного стандартного ввода} // продолжить цикл OS.Close (); // закрыть выходной поток разъема is.close (); // Закройте входной поток разъема сокета .close (); // закрыть сокет} catch (Exception e) {System.out.println ("error"+e); // возникает ошибка, напечатано сообщение об ошибке}}}2. Серверная программа
импортировать java.io.*; Импорт java.net.*; импортировать java.applet.applet; открытый класс TalkServer {public static void main (string args []) {try {serversocket server = null; try {server = new Serversocket (4700); // Создать Serversocket для прослушивания запросов клиентов в порту 4700} Catch (Exception e) {System.out.println ("Не может слушать:"+e); // Ошибка, сообщение об ошибке печати} сокет сокет = null; try {socket = server.accept (); // Использование access () для блокировки и ждать запроса клиента. Если клиент // после появления запроса генерируется объект сокета и продолжает выполнять} Catch (Exception e) {System.out.println ("error."+E); // возникает ошибка, распечатана информация о ошибке} строковая строка; BufferedReader IS = New BufferedReader (New InputStreamReader (socket.getInputStream ())); // Получить входной поток из объекта сокета и построить соответствующий объект BufferedReader PrintWriter OS = NewPrintWriter (socket.getOutputStream ()); // Получить выходной поток из объекта сокета и построить объект PrintWriter BufferedReader sin = new BufferedReader (New InputStreamReader (System.in)); // Создание системы объектов BufferedReader.out.println ("client:"+is.readline ()); // распечатать строку считываемой от клиента на стандартной линии вывода = sin.readline (); // Читать строку с стандартного ввода while (! Line.equals ("bye")) {// Если строка "bye", остановите цикл Os.println (line); // выводить строку os.flush () клиенту; // обновить выходной поток, чтобы клиент немедленно получил строку System.out.println ("Server:"+line); // Распечатать систему чтения строки. // Читать строку из клиента и распечатать ее в стандартную линию вывода = sin.readline (); // Читать строку с системного стандартного ввода} // продолжить цикл OS.Close (); // закрыть выходной поток разъема is.close (); // Закройте входной поток разъема сокета .close (); // закрыть Socket Server.close (); // ЗАКРЫТЬ СЕРВЕРСЕТКЕТ} CATCH (EXCECTING E) {System.out.println ("error:"+e); // произошла ошибка, сообщение об ошибке печати}}}5. Поддержка программы для клиентов/сервера Client/Server
Предыдущая программа клиента/сервера может реализовать только разговоры между сервером и одним клиентом. В реальных приложениях на сервере часто запускается постоянная программа, которая может получать запросы от нескольких других клиентов и предоставлять соответствующие услуги. Чтобы реализовать функцию предоставления услуг нескольким клиентам на сервере, необходимо преобразовать вышеуказанную программу и реализован механизм многопоточности. Сервер всегда слушает, существуют ли клиентские запросы на указанном порту. После того, как запрос клиента будет услышан, сервер запустит специальную службу, чтобы ответить на запрос клиента. Сам сервер немедленно входит в состояние прослушивания после запуска потока, ожидая прибытия следующего клиента.