В этой статье описывается простое серверное клиентское приложение сетевого программирования Java. Поделитесь этим со всеми для справки. Подробности следующие:
В Java мы используем java.net.Socket и связанные с ним классы для выполнения сетевых функций. Класс Socket очень прост и удобен в использовании, поскольку технология Java скрывает сложный процесс установления сетевого соединения и отправки данных через это соединение. Сказанное ниже относится только к протоколу TCP.
1. Подключитесь к серверу
Мы можем использовать конструктор класса Socket для открытия сокета, например:
Socket sk = новый Socket("210.0.235.14",13);
Среди них 210.0.235.14 — это десятичный строковый объект с точками, представляющий IP-адрес (или имя хоста) хоста назначения, а 13 — назначенный порт 13 для подключения к хосту назначения. Здесь 210.0.235.14 — это сервер синхронизации, расположенный в Гонконге. Порт сервера синхронизации по умолчанию обычно равен 13.
Обратите внимание, что программа блокируется до тех пор, пока не будет успешно подключена к серверу.
Далее вы можете использовать метод getInputStream() класса Socket, чтобы получить объект InputStream. С помощью этого объекта вы можете получить информацию, отправленную нам целевым хостом:
Входной поток inStream = sk.getInputStream();
Аналогичным образом, чтобы отправить данные на целевой хост, вы можете вызвать метод getOutputStream(), чтобы получить объект выходного потока.
Следующий пример функции предназначен для подключения к серверу синхронизации и вывода возвращенной информации на стандартный вывод:
try { Socket sk = new Socket("210.0.235.14",13); sk.setSoTimeout(3000); InputStream inStream = sk.getInputStream(); //Получаем объект входного потока Scanner sc = new Scanner(inStream); / Вывести данные на консоль while(sc.hasNextLine()) { String str = sc.nextLine(); System.out.println("Выход: " + str); } sk.close(); } catch(SocketTimeoutException e) //Исключение тайм-аута { System.out.println("Time Out!" } catch(Exception e) ) { e.printStackTrace() };
Метод setSoTimeout() в коде может устанавливать таймаут, то есть, если операции чтения и записи не были завершены по истечении установленного времени, будет выброшено исключение SocketTimeoutException, и соединение можно будет закрыть, перехватив это исключение.
Существует также проблема таймаута, которую необходимо решить, а именно конструктор класса Socket.
новый сокет (хост, порт);
Он будет блокироваться на неопределенный срок, пока соединение с целевым хостом не будет успешно установлено. Это, конечно, не то, чего мы хотим. Мы можем решить эту проблему, позвонив:
Socket sk = new Socker();sk.connect(new InetSocketAddress(host,port),2000);//Установим таймаут на 2 секунды
2. Получите адрес хоста
Статический метод getByName(hostname) класса InetAddress может возвращать объект InetAddress, представляющий адрес узла. Этот объект содержит 4-байтовую последовательность, которая является IP-адресом узла. Затем вызовите метод getHostAddress(), чтобы вернуть объект String, представляющий IP-адрес.
Некоторые имена хостов с большим объемом трафика обычно соответствуют нескольким IP-адресам для достижения балансировки нагрузки. Мы можем получить все адреса хостов, вызвав метод getAllByName(), который возвращает массив объектов InetAddress.
Ниже приведена простая небольшая программа. Функция состоит в том, чтобы распечатать локальный IP-адрес, если в командной строке не заданы параметры. Если указано имя хоста, выводятся все IP-адреса хоста:
пакет cls; import public class ShowIP { public static void main(String[] args) { try { if(args.length > 0) { String hostName = args[0]; //Имя хоста InetAddress[ ] addr = InetAddress.getAllByName(hostName); //Получить все адреса хоста //Вывести вывод на консоль for(InetAddress адрес: адрес) { System.out.println(address.getHostAddress()); } } else { System.out.println(InetAddress.getLocalHost().getHostAddress()); catch(Exception e) { e.printStackTrace() } }; }
3. Серверная программа
Серверные приложения используют класс ServerSocket для создания сокета и привязки его к локальному порту, например:
ServerSocket sock = новый ServerSocker(8000);
Метод sock.accept() позволяет программе непрерывно ожидать соединения. Этот метод будет возвращать объект Socket, представляющий новое соединение, только при подключении клиента, то есть этот метод будет блокироваться.
Тут вообще надо для каждого соединения открывать новый поток для его обслуживания.
Ниже приведен полный пример. Сервер ожидает соединения на порту 8400. Всякий раз при поступлении соединения открывается новый поток для его обслуживания, и информация о соединении записывается в файл журнала:
пакет cls; импорт java.io.*; импорт java.util.*; public class ServerDemo { /** * @param args */ public static void main(String[] args) { try { //ServerSocket servSocket = новый ServerSocket (8000); ServerSocket servSocket = новый ServerSocket (8400); int sum = 0; while(true) {Socket client = servSocket.accept(); ++amount; Date time = new Date(); String Prompt = time.toString() + ":th" + количество + "user" + client.getInetAddress ( ).getHostAddress() + "Connected/n"; System.out.print(prompt); //Вывод информации на консоль ServerDemo.writeLog(prompt); //Запись в файл//запуск нового потока Thread th = new Thread(new ServThread(client,amount)); } } catch(Exception e) { e.printStackTrace() } } // Запись в файл журнала public static void writeLog(String str) { File logFile = new File("server-log.txt" try { FileWriter out = new); FileWriter(logFile,true); out.append(str); out.close(); } catch(Exception e) { e.printStackTrace(); } } /* * Класс потока службы*/ class ServThread реализует Runnable { Private Клиент сокета; частный int ix; общественный ServThread (Socket soc, int ix) {клиент = soc; { try { InputStream inStream = client.getInputStream(); OutputStream = client.getOutputStream(); Scanner Recv = new Scanner(inStream); send = new PrintWriter(outStream,true); Несколько слов! [Введите «пока», чтобы закрыть соединение]"); while(recv.hasNextLine()) { String str = Recv.nextLine(); if(str.equals("bye")) { send.println("Увидимся позже ~ ^-^"); перерыв; } send.println("Это тестовая программа, в ней пока нет функций"); } Date time = new Date(); String Prompt = time.toString() + ": user" + ix + "th" + client.getInetAddress().getHostAddress() + "Disconnected/n"; ServerDemo.writeLog(приглашение); /Записать в файл client.close(); } catch(Exception e) { e.printStackTrace(); } } };
Эта программа была размещена на сервере. Вы можете использовать команду telnet youhol.tk 8400, чтобы проверить результаты работы этой программы.
Я надеюсь, что эта статья будет полезна каждому, кто занимается программированием на Java.