User Tools

Site Tools


tanszek:oktatas:informacios_rendszerek_integralasa:protobuf

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
tanszek:oktatas:informacios_rendszerek_integralasa:protobuf [2024/03/14 11:21] – [Python mintafeladat] kneheztanszek:oktatas:informacios_rendszerek_integralasa:protobuf [2025/03/21 20:03] (current) – [Haladó lehetőségek] knehez
Line 1: Line 1:
-===== Protocol Buffer =====+===== Protocol Buffers =====
  
-Strukturált adatok szerializációjához használható megoldás a Google fejlesztésébenEnnél az adatintegrációs módszernél is megjelenik az interfész leírás.+A Protocol Buffers (Protobuf) a Google által fejlesztett módszer a **strukturált adatok szerializációjára** (bináris formába alakítására)Különösen előnyös azokban az alkalmazásokban, amelyek szerverekkel kommunikálnak vagy adatokat tárolnak, ahol az **adatátvitel sebessége** és hatékonysága kritikus. A Protobuf úgy lett tervezve, hogy egyszerűbb és hatékonyabb legyen az XML-nél és JSON-nál, kisebb üzenetméreteket és gyorsabb feldolgozást kínál.
  
-protokol buffer szerializáció miatt binárisViszont nagy előnye, hogy sok technológiát támogatez által növelve plattformfüggetlenséget.+**Protobuf** strukturált adatokat egy standard formátumban: **.proto** fájlban adja meg, amelyet aztán felhasználnak forráskód generálására a __kiválasztott programozási nyelven__. Ezt a forráskódot használják a strukturált adatok írására és olvasására különböző adatfolyamokból. 
 + 
 +==== A Protobuf jellemzői ==== 
 +  * **Hatékonyság**: A Protobuf hatékonyabb az XML és JSON alapú adattovábbításnál, mind a sebesség, mind az adatok méretének tekintetében. 
 +  * **Többnyelvű támogatás**: A Protobuf támogatja a kódgenerálást különböző programozási nyelveken, lehetővé téve az adatcsere egyszerűsítését. 
 +  * **Visszafelé kompatibilitás**: A Protobuf úgy van kialakítva, hogy kompatibilis maradjon az adatstruktúra változásai esetén islehetővé téve a régi kód számára az új adatformátumok olvasását és fordítva. 
 + 
 +A Protobuf egy adatintegrációs projektben való implementálásához tipikusan: 
 + 
 +  * Definiálni kell az adatszerkezeteket egy **.proto** fájlban. 
 +  * Protobuf fordító (**protoc**) az adathozzáférési osztályokat legenerálja a .proto fájlok alapján. 
 +  * A fejlesztő könnyen használni tudja ezeket a **generált osztályokat** szolgáltatások közötti kommunikációhoz.
  
 További részletek itt olvashatók: További részletek itt olvashatók:
  
 https://developers.google.com/protocol-buffers/docs/tutorials https://developers.google.com/protocol-buffers/docs/tutorials
- 
  
  
Line 17: Line 27:
 2.) Hozzunk létre egy könyvtárat ./proto néven és a book.proto állományt a következő tartalommal: 2.) Hozzunk létre egy könyvtárat ./proto néven és a book.proto állományt a következő tartalommal:
  
-<code c>+<sxh c>
 syntax = "proto3"; syntax = "proto3";
  
Line 30: Line 40:
     repeated Book books = 1;     repeated Book books = 1;
 } }
-</code>+</sxh>
  
 Két üzenetet hoztunk létre, Book és Books néven. A Books több Book-ot tartalmazhat. A sorok végén az = 1, = 2 a struktúra mező belső pozícióját adja meg, egytől indul a számozás. Két üzenetet hoztunk létre, Book és Books néven. A Books több Book-ot tartalmazhat. A sorok végén az = 1, = 2 a struktúra mező belső pozícióját adja meg, egytől indul a számozás.
Line 42: Line 52:
 A futtatás után létrejön a book_pb2.py ami generált forráskód, és az adat interfészt tartalmazza. Ennek segítségével lehet kezelni (szerializálni és de-szerializálni) az adatokat. A futtatás után létrejön a book_pb2.py ami generált forráskód, és az adat interfészt tartalmazza. Ennek segítségével lehet kezelni (szerializálni és de-szerializálni) az adatokat.
  
-4.) Futtassuk le a **pip install --upgrade protobuf** parancsot. +4.) Futtassuk le a **pip install protobuf** parancsot. 
  
 5.) Hozzuk létre a server.py fájlt a következő tartalommal: 5.) Hozzuk létre a server.py fájlt a következő tartalommal:
  
-<code python>+<sxh python>
 import socket import socket
 import book_pb2 import book_pb2
Line 82: Line 92:
  
 s.close() s.close()
-</code>+</sxh>
  
 6.) Hozzuk létre a create_books.py állományt az alábbi tartalommal: 6.) Hozzuk létre a create_books.py állományt az alábbi tartalommal:
  
-<code python>+<sxh python>
 import book_pb2 import book_pb2
  
Line 111: Line 121:
  
     return books     return books
-</code>+</sxh>
  
 7.) Hozzuk létre a client.py állományt az alábbi tartalommal: 7.) Hozzuk létre a client.py állományt az alábbi tartalommal:
  
-<code python>+<sxh python>
 import socket import socket
 import book_pb2 import book_pb2
Line 148: Line 158:
     fb.write(msg)     fb.write(msg)
     print("client> data.bytes saved\n")     print("client> data.bytes saved\n")
-</code>+</sxh>
  
 8.) Futtassuk le a szervert és klienst. **python server.py** majd a **python client.py** parancsokat és nézzük meg és elemezzük mi történik?  8.) Futtassuk le a szervert és klienst. **python server.py** majd a **python client.py** parancsokat és nézzük meg és elemezzük mi történik? 
 +
 +9.) Írjuk meg más nyelven a klienst! 
 +
 +Egy lehetséges megoldás az alábbi java-ban. Generáljuk le a protoc segítségével a java helper osztályt. A Maven repository-ból töltsük le a protobuf.jar-t (https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/), figyelve a megfelelő verzióra. 
 +
 +<sxh java>
 +import java.io.IOException;
 +import java.io.ObjectOutputStream;
 +import java.net.Socket;
 +
 +public class Client {
 +    Socket requestSocket;
 +    ObjectOutputStream out;
 +
 +    Client() {
 +    }
 +
 +    void run() {
 +        try {
 +            requestSocket = new Socket("localhost", 4100);
 +            out = new ObjectOutputStream(requestSocket.getOutputStream());
 +            BookOuterClass.Books books = BookOuterClass.Books.parseFrom(requestSocket.getInputStream());
 +            for (BookOuterClass.Book book : books.getBooksList()) {
 +                System.out.println("Book ID: " + book.getId());
 +                System.out.println("Author: " + book.getAuthor());
 +            }
 +
 +        } catch (IOException ioException) {
 +            ioException.printStackTrace();
 +        }
 +    }
 +
 +    public static void main(String args[]) {
 +        Client client = new Client();
 +        client.run();
 +    }
 +}
 +</sxh>
 +
 +
tanszek/oktatas/informacios_rendszerek_integralasa/protobuf.1710415295.txt.gz · Last modified: 2024/03/14 11:21 by knehez