Java Socket (сокет) также широко известен как «сокет», который описывает IP -адреса и порты, и является рукоятостью для цепочки связи. Приложения обычно делают запросы или отвечают на сетевые запросы через «гнезда».
Используйте сокет, чтобы реализовать связь между несколькими клиентами и одним и тем же клиентом; Во -первых, клиент подключается к серверу, чтобы отправить сообщение, сервер обрабатывает сообщение после получения сообщения, а затем отвечает клиенту на сообщение после его завершения. Я написал код, реализованный сервером и клиентом благодаря своему собственному мышлению, надеясь учиться у всех и добиться успеха вместе.
Код сервера
/** * Сервер сокета * Описание функции: * */public Class Server {/** * intry * * @param args * @throws ioexception */public static void main (string [] args) бросает ioexception {// для простоты, все исключительные данные выброшены int port = 8899; // define serviceocket alluster на порторе 8899 Sergerocke Servercocecocecocecocke = New New New. Serversocket (port); System.out.println («Подождите, для подключения к клиенту ...»); В то время как (true) {// Сервер пытается получить запросы на соединение из других сокетов. Метод принятия сервера представляет собой блокирующее сокет сокета = server.accept ();/*** Наш сервер обрабатывает синхронные запросы подключения клиента. Каждый раз, когда мы получаем запрос на соединение от клиента, * мы должны сначала общаться с текущим клиентом перед обработкой следующего запроса на соединение. Это серьезно повлияет на производительность программы, когда будет больше параллелизма. * С этой целью мы можем изменить его на следующую асинхронную обработку связи с клиентом* /// Каждый раз, когда получается сокет, создается новый поток для обработки новой потока (новая задача (сокет)). Start ();} // server.close ();}/*** Класс потоков, который обрабатывает запросы сокета*/Static Class. Task (Socket Socket) {this.socket = socket;} @переопределить public void run () {try {handlerSocket ();} catch (Exception e) {e.printStackTrace ();}}/** * Общение с клиентским сокетом * * @Throws ioExcept InputStream и прочитайте информацию, отправленную клиентом из него/*** При получении данных из входного потока сокета, чтение немного похоже на вышеупомянутое, слишком сложно. * Иногда мы переодеваемся на использование BufferedReader для чтения по одной строке за раз * * Метод считывания BufferedReader считывает одну строку за раз. Этот метод заблокирован. Программа не будет продолжать выполнять, пока не будет считывать линию данных. * Итак, когда Readline будет прочитать строку? Метод считывания не будет думать, что строка была прочитана, и * положит конец блокированию и позволит программе продолжать выполняться. * Поэтому, когда мы используем линию чтения BufferedReader для чтения данных, мы должны помнить, чтобы записать разрывы строк в соответствующем выходном потоке (* будет автоматически помечена как конец после окончания потока, а линия чтения может быть распознана). После написания разрывов строки мы должны помнить, чтобы промыть, если выходной поток не закрыт немедленно, * только тогда данные могут быть действительно написаны из буфера. */BufferedReader br = new BufferedReader (new InputStreamReader (socket.getInputStream (), "utf -8")); stringBuilder sb = new StringBuilder (); string temp; int Index; while ((temp = br.readline ())! = Null) {if (index = temp.index ("eof")! = -1)! sb.append (temp.substring (0, index)); break;} sb.append (temp);} system.out.println ("form client [port:" + socket.getport () + "] Содержание сообщения:" + sb.toString ()); // Ответить на писатель клиента. "UTF-8"); writer.Write (string.format ("Hi,%d. Небо яркое, а воздух ясен, ветер гладкий!", Socket.getport ())); writer.flush (); writer.close (); system.out.println ("на клиент [порт:" + socket.getport () + "] ответить на сообщение клиента. успешно "); br.close (); socket.close ();}}}Клиентский код
Импорт java.io.inputStreamReader; импорт java.io.outputStreamWriter; импорт java.io.reader; импорт java.io.writer; import java.net.socket;/*** Cocket Client* Функция:** @author a wise и глупо static void main (string [] args) {// Откройте три клиента, один поток представляет клиент для (int i = 0; i <3; i ++) {new Thread (new Runnable () {@Override public void run () {try {testClient client = testClientFactory.crateeclient (), client.send (string. client.client.getlocalport ())); client.receive ();} catch (Exception e) {e.printstacktrace ();}}}). start ();}}/*** Завод, который создает тестовый клиент*/статический класс testClientfact {public Static TestClient Createclient () Throws ackseclient {return TestClient {127. 8899);}}/*** Тестовый клиент*/Статический класс TestClient {/*** Constructor* @param хост -хост IP -адрес сервера подключен* @param Порт соответствующий порт прослушивания сервера для подключения* @throws Exception*/public TestClient (string host, int port). port);System.out.println("Client[port:" + client.getLocalPort() + "] Establish a connection with the server...");}private Socket client;private Writer writer;/** * Send a message* @param msg * @throws Exception */public void send(String msg) throws Exception {// After establishing the connection, you can write data to the server if(writer == null) {writer = Новый outputStreamWriter (client.getOutputStream (), "utf-8");} writer.write (msg); writer.write ("eof/n"); writer.flush (); // после написания, не забудьте промыть систему. void receive() throws Exception {// Read after writing Reader reader = new InputStreamReader(client.getInputStream(), "UTF-8");// Set the time to receive data to 10 seconds client.setSoTimeout(10*1000);char[] chars = new char[64];int len;StringBuilder sb = new StringBuilder();while ((len = reader.read (chars))! = -1) {sb.append (new String (chars, 0, len));} system.out.println ("client [port:" + client.getlocalport () + "] writer.close (); client.close ();}}}Далее, давайте смоделируем:
1. Сначала запустите сервер
2. Затем запустите клиент (откройте три запроса клиента)
Для демонстрации я использую инструмент Eclipse на сервере и инструмент Intellij Idea для клиента. В настоящее время вы можете увидеть сообщение, напечатанное клиентом на консоли
Номер порта представляет клиент. Давайте посмотрим на сообщение, напечатанное сервером на консоли.
Суммировать
Приведенное выше содержимое этой статьи о Java Programming Socket, внедряющем несколько клиентов для подключения к одному и тому же коду сервера. Я надеюсь, что это будет полезно для всех. Если у вас есть какие -либо вопросы, пожалуйста, оставьте сообщение, и редактор ответит всем вовремя.