Java клиент серверное приложение многопоточное

velikodniy / Client.java

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

import java . net .*;
import java . io .*;
import java . util .*;
public class Client
static int port = 5003 ; // Порт, такой же, как у сервера
static String address = «127.0.0.1» ; // Адрес сервера
public static void main ( String [] args )
try
// Преобразуем адрес из строки во внутреннее представление
InetAddress addr = InetAddress . getByName ( address );
// Создаём сокет и подключаем его к серверу
System . out . println ( «Поключаемся к » + address + «:» + port + «. » );
Socket socket = new Socket ( addr , port );
// Потоки ввода/вывода
// BufferedReader позволяет читать вход по строкам
BufferedReader in = new BufferedReader ( new InputStreamReader ( socket . getInputStream ()));
// PrintWriter позволяет использовать println
PrintWriter out = new PrintWriter ( new OutputStreamWriter ( socket . getOutputStream (), «UTF-8» ));
// Создаем объект для чтения строк с клавиатуры
Scanner scan = new Scanner ( System . in , «UTF-8» );
// Читаем данные с клавиатуры и отправляем серверу
// Запрашиваем строку
System . out . print ( «[Запрос]:» );
String line = scan . nextLine ();
// Отправляем строку серверу
out . println ( line );
out . flush (); // принудительная отправка
// Получаем ответ
line = in . readLine (); // ждем пока сервер отошлет строку текста.
System . out . println ( «[Ответ]:» + line );
// Закрываем соединение
socket . close ();
> catch ( IOException x )
System . out . println ( «Ошибка ввода/вывода» );
x . printStackTrace ();
>
>
>

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

import java . net .*;
import java . io .*;
public class Server
// Параметры сервера
static int port = 2345 ; // Порт, который слушает сервер. Имеет номер до 65536, но порты до 1024
// привилегированные и их занимают системные программы
public static void main ( String [] args )
try
// Создаём сокет и связываем с портом
ServerSocket sock = new ServerSocket ( port );
// Приостанавливаем программу, пока кто-то не подключится
// Для подключившегося клиента создаётся ещё один сокет.
// Это удобно, так как тогда можно работать с клиентом в другом потоке,
// а сервер будет ждать ещё кого-то.
System . out . println ( «Ожидание подключений. » );
Socket client = sock . accept ();
System . out . println ( «Подключился клиент» );
// Входной и выходной потоки для приёма и передачи данных
InputStream sin = client . getInputStream ();
OutputStream sout = client . getOutputStream ();
// Для удобства приёма и отправки данных преобразуем в тип Data*Stream
DataInputStream in = new DataInputStream ( sin );
DataOutputStream out = new DataOutputStream ( sout );
// Получаем строки с числами и отправляем назад их квадраты
while ( true )
// Ждём получения строки текста.
// Через sin.read(. ) можно получить только массив байтов (нам это сейчас не нужно),
// а экземпляры DataInputStream умеют сразу преобразовывать байты в
// простые типы.
String line = in . readUTF ();
System . out . println ( «Получена строка: » + line );
// Выполняем вычисления
try
int x = Integer . valueOf ( line );
int y = x * x ;
// Отсылаем ответ
out . writeUTF ( Integer . toString ( y ));
> catch ( NumberFormatException ex )
System . out . println ( «Получена строка: » );
out . writeUTF ( «Ожидалось целое число» );
>
out . flush (); // Принудительная отправка данных из буфера отправки (можно и без этой команды)
>
> catch ( IOException ex )
// Обработка исключений. Лучше в try-catch помещать
// отдельные команды и не весь код, как здесь, конечно.
System . out . println ( «Ошибка ввода/вывода» );
ex . printStackTrace ();
>
>
>

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

import socketserver
# Обработчик соедиений
class ThreadedTCPRequestHandler ( socketserver . BaseRequestHandler ):
# Обработка запроса
def handle ( self ):
print ( ‘Входящее соединение. ‘ , self . client_address )
# self.request — сокет входящего соединения
data = str ( self . request . recv ( 1024 ), ‘utf-8’ )
# Удаляем пробелы по краям строки
data = data . strip ()
print ( ‘Получена строка:’ , data )
# Формируем ответ
response = ‘Сервер успешно получил «<>«‘ . format ( data )
self . request . sendall ( bytes ( response , ‘utf-8’ ))
# Делаем обработчик многопоточным
class ThreadedTCPServer ( socketserver . ThreadingMixIn , socketserver . TCPServer ):
pass
if __name__ == «__main__» :
HOST , PORT = » , 5003
# Создаём сервер и указываем, какой класс обрабатывает
server = ThreadedTCPServer (( HOST , PORT ), ThreadedTCPRequestHandler )
try :
# Обслуживать непрерывно
server . serve_forever ()
# Если нажали Ctrl-C
except KeyboardInterrupt :
print ( ‘Shutdown server’ )
server . shutdown ()
server . server_close ()

Источник

Многопоточное программирование сокетов в Java?

Все разработчики знакомы с написанием последовательных программ, каждая последовательная программа имеет начало, последовательность выполнения и конец. Поток — это один последовательный поток управления внутри программы. Это независимый путь выполнения программного кода. Большинство программ, написанных сегодня, выполняются как один поток, что вызывает проблемы при одновременном возникновении нескольких событий или действий. Когда выполняется несколько потоков, путь одного потока через один и тот же код обычно отличается от других. Каждый поток в Java создается и контролируется классом Java.lang.Thread.

Существует два способа создания потока в Java;

  1. Внедрить интерфейс Runnable (Java.lang.Runnable)
  2. Расширением класса Thread (Java.lang.Thread)

Многопоточность в Java

Многопоточность в Java — это процесс одновременного выполнения нескольких потоков. Многопоточная программа содержит два или более процесса, которые могут выполняться одновременно, и каждый процесс может обрабатывать другую задачу, одновременно обеспечивая оптимальное использование доступных ресурсов, особенно когда ваш компьютер имеет несколько процессоров. Процесс выполнения нескольких потоков одновременно известен как многопоточность.

Программирование многопоточного сокета в Java

В предыдущем примере мы уже видели, как Single Socket Socket Program . В этом случае только один клиент может связываться с сервером. Он не позволит одновременных подключений клиентов. Попробуйте запустить другого клиента. Вы увидите, что второй клиент не может быть подключен, пока первый клиент не закроет его соединение. Чтобы разрешить одновременные соединения, мы должны знать многопоточное программирование. Здесь, в следующем многопоточном программировании сокета, вы можете подключить более одного клиента к серверу и обмениваться данными. Для каждого клиентского соединения сервер запускает дочерний поток для обработки запроса независимо от любых других входящих запросов.

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);

Источник

Читайте также:  Use base64 in java
Оцените статью