1. Введение в TCP/IP
Семейство протоколов TCP/IP - это протокол, используемый в Интернете, а также может использоваться в независимых частных сетях.
Семейство протоколов TCP/IP включает протокол IP, протокол TCP и протокол UDP.
IP-протокол использует IP-адреса для распределения пакетов, но это лучшая служба, и пакеты могут быть потеряны, вне порядок или повторяются. Протоколы TCP и UDP добавляют номера портов в протокол IP, тем самым установив прозрачное соединение между приложениями двух хостов.
Разница в том, что протокол TCP исправляет ошибки IP -слоя, что устанавливает соединения между хостами через сообщения рукопожатия.
Затем ошибки в сообщении восстанавливаются путем добавления серийного номера в сообщение. UDP просто расширяет протокол IP.
Позвольте ему работать между приложениями, а не между хостами.
Что касается IP -адресов, хост может иметь несколько сетевых интерфейсов, а один интерфейс может иметь несколько адресов.
Некоторые IP -адреса имеют специальное использование:
A. Адрес Loopback: 127.0.0.1, всегда назначается интерфейсу петли, в основном используется для тестирования.
B. Частный адрес: начиная с 10, 192.168, 172. (16-31), используется для частных сетей. Когда устройство NAT пересылает сообщение, оно отображает пару портов частного адреса сообщения в одном интерфейсе в пару портов общедоступного адреса в другом интерфейсе. Это позволяет небольшой группе хостов делиться парой IP -адресов.
C. Многоадресный адрес: первое число составляет от 224 до 239.
2. Основы розетки
1. Получение адреса
public static void main (string [] args) {try {enumeration <networkInterface> интерфейсы = networkInterface.getnetworkInterfaces (); while (interfaces.hasmoreElements ()) {networkInterface iface = interfaces.nextElement (); System.out.println ("Интерфейс:" + iface.getName ()); Enumeration <inetAddress> addrList = iface.getInetAddresses (); if (! addrlist.hasmoreElements ()) System.out.println («Нет адреса»); while (addrlist.hasmoreElements ()) {inetAddress address = addrlist.nextelement (); System.out.println ("Адрес:" + address.gethostaddress ()); }}} catch (socketException e) {e.printstacktrace (); }}2. Программа экземпляра TCP
Следует отметить, что, хотя только один метод write () используется для отправки строк на стороне клиента, сторона сервера может также получать эту информацию из нескольких блоков. Даже если строка обратной связи хранится в блоке, когда сервер возвращается, это может быть TCP
Протокол разделен на несколько частей.
Tcpechoclienttest.java
public static void main (string [] args) бросает ioException {string server = args [0]; byte [] data = args [1] .getbytes (); int port = 7; Сокет сокет = новый сокет (сервер, порт); System.out.println ("Подключен к серверу ..."); InputStream in = socket.getInputStream (); OutputStream out = socket.getOutputStream (); out.write (data); int totalbytesrcvd = 0; int bytesrcvd; while (totalbytesrcvd <data.length) {if ((bytesrcvd = in.read (data, totalbytesrcvd, data.length - totalbytesrcvd)) == -1) бросить новое сочетание («соединение закрыто»); totalbytesrcvd += bytesrcvd; } System.out.println ("Получен:" + new String (data)); Socket.Close (); }Tcpechoservertest.java
Частный статический финал int bufsize = 32; public static void main (string [] args) бросает ioException {serversocket serversocket = new Serversocket (7); int recvmsgsize; byte [] recebuf = new Byte [bufsize]; while (true) {socket socket = serversocket.accept (); System.out.println («Обработка клиента» + »из удаленного» + socket.getRemoteSocketAddress () + »в локальном» + socket.getLocalSockeChoctadDress ()); InputStream in = socket.getInputStream (); OutputStream out = socket.getOutputStream (); while ((recvmsgsize = in.read (chectebuf))! = -1) {out.write (checteBuf, 0, RecvMsgSize); } socket.close (); }}Обратите внимание, что новый сокет указывает номер порта, который слушает удаленный сервер, не указав локальный порт, поэтому будет использоваться адрес и доступный номер порта по умолчанию. На моем порте клиента моего машины 4593, подключенный к порту 7 сервера.
3. Программа экземпляра UDP
Зачем использовать протокол UDP? Если приложение обменивается лишь небольшой объемом данных, этап установления подключения TCP будет передавать не менее вдвое больше его информации (и вдвое больше времени обработки обмотки).
Udpechoclienttest.java
public static void main (string [] args) бросает ioException {inetAddress serverdress = inetAddress.getbyName (args [0]); byte [] bytestosend = args [1] .getbytes (); DatagramSocket Socket = new DatagramSocket (); Socket.setsotimeout (3000); DataGrampacket sendpacket = new DataGrampacket (Bytestosend, bytestosend.length, serverdress, 7); DataGrampacket CERESTPACKET = новый DataGrampacket (новый byte [bytestosend.length], bytestosend.length); // пакеты могут быть потеряны, поэтому мы должны продолжать пытаться int rekies = 0; логический edceptresponse = false; do {socket.send (sendpacket); try {socket.receive (getpacket); if (! retepacket.getAddress (). equals (serveraddress)) бросить новое ioException («получить от неизвестного источника»); edcepresponse = true; } catch (ioException e) {попытки ++; System.out.println («Тайм -аут, попробуйте еще раз»); }} while (! if (defficeResponse) system.out.println ("Получен:" + new String (cretepacket.getData ())); else System.out.println («Нет ответа»); Socket.Close (); } Udpechoservertest.java
Частный статический финал int echomax = 255; public static void main (string [] args) бросает ioException {datagramsocket socket = new DatagramSocket (7); DataGrampacket packet = new DataGrampacket (новый байт [echomax], echomax); while (true) {socket.receive (packet); System.out.println ("Обработка клиента At" + packet.getAddress ()); Socket.send (пакет); packet.setLength (echomax); }}Сравнивая этот пример с предыдущим экземпляром TCP, существуют следующие различия:
A.DatagramSocket не нужно указывать адрес назначения при его создании, поскольку UDP не нужно устанавливать соединение, и каждый пакет данных может быть отправлен или получен с другого адреса назначения.
B. Если вы блокируете и подождите on Read (), как TCP, он может быть заблокирован там навсегда, потому что протокол UDP просто расширяет протокол IP, а пакеты UDP могут быть потеряны. Поэтому вы должны установить время ожидания для блокировки.
C.UDP Протокол сохраняет граничную информацию сообщения, и каждый вызов eCeat () может получать данные, отправляемые методом Send (), раздача вызова () вызов.
D. Максимальные данные, которые может передавать пакет UDP, составляют 65507 байтов. Избыточные байты будут автоматически отброшены, и для программы принимающей программы нет никаких операций. Следовательно, безопасно установить массив кэша примерно на 65 000 байтов.
E. Если метод cheact () неоднократно вызывается с одним и тем же экземпляром DataGrampacket, внутренняя длина сообщения должна быть явно сброшена до фактической длины кэша перед каждым вызовом.