Сетевые приложения разделены на две части: клиент и сервер, а класс сокетов - это класс Java, ответственный за обработку связи с клиентами. Благодаря этому классу вы можете подключиться к серверу с указанным IP или доменным именем, и вы можете отправлять и получать данные друг с другом с сервером. Использование класса сокета будет подробно обсуждаться в этой статье и несколько статей позже, включая основы класса сокета, различные методы подключения, методы получения и установки, тайм -ауты во время соединения, а также закрывающие сетевые соединения и т. Д.
В этой статье мы обсудим основные шаги и методы использования класса сокета. Как правило, сетевые клиентские программы должны выполнять следующие три шага при подключении к сервисным программам.
1. Подключиться к серверу
Клиент может подключаться к серверу двумя способами, один из них заключается в подключении к серверу через IP, а другой должен подключиться к серверу с помощью доменного имени.
На самом деле, эти два метода по сути являются одним из способов. У базового клиента все они подключаются к серверу через IP, но между двумя методами существуют определенные различия. Если серверная программа подключена через IP, клиент просто подключается в соответствии с IP. Если сервер подключен через доменное имя, клиент должен разрешить доменное имя в IP через DNS, а затем подключиться в соответствии с этим IP.
Во многих языках программирования или инструментах разработки (таких как C/C ++, Delphi) при подключении к серверу с использованием доменного имени необходимо сначала разрешить доменное имя к IP, а затем подключиться через IP. В Java функция разрешения доменного имени была включена в класс сокетов. Поэтому нам нужно только использовать доменное имя, подобное использованию IP.
Наиболее распространенным методом подключения к серверным программам через класс сокетов является передача IP или доменное имя и номер порта в качестве параметров в класс сокетов через конструктор класса сокета. Есть много перегруженных форм конструктора класса сокета. В этом разделе обсуждается только одна из наиболее часто используемых форм: Public Socket (String Host, Int Port). Из определения этого конструктора вам нужно только передать IP или доменное имя и номер порта непосредственно в конструктор. Следующий код является примером программы, которая подключается к серверным программам:
Пакет MySocket; Импорт java.net.*; открытый класс myConnection {public static void main (string [] args) {try {if (args.length> 0) {socket socket = new Socket (args [0], 80); System.out.println (args [0] + "Подключен успешно!"); } else System.out.println ("Укажите IP или доменное имя!"); } catch (Exception e) {System.err.println ("Сообщение об ошибке:" + e.getMessage ()); }}} В вышеперечисленном IP или доменное имя передается в программу через параметр командной строки, а затем порт 80 IP или доменного имени, указанного через параметр командной строки, подключен через сокет сокета = New Socket (args [0], 80). Поскольку конструктор класса сокета использует броски при определении, при вызове конструктора класса сокета вы должны использовать оператор Try ... Catch, чтобы поймать ошибку, или использовать оператор бросков, чтобы добавить ошибку для основной функции.
Используйте класс сокетов, чтобы подключиться к серверу, чтобы определить, какие порты открываются на хосте. Следующий код - это программа, которая сканирует, какие порты открыты на этой машине.
2. Отправить и получать данные
Двумя наиболее важными методами в классе сокетов являются GetInputStream и GetOutputStream. Эти два метода используются для получения объектов inputstream и outputstream для чтения и написания данных соответственно. InputStream здесь считывает данные, отправляемые программой сервера, клиенту, а OutputStream - это данные, которые клиент хочет отправить на серверную программу.
При написании фактических сетевых клиентских программ, будь то использование getInputStream или getOutputStream и кого использовать сначала и кого использовать позже, определяется конкретным приложением. Например, подключившись к 80 порту (обычно порт по умолчанию, используемый по протоколу HTTP) веб -сайта Post и Telecommunications Press (www.ptpress.com.cn), отправив строку и, наконец, чтение информации, возвращаемой с www.ptpress.com.cn.
пакет MySocket; импорт java.net.*; импортировать java.io.*; открытый класс myConnection2 {public static void main (string [] args) бросает исключение {сокет сокета = новый сокет ("www.ptpress.com.cn", 80); // отправлять данные в программу Server OutputStream Ops = socket.getOutputStream (); OutputStreamWriter OPSW = новый outputStreamWriter (OPS); BufferedWriter BW = новый BufferedWriter (OPSW); bw.write ("Привет, мир/r/n/r/n"); bw.flush (); // получение данных из программы сервера InputStream IPS = socket.getInputStream (); InputStreamReader IPSR = новый InputStreamReader (IPS); BufferedReader BR = новый BufferedReader (IPSR); Строка s = ""; while ((s = br.readline ())! = null) System.out.println (s); Socket.Close (); }} При написании вышеуказанного кода вы должны обратить внимание на следующие два балла:
1. Чтобы повысить эффективность передачи данных, класс сокетов не передает данные каждый раз, когда вызывается метод записи, но записывает данные, которые должны быть переданы в буфер (по умолчанию составляет 8192 байта), а затем отправляет данные в этом буфере вместе с помощью метода промывки. Следовательно, bw.flush (); необходим.
2. Причина, по которой «/r/n/r/n» добавляется после Hello World при отправке строки, заключается в том, что заголовок протокола HTTP используется «/r/n/r/n» в качестве конечного флага (подробное содержание протокола HTTP будет объяснено позже). Поэтому, добавив «/r/n/r/n» после отправки строки, серверная программа может подумать, что заголовок HTTP закончился и может быть обработан. Если «/r/n/r/n» не добавлена, серверная программа будет ждать конца заголовка HTTP, то есть «/r/n/r/n». Если это так, серверная программа не будет отправлять информацию о ответе клиенту, а Br.Readline () будет заблокирована, поскольку ее нельзя прочитать, чтобы ответить на информацию до тех пор, пока подключение будет исчез.
3. Выключите сетевое соединение
До сих пор у нас есть предварительное понимание основных методов использования класса сокета, но после того, как класс сокетов обработал данные, наиболее разумным методом окончания является использование метода Clos Close Class для закрытия сетевого соединения. Хотя в нем использовался метод закрытия, метод закрытия сетевого соединения - это не просто метод закрытия. Давайте посмотрим, в каких обстоятельствах может быть отключено Java.
Есть четыре ситуации, когда сетевые подключения могут быть закрыты:
Хотя все эти 4 метода могут достичь одной и той же цели, лучше всего использовать первый или второй метод для закрытия сетевого соединения. Это связано с тем, что третий и четвертый методы обычно не закрывают сетевое соединение сразу. Если это так, то для некоторых приложений останется большое количество бесполезных сетевых подключений, которые будут занимать большое количество системных ресурсов.
После того, как объект сокета закрыт, мы можем использовать метод ISclosed, чтобы определить, находится ли объект сокета в замкнутом состоянии. Однако то, что возвращается с использованием метода ISclosed, является текущим состоянием объекта сокета. То есть, независимо от того, был ли объект сокета успешно связан, Isclosde возвращает истинность до тех пор, пока он находится в закрытом состоянии. Если вы просто создаете не связанный объект сокета, Isclose также возвращает True. Как показано в следующем коде, FALSE будет выходить.
Socket Socket = new Socket (); System.out.println (socket.isclosed ());
В дополнение к методу ISCLOSE, класс сокетов также имеет метод, который может определить, успешно ли подключен объект сокета. Когда вы видите это имя, читатели могут неправильно понять его. Фактически, метод Isconnected определяет не текущее состояние соединения объекта сокета, а о том, был ли объект сокета успешно подключен. Если он был успешно связан, даже если Isclose возвращает True сейчас, Isconnected все еще возвращает True. Следовательно, чтобы определить, находится ли текущий объект сокета в подключенном состоянии, методы ISClose и Isconnected должны использоваться одновременно, то есть объект сокета находится в подключенном состоянии только тогда, когда Isclose возвращает false, а также возвращает true. Следующий код демонстрирует процесс генерации различных состояний вышеуказанного объекта сокета.
Пакет MySocket; импорт java.net.*; открытый класс myCloseConnection {public static void printState (сокет сокета, string name) {System.out.println (name + ".isclosed ():" + socket.isclosed ()); System.out.println (name + ".isconnected ():" + socket.isconnected ()); if (socket.isclosed () == false && socket.isconnected () == true) system.out.println (name + "в подключенном состоянии!"); else System.out.println (имя + "в не связанном состоянии!"); System.out.println (); } public static void main (string [] args) бросает исключение {socket socket1 = null, socket2 = null; Socket1 = New Socket ("www.ptpress.com.cn", 80); PrintState (Socket1, "Socket1"); socket1.getOutputStream (). Close (); PrintState (Socket1, "Socket1"); Socket2 = New Socket (); PrintState (Socket2, "Socket2"); socket2.close (); PrintState (Socket2, "Socket2"); }} После запуска приведенного выше кода будет показан следующий вывод:
Socket1.isclosed (): False
socket1.isconnected (): true
Socket1 находится в подключенном состоянии!
Socket1.isclosed (): true
socket1.isconnected (): true
Socket1 находится в не связанном состоянии!
socket2.iscolosed (): false
socket2.isconnected (): false
Socket2 находится в не связанном состоянии!
socket2.iscolosed (): true
socket2.isconnected (): false
Socket2 находится в не связанном состоянии!
Из выходных результатов можно увидеть, что после закрытия Socket1 OutputStream Socket1 также автоматически закрыт. В приведенном выше коде мы видим, что для сокета объекта сокета2, который не подключен к серверу, его метод ISCLESS является ложным. Если метод Socket2 Isclosed возвращает true, метод закрытия должен вызывать отображение с использованием socket2.close.
Несмотря на то, что большую часть времени мы можем использовать класс сокетов или метод закрытия входного и выходного потока для закрытия сетевого соединения, иногда мы хотим закрыть только outputStream или InputStream, и, закрывая входной и вывод поток, мы не закрываем сетевое соединение. Это требует использования двух других методов класса сокета: ShutdownInput и ShutdownOutput. Эти два метода только закрывают соответствующие потоки ввода и вывода, но они не имеют функции закрытия сетевого соединения одновременно. Как и методы ISClosed и Isconnected, класс сокетов также предоставляет два метода, чтобы определить, закрыты ли входные и выходные потоки объекта сокета. Этими двумя методами являются isInputShutdown () и isOutputShutdown (). Следующий код демонстрирует процесс закрытия только входных и выходных потоков:
Пакет MySocket; импорт java.net.*; открытый класс myCloseConnection1 {public static void printState (сокет) {System.out.println ("IsinputShutdown:" + socket.isinputshutdown ()); System.out.println ("isoutputshutdown:" + socket.isoutputshutdown ()); System.out.println ("isclosed:" + socket.isclosed ()); System.out.println (); } public static void main (string [] args) бросает исключение {socket socket = new Socket ("www.ptpress.com.cn", 80); PrintState (сокет); Socket.ShutDownInput (); PrintState (сокет); socket.shutdownoutput (); PrintState (сокет); }} После запуска вышеупомянутого поколения вы получите следующий вывод:
ISInputShutdown: ложь
isoutputshutdown: false
ISCLESS: Неверно
ISInputShutdown: True
isoutputshutdown: false
ISCLESS: Неверно
ISInputShutdown: True
isoutputshutdown: true
ISCLESS: Неверно
Из результатов выходных данных мы видим, что метод ISCLOSED всегда возвращает FALSE, поэтому уверен, что ShutdownInput и ShutdownOutput не влияют на состояние объекта сокета.
Я надеюсь, что эта статья будет вам полезна. Это все для Java, чтобы использовать класс сокетов для получения и отправки содержания данных. Я надеюсь, что все будут продолжать следить за нашим сайтом! Если вы хотите выучить Java, вы можете продолжать следить за этим веб -сайтом.