- Клиент-сервер на Java
- 1-е Приложение клиент-сервер
- Выполнение клиентских и серверных программ
- How to create a simple HTTP server in Java with Undertow
- You can use the Undertow project to spin up an embedded web server, inside your Java app.
- Why though?
- What is Undertow?
- How do you use it?
- Create the Java app and add Undertow
- What we’ll create
- What you’ll need
- Overview of the project
- Set up pom.xml
- Import Undertow and create the server
- Run the app
- Package the app as an executable JAR
- Configure Maven to build a JAR
- Create the JAR and run it
- What does this build?
- Summary
- Thanks for reading. Let’s stay in touch.
- Thank you!
Клиент-сервер на Java
Это первое приложение в односторонней связи. В случае односторонней связи клиент отправляет на сервер, но сервер не отправляет обратно клиенту. При двусторонней связи клиент отправляет на сервер, а сервер отправляет обратно клиенту.
Всего в приложении TCP / IP 4 варианта.
APPLICATION NUMBER | FUNCTIONALITY |
---|---|
1st application | Client to server communication (one-way) |
2nd application | Server to client communication (one-way) |
3rd application | Server sends file contents to client (two-way, non-continuous) |
4th application | Chat program (two-way, continuous) |
1-е Приложение клиент-сервер
Приложение состоит из двух программ. Клиентская программа, работающая на стороне клиента, и серверная программа, работающая на стороне сервера. Клиентская программа WishesClient.java отправляет серверу наилучшие пожелания, а серверная программа WishesServer.java получает сообщение и печатает на своем терминале (мониторе).
Клиентская программа – WishesClient.java
import java.net.Socket; import java.io.OutputStream; import java.io.DataOutputStream; public class WishesClient < public static void main(String args[]) throws Exception < Socket sock = new Socket("127.0.0.1", 5000); String message1 = "Accept Best Wishes, Serverji"; OutputStream ostream = sock.getOutputStream(); DataOutputStream dos = new DataOutputStream(ostream); dos.writeBytes(message1); dos.close(); ostream.close(); sock.close(); >> Socket sock = new Socket ("127.0.0.1", 5000);
Конструктор класса Socket принимает два параметра – строку, IP-адрес сервера и целое число, номер порта на сервере, к которому клиент хотел бы подключиться. 127.0.0.1 – это адрес по умолчанию локальной системы в компьютерных сетях.
OutputStream ostream = sock.getOutputStream ();
Метод getOutputStream() класса Socket возвращает объект OutputStream, здесь объект является ostream. Это отправная точка всего общения (программы). Здесь сокет связан с потоками. Потоки способствуют передаче данных.
DataOutputStream dos = new DataOutputStream (ostream); dos.writeBytes (message1);
OutputStream является абстрактным классом; он не может быть использован напрямую. В приведенном выше коде он связан с конкретным классом DataOutputStream. Метод writeBytes() объекта DataOutputStream принимает строковое сообщение и передает его в Socket. Теперь клиентский сокет отправляется на другой сокет на сервере. Когда работа закончится, закройте потоки и сокет. Он освобождает дескрипторы (ссылки), связанные с системными ресурсами.
Ниже приведены исключения в вышеприведенной программе, создаваемые конструктором и различными методами.
- Socket(“127.0.0.1”, 5000) выдает UnknownHostException
- getOutputStream() генерирует IOException
- writeBytes (message1) выдает IOException
- Все методы close() выдают IOException
- Серверная программа – WishesServer.java
import java.net.ServerSocket; import java.net.Socket; import java.io.InputStream; import java.io.DataInputStream; public class WishesServer < public static void main(String args[]) throws Exception < ServerSocket sersock = new ServerSocket(5000); System.out.println("server is ready"); // message to know the server is running Socket sock = sersock.accept(); InputStream istream = sock.getInputStream(); DataInputStream dstream = new DataInputStream(istream); String message2 = dstream.readLine(); System.out.println(message2); dstream .close(); istream.close(); sock.close(); sersock.close(); >>
ServerSocket sersock = новый ServerSocket (5000);
У сервера есть два задания: одно, как и ожидалось, должно связываться, а другое связывает соединение с номером порта 5000. Для связи он использует Socket, а для привязки – ServerSocket.
Связывание – это не что иное, как выделение номера порта клиенту так долго, как ему хотелось бы; Между тем, если какой-либо другой клиент запрашивает номер порта 5000, он не должен выделяться сервером. Когда клиент отключается, порт освобождается и может быть предоставлен другому клиенту сервером.
Socket sock = sersock.accept ();
accept() – это метод класса ServerSocket, используемый сервером для привязки соединения по номеру порта 5000, запрошенного клиентом.
InputStream istream = sock.getInputStream();
Метод getInputStream() объекта Socket возвращает объект InputStream, и это отправная точка серверной программы. Сервер использует входной поток при получении сообщения.
DataInputStream dstream = new DataInputStream (istream);
Поскольку InputStream является абстрактным классом, его нельзя использовать напрямую. Он связан с конкретным классом DataInputStream.
String message2 = dstream.readLine();
Метод readLine() объекта DataInputStream читает строку сообщения из сокета и возвращает ее. Это сообщение печатается на консоли.
Примечание. При компиляции этой программы вы получаете предупреждение из-за метода readLine() объекта DataInutStream; но программа выполняется. Чтобы избежать этого предупреждения, в следующей программе используется BufferedReader.
Выполнение клиентских и серверных программ
В одной системе, чтобы действовать как клиент и сервер, откройте два шDOS и обработайте одно как клиент, а другой – как сервер. Из одного приглашения DOS сначала запустите серверную программу, а из другого приглашения DOS запустите клиентскую программу. Вы получаете вывод при запросе сервера DOS.
Это приложение и следующее – только односторонняя связь, отправляющая или получающая. Но второй набор (после следующего) приложений является двусторонним, когда клиент и сервер могут отправлять и получать (оба). Для тестирования на выделенных серверах, можно обратиться сюда https://www.mixtelecom.ru/arenda-serverov.html
Для лучшего понимания вопрос-ответ из пакета java.lang.
Сколько существует типов внутренних классов?
Ответ: 4 типа.
Что такое файлы JAR?
Ответ: JAR-файл – это заархивированный файл, сжатый JVM.
Как преобразовать строку в форму типа данных?
Ответ: Преобразование строки в тип данных – байтовое, короткое, целое, длинное, плавающее, двойное, символьное и логическое.
Как преобразовать объект в строку?
Ответ: Объект в строку – toString()
Как сравнить два объекта?
Ответ: Сравнение объектов – hashCode() & equals()
Средняя оценка 3.1 / 5. Количество голосов: 16
Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.
Видим, что вы не нашли ответ на свой вопрос.
Напишите комментарий, что можно добавить к статье, какой информации не хватает.
How to create a simple HTTP server in Java with Undertow
You can use the Undertow project to spin up an embedded web server, inside your Java app.
Sometimes, we just want something really simple. A simple breakfast. Or perhaps, a simple web server, embedded in a Java app.
To add an embedded web server to your application, you could use a framework, like Spring Boot or Quarkus. Both of these include easy options for embedding web servers.
But… frameworks require a little knowledge upfront. And frameworks add a lot of overhead, for something that can actually be solved without them.
So in this tutorial, we’ll see how to create a standalone Java application, with a main method, which uses the Undertow web server to serve a simple “Hello, world!” message over HTTP.
You’ll create a simple, standalone command-line Java application, which is packaged as a very portable, executable JAR file.
Why though?
But first, why? Where would you use this?
I created this little app to scratch my own itch. Often, I need a simple example Java application, which I can use as part of a demo or teaching.
To run a minimal web server in Java, which returns a static web page.
To add an HTTP endpoint to your existing app, perhaps to return a status message or something else to clients.
To create an example Java app to use as part of something bigger: like testing a CI/CD pipeline, or perhaps to package into a Docker image and deploy to Kubernetes.
To see how to write a standalone Java application without using a framework like Spring Boot or Quarkus (yes, it’s possible!)
To dip your toe into the world of Java + Maven with a real project
What is Undertow?
Undertow is a web server written in Java.
Undertow is an embedded web server for Java.
Like most Java projects, it’s an open source, community-driven project. You can check it out on GitHub.
How do you use it?
To add Undertow into your Java application, you import it as a library. Then you can use its API (its classes and methods) to create, configure, and start a web server.
Some application frameworks like Spring Boot can configure and start Undertow for you. But, in this tutorial, we’re going to do it manually.
Create the Java app and add Undertow
We’ll add Undertow to a Java project, and use it to serve a simple HTML page.
You don’t need to download Undertow yourself, as Maven will pull it as a dependency in during the build.
So now let’s get started and set up the project!
What we’ll create
A standalone Java application (without a framework)
What you’ll need
Java 11+: You’ll need to be running JDK 11. This example uses lambda expressions, which were a new feature in Java 8.
Overview of the project
Your project tree will look something like this when finished:
. ├── pom.xml └── src └── main └── java └── com └── tutorialworks └── demos └── hellorestjava └── Application.java
Set up pom.xml
Let’s start by creating and configuring a pom.xml in the root directory of the project.
In your Java IDE, create a new Java Maven Project. It should create your POM file ( pom.xml ) for you.
In the section of your POM file, add the dependency io.undertow:undertow-core .
The latest version of Undertow at the time of writing is 2.2.17.Final.
Next we need to add the main code.
Since this is a simple, standalone Java application, we’re going to create a main class – a class with a public static void main() method – which will be the entry point to our program.
You can create your Application.java in any package you like, but in this example I’ve located it at src/main/java/com/tutorialworks/simplehttp/Application.java
Let’s look at what we need to do.
Import Undertow and create the server
In the main method, import packages from io.undertow and create an instance of Undertow . We use the builder() to configure the host and port that the web server will listen on, and the payload that it should return.
Your code should look something like this:
" At this stage, the app is ready to run!
Run the app
We can now run the app with Maven:
mvn clean compile exec:java -Dexec.mainClass="com.tutorialworks.simplehttp.Application"
You can test the web server by going to http://localhost:8080 in your web browser.
Or, you can use a command line tool like curl to test it:
$ curl http://localhost:8080 Hello, world!
To quit, just press Ctrl+C.
But, it would be better if we could package this app into a JAR file which we can share! So let’s do that next.
Package the app as an executable JAR
The modern way of packaging Java applications is to put them inside an executable JAR file.
This means that anyone with the JRE installed can take the JAR file, and just run it with the java -jar command.
Configure Maven to build a JAR
Build our fat JAR artifact (it’s actually called a “jar-with-dependencies”)
To do this, add the following config inside the build section of your POM file:
Now we’re ready to package and run.
Create the JAR and run it
Now, to compile the application and build the JAR file:
What does this build?
This will build a “fat-jar” (a JAR containing your application, and all of its dependencies) inside the target/ folder:
$ ll target/java-http-server-undertow-1.0-SNAPSHOT-jar-with-dependencies.jar -rw-r--r--. 1 tdonohue tdonohue 3.4M Apr 5 12:30 target/java-http-server-undertow-1.0-SNAPSHOT-jar-with-dependencies.jar
As you can see, the final jar on my laptop was only 3.4Mb!
And now to run the application, just run java -jar with the relative path to the packaged JAR file:
java -jar target/java-http-server-undertow-1.0-SNAPSHOT-jar-with-dependencies.jar
Undertow should now be running on port 8080. You can use a web browser to go to http://localhost:8080 to see the output rendered as a web page.
Or, you can use a command-line HTTP client, like curl , to fetch the web page:
$ curl http://localhost:8080 Hello, world!
To quit, just press Ctrl+C.
Summary
There you have it! We’ve created a simple Java application with an embedded web server, Undertow.
To grab the full code, click the button below:
Seen that Undertow can be used to create an embedded web server in a Java app
Created a standalone Java app with a main class, which creates and starts an instance of Undertow
Packaged the application into an executable JAR file
Well done, and happy coding!
By Tom Donohue, Editor | Twitter | LinkedIn
Tom is the founder of Tutorial Works. He’s an engineer and open source advocate. He uses the blog as a vehicle for sharing tutorials, writing about technology and talking about himself in the third person. His very first computer was an Acorn Electron.
Thanks for reading. Let’s stay in touch.
It took us this long to find each other. So before you close your browser and forget all about this article, shall we stay in touch?
Join our free members’ newsletter. We’ll email you our latest tutorials and guides, so you can read at your leisure! 🏖 (No spam, unsubscribe whenever you want.)
Thank you!
We’ve sent you an email. Please check your email, and click the link inside to confirm your subscription.