Многопоточное программирование сокетов в Java?
Содержание
Все разработчики знакомы с написанием последовательных программ, каждая последовательная программа имеет начало, последовательность выполнения и конец. Поток - это один последовательный поток управления внутри программы. Это независимый путь выполнения программного кода. Большинство программ, написанных сегодня, выполняются как один поток, что вызывает проблемы при одновременном возникновении нескольких событий или действий. Когда выполняется несколько потоков, путь одного потока через один и тот же код обычно отличается от других. Каждый поток в Java создается и контролируется классом Java.lang.Thread.
Существует два способа создания потока в Java;
- Внедрить интерфейс Runnable (Java.lang.Runnable)
- Расширением класса Thread (Java.lang.Thread) li >
Многопоточность в Java
Многопоточность в Java - это процесс одновременного выполнения нескольких потоков. Многопоточная программа содержит два или более процесса, которые могут выполняться одновременно, и каждый процесс может обрабатывать другую задачу, одновременно обеспечивая оптимальное использование доступных ресурсов, особенно когда ваш компьютер имеет несколько процессоров. Процесс выполнения нескольких потоков одновременно известен как многопоточность.
Программирование многопоточного сокета в Java
В предыдущем примере мы уже видели, как
Для каждого клиентского соединения сервер запускает дочерний поток для обработки запроса независимо от любых других входящих запросов.
Socket serverClient=server.accept(); ServerClientThread sct = new ServerClientThread(serverClient,counter);
ServerClientThread - это новый класс, который расширяет класс Thread. Здесь вы можете видеть, а не обрабатывать входящие запросы в том же потоке, который принимает клиентское соединение, соединение передается клиентскому потоку, который обрабатывает запрос. Таким образом, поток, прослушивающий следующие входящие запросы, тратит как можно больше времени на вызов serverSocket.accept(). Таким образом, риск сводится к минимуму, поскольку клиентам отказывают в доступе к серверу, потому что поток прослушивания не находится внутри вызова accept(). Здесь клиентский поток фактически выполняет запрос. Тем временем сервер может принимать несколько клиентских запросов и запускать обработку. Поэтому отдельные потоки будут запущены, и они будут работать параллельно. В этом примере клиент отправляет номер на сервер и в ответ на каждый клиент сервер отправляет квадрат полученного номера.
Многопоточная программа Socket сервера в Java
import Java.net.*; import Java.io.*; public class MultithreadedSocketServer { public static void main(String[] args) throws Exception { try{ ServerSocket server=new ServerSocket(8888); int counter=0; System.out.println("Server Started ...."); while(true){ counter++; Socket serverClient=server.accept(); // сервер принимает запрос на подключение клиента System.out.println(" >> " + "Client No:" + counter + " started!"); ServerClientThread sct = new ServerClientThread(serverClient,counter); // отправляем запрос в отдельный поток sct.start(); } }catch(Exception e){ System.out.println(e); } } }
Клиентская программа сервера
Этот класс потока клиентов сервера обрабатывал запрос независимо от любых других входящих запросов. Следующая программа Java является частью программы Multithreaded Server Socket.
class ServerClientThread extends Thread { Socket serverClient; int clientNo; int squre; ServerClientThread(Socket inSocket,int counter){ serverClient = inSocket; clientNo=counter; } public void run(){ try{ DataInputStream inStream = new DataInputStream(serverClient.getInputStream()); DataOutputStream outStream = new DataOutputStream(serverClient.getOutputStream()); String clientMessage="", serverMessage=""; while(!clientMessage.equals("bye")){ clientMessage=inStream.readUTF(); System.out.println("From Client-" +clientNo+ ": Number is :"+clientMessage); squre = Integer.parseInt(clientMessage) * Integer.parseInt(clientMessage); serverMessage="From Server to Client-" + clientNo + " Square of " + clientMessage + " is " +squre; outStream.writeUTF(serverMessage); outStream.flush(); } inStream.close(); outStream.close(); serverClient.close(); }catch(Exception ex){ System.out.println(ex); }finally{ System.out.println("Client -" + clientNo + " exit!! "); } } }
Клиентская программа
Это настоящая клиентская программа, запрашивающая подключение к серверу. Для каждого клиента вам нужно открыть отдельное окно консоли для запуска клиентской программы.
import Java.net.*; import Java.io.*; public class TCPClient { public static void main(String[] args) throws Exception { try{ Socket socket=new Socket("127.0.0.1",8888); DataInputStream inStream=new DataInputStream(socket.getInputStream()); DataOutputStream outStream=new DataOutputStream(socket.getOutputStream()); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String clientMessage="",serverMessage=""; while(!clientMessage.equals("bye")){ System.out.println("Enter number :"); clientMessage=br.readLine(); outStream.writeUTF(clientMessage); outStream.flush(); serverMessage=inStream.readUTF(); System.out.println(serverMessage); } outStream.close(); outStream.close(); socket.close(); }catch(Exception e){ System.out.println(e); } } }
Как запустить эту программу?
Следующим шагом является запуск программы Java TCPClient Socket Program на том же компьютере или других компьютерах в той же сети. Когда вы запускаете клиентскую программу, она установит соединение с сервером и ожидает ввода с клиентской стороны. Клиентская программа неоднократно запрашивает у пользователя ввод целого числа, отправляет на сервер и получает квадрат целого с сервера. Если вы хотите протестировать несколько клиентов, для каждого клиента вам нужно открыть отдельное окно консоли для запуска клиентской программы. Когда клиент отправляет «bye» со стороны клиента, сервер закрывает соединение с клиентом. На следующем изображении вы можете увидеть, как сервер и несколько клиентов обмениваются данными с сервером.
Если ваша программа «Сервер и клиент» работает на одном компьютере, дайте «127.0.0.1».
Socket socket=new Socket("127.0.0.1",8888);
В противном случае укажите IP-адрес устройства, на котором запущен MultithreadedSocketServer.