Для приложений в реальном времени или в играх в реальном времени протокол HTTP часто не может удовлетворить наши потребности. Гребень очень практична для нас. Ниже приведены примечания для этого исследования. В основном он объясняет аспекты типа исключения, принципа взаимодействия, сокета, серверкета и многопоточного чтения.
Тип исключения
Прежде чем понять содержание сокета, вам необходимо понять некоторые типы исключений. Следующие четыре типа унаследованы от ioException, так много ioException появляется сразу после этого.
Unkownhostexception: имя хоста или ошибка IP
ConnectException: сервер отказывается подключаться, сервер не запускается (количество очередей превышает, соединение отклоняется)
Sockettimeoutexception: тайм -аут подключения
BindException: объект сокета не может быть связан с сформулированным локальным IP -адресом или портом
Процесс взаимодействия
Я думаю, что следующая картина была объяснена подробно и ясно.
Гнездо
Конструктор
Socket () сокет (адрес inetAddress, порт int) бросает неизвестную хостекцепцию, ioexceptionsocket (inetadressdress, порт int, inetadress localddress, int localport) бросает ioexceptionsocket (String host, int port) throws localdressexception, ioexceptionscocetocket (int port, inetAdress localdresspect
За исключением первых без параметров, другие конструкторы попытаются установить соединение с сервером. Если это не удастся, будет выброшена ошибка ioException. В случае успеха объект сокета возвращается.
InetAddress - это класс, используемый для записи хоста. Его статическое GethostbyName (String MSG) может вернуть экземпляр, и его статический метод getLocalhost () также может получить IP -адрес текущего хоста и вернуть экземпляр. Параметры конструктора сокета (строковый хост, порт int, inetaddress localddress, int localport) являются целевым IP, целевым портом, локальным IP и локальным портом.
Метод сокета
getInetAddress (); IP -адрес удаленного сервера
getPort (); порт удаленного сервера
IP -адрес getLocalAddress () локального клиента
getLocalport () порт местного клиента
GetInputStream (); GetInputStream ();
getOutStream (); Получите выходной поток
Стоит отметить, что среди этих методов наиболее важными являются getInputStream () и getOutputStream ().
Статус розетки
isclosed (); // закрыто соединение? Если закрыто, верните True; В противном случае вернуть ложь
isConnect (); // вернуть True, если подключено; В противном случае вернуть ложь
isbound (); // Если сокет был связан с локальным портом, верните True; В противном случае вернуть ложь
Если вы хотите подтвердить, находится ли статус сокета в связи, следующее утверждение является хорошим способом судить.
boolean isconnection = socket.isconnected () &&! socket.isclosed (); // Судите, находится ли он в настоящее время в связи
Полузакрытый розетка
Много раз мы не знаем, сколько времени нужно, чтобы закончить в полученном входном потоке. Вот несколько общих методов:
Serversocket
Конструктор
Serversocket () бросает ioexceptionserversocket (int port), выписывает ioexceptionserversocket (int port, int backlog) throws ioexceptionserversocket (int port, int backlog, inetadress bindaddr), бросает ioexception
Примечание:
1. порт, который будет слушать сервер порта; Длина очереди запроса на подключение клиента за отставание; Сервер bindAddr связывает IP
2. Если порт занят или не имеет разрешения на использование определенных портов, будет выброшена ошибка BindException. Например, порты от 1 до 1023 требуют, чтобы администратор имел привязку разрешения.
3. Если порт установлен на 0, система автоматически назначит ему порт;
4. BindAddr используется для привязки IP -адреса сервера. Почему такая настройка? Например, некоторые машины имеют несколько сетевых карт.
5. Как только Serversocket связан с портом прослушивания, его нельзя изменить. Serversocket () может установить другие параметры перед привязкой порта.
Однопоточный пример Serversocket
public void service () {while (true) {сокет сокета = null; try {socket = serversocket.accept (); // возьмите соединение из очереди подключения, если нет, подождите System.out.println ("Адрес:"+socket.getInetAdress ()+":"+socket.getPort ()); ... // получать и отправлять данные} catch (ioexception e) {e.printstacktrace ();} наконец {try {if (socket! = Null) socket.close (); // после связи с клиентом, закрыть сокет} catch (ioexception e) {e.printstack ();}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}Многопоточный сервер
Само собой разумеется, преимущества мультиподбота являются многопользовательскими, а большинство сценариев-многопоточное. Будь то наши игры в реальном времени или IM, необходимы многопоточности. Давайте поговорим о методе реализации ниже:
Методы, которые реализуют мультипотоку, либо наследуют класс потоков, либо реализуют выполняемый интерфейс. Конечно, также можно использовать пулы потоков, но суть реализации аналогична.
Вот пример:
Следующий код является основным потоком сервера. Назначьте систему работника каждому клиенту:
public void service () {while (true) {сокет сокета = null; try {socket = serversocket.accept (); // Основной поток получает поток клиентского подключения horkthread = new Thread (новый обработчик (сокет)); // Создание потока horkthread.start (); // начало потока} catch (Exception e) {e.printstackTrace (); }}}Конечно, основное внимание здесь уделяется реализации класса обработчиков. Хэндлер должен реализовать запускаемый интерфейс:
Класс обработчик реализует Runnable {Private Socket Socket; Public Handler (сокет сокета) {this.socket = ocket; } public void run () {try {System.out.println ("New Connection:"+socket.getInetAddress ()+":"+socket.getport ()); Thread.sleep (10000); } catch (Exception e) {e.printStackTrace ();} наконец {try {System.out.println ("Закрыть соединение:"+socket.getInetAddress ()+":"+socket.getPort ()); if (ocket! = null) ocket.close (); } catch (ioException e) {e.printstackTrace (); }}}} Конечно, сначала есть и другие способы многопоточных, таких как бассейны резьбов или пулы потоков, которые встроены в JVM. Я не объясню это здесь.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.