क्लाइंट स्ट्रीमिंग की व्याख्या
क्लाइंट-पक्षीय स्ट्रीमिंग लागू करना सीखें, जिससे क्लाइंट सर्वर को संदेशों का क्रम भेज सकता है।
क्लाइंट स्ट्रीमिंग की व्याख्या, CoddyKit पर gRPC और उच्च-प्रदर्शन वाले एपीआई का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह gRPC और उच्च-प्रदर्शन वाले एपीआई सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। gRPC और उच्च-प्रदर्शन वाले एपीआई पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
क्लाइंट स्ट्रीमिंग क्या है
क्लाइंट स्ट्रीमिंग में आपका स्वागत है! gRPC में, क्लाइंट स्ट्रीमिंग एक संचार पैटर्न है, जिसमें क्लाइंट सर्वर को संदेशों का क्रम भेजता है।
साधारण यूनरी RPC (अनुरोध-प्रतिक्रिया) के विपरीत, क्लाइंट केवल एक संदेश नहीं भेजता। इसके बजाय, वह संदेशों की एक स्ट्रीम भेजता है और सर्वर उन्हें संसाधित करके अंत में एकल प्रतिक्रिया भेजता है।
क्लाइंट स्ट्रीमिंग कैसे काम करती है
कल्पना कीजिए कि आप किसी बड़ी फ़ाइल को कई छोटे हिस्सों में भेजकर अपलोड कर रहे हैं। सर्वर सभी हिस्सों को एकत्र करता है, फ़ाइल को फिर से बनाता है और फिर "अपलोड पूर्ण" की एकल पुष्टि भेजता है।
- क्लाइंट RPC शुरू करता है।
- क्लाइंट कई संदेश अतुल्यकालिक रूप से भेजता है।
- सर्वर इन संदेशों को प्राप्त करके संसाधित करता है।
- क्लाइंट के संदेश भेजना समाप्त करने पर (पूर्णता का संकेत देने पर), सर्वर एकल प्रतिक्रिया भेजता है।
प्रोटोबफ़ में क्लाइंट स्ट्रीम परिभाषित करना
अपनी .proto फ़ाइल में क्लाइंट-स्ट्रीमिंग विधि परिभाषित करने के लिए, आप अनुरोध प्रकार के साथ stream कीवर्ड का उपयोग करते हैं, लेकिन प्रतिक्रिया प्रकार के साथ नहीं।
लॉग अपलोड सेवा का एक उदाहरण देखें:
syntax = "proto3";
package client_streaming;
service LogService {
rpc UploadLogs (stream LogEntry) returns (UploadSummary);
}
message LogEntry {
string message = 1;
int64 timestamp = 2;
}
message UploadSummary {
int32 uploaded_count = 1;
string status_message = 2;
}सर्वर: क्लाइंट स्ट्रीम संभालना
सर्वर की ओर, आपकी विधि क्लाइंट के आने वाले संदेशों के लिए एक StreamObserver प्राप्त करेगी और अपनी एकल प्रतिक्रिया भेजने के लिए दूसरे StreamObserver का उपयोग करेगी।
सर्वर के StreamObserver में प्रत्येक आने वाले संदेश के लिए onNext(), त्रुटियों के लिए onError() और क्लाइंट द्वारा भेजना समाप्त करने पर onCompleted() होगा।
import io.grpc.stub.StreamObserver;
import io.grpc.Server;
import io.grpc.ServerBuilder;
import client_streaming.LogEntry;
import client_streaming.LogServiceGrpc;
import client_streaming.UploadSummary;
public class LogServer {
private Server server;
private void start() throws Exception {
int port = 50051;
server = ServerBuilder.forPort(port)
.addService(new LogServiceImpl())
.build()
.start();
System.out.println("Server started, listening on " + port);
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
System.err.println("*** shutting down gRPC server since JVM is shutting down");
LogServer.this.stop();
System.err.println("*** server shut down");
}));
}
private void stop() {
if (server != null) {
server.shutdown();
}
}
private void blockUntilShutdown() throws InterruptedException {
if (server != null) {
server.awaitTermination();
}
}
public static void main(String[] args) throws Exception {
final LogServer logServer = new LogServer();
logServer.start();
logServer.blockUntilShutdown();
}
static class LogServiceImpl extends LogServiceGrpc.LogServiceImplBase {
@Override
public StreamObserver<LogEntry> uploadLogs(StreamObserver<UploadSummary> responseObserver) {
return new StreamObserver<LogEntry>() {
private int logCount = 0;
@Override
public void onNext(LogEntry log) {
// Process each log entry as it arrives
System.out.println("Received log: " + log.getMessage() + " at " + log.getTimestamp());
logCount++;
}
@Override
public void onError(Throwable t) {
System.err.println("UploadLogs cancelled or failed: " + t.getMessage());
responseObserver.onError(t);
}
@Override
public void onCompleted() {
// After all logs are received, send a single summary response
UploadSummary summary = UploadSummary.newBuilder()
.setUploadedCount(logCount)
.setStatusMessage("Successfully processed " + logCount + " log entries.")
.build();
responseObserver.onNext(summary);
responseObserver.onCompleted();
System.out.println("Finished processing client stream. Sent summary.");
}
};
}
}
}क्लाइंट: स्ट्रीम भेजना
क्लाइंट की ओर, आपको अपने संदेश भेजने के लिए एक StreamObserver मिलेगा। भेजे जाने वाले प्रत्येक संदेश के लिए आप onNext() कॉल करते हैं और अंत में स्ट्रीम के समाप्त होने का संकेत देने के लिए onCompleted() कॉल करते हैं।
सर्वर की एकल प्रतिक्रिया आपके द्वारा दिए गए अलग StreamObserver से संभाली जाएगी।
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import io.grpc.stub.StreamObserver;
import client_streaming.LogEntry;
import client_streaming.LogServiceGrpc;
import client_streaming.UploadSummary;
import java.util.concurrent.TimeUnit;
public class LogClient {
private final LogServiceGrpc.LogServiceStub asyncStub;
private final ManagedChannel channel;
public LogClient(String host, int port) {
channel = ManagedChannelBuilder.forAddress(host, port)
.usePlaintext() // For demonstration, use plaintext
.build();
asyncStub = LogServiceGrpc.newStub(channel);
}
public void shutdown() throws InterruptedException {
channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);
}
public void uploadMultipleLogs() throws InterruptedException {
StreamObserver<UploadSummary> responseObserver = new StreamObserver<UploadSummary>() {
@Override
public void onNext(UploadSummary summary) {
System.out.println("Server Response: " + summary.getStatusMessage() + " (" + summary.getUploadedCount() + " logs)");
}
@Override
public void onError(Throwable t) {
System.err.println("UploadLogs failed: " + t.getMessage());
}
@Override
public void onCompleted() {
System.out.println("Server has completed processing.");
}
};
StreamObserver<LogEntry> requestObserver = asyncStub.uploadLogs(responseObserver);
try {
// Send multiple log entries
LogEntry log1 = LogEntry.newBuilder().setMessage("User login attempt").setTimestamp(System.currentTimeMillis()).build();
LogEntry log2 = LogEntry.newBuilder().setMessage("Database query executed").setTimestamp(System.currentTimeMillis() + 100).build();
LogEntry log3 = LogEntry.newBuilder().setMessage("API call completed").setTimestamp(System.currentTimeMillis() + 200).build();
requestObserver.onNext(log1);
System.out.println("Client sent log 1");
Thread.sleep(100); // Simulate some delay
requestObserver.onNext(log2);
System.out.println("Client sent log 2");
Thread.sleep(100);
requestObserver.onNext(log3);
System.out.println("Client sent log 3");
// Mark the end of the client stream
requestObserver.onCompleted();
System.out.println("Client finished sending logs.");
// Wait for server response (handled by responseObserver)
Thread.sleep(1000); // Give time for server to respond
} catch (RuntimeException e) {
requestObserver.onError(e);
throw e;
}
}
public static void main(String[] args) throws Exception {
LogClient client = new LogClient("localhost", 50051);
try {
client.uploadMultipleLogs();
} finally {
client.shutdown();
}
}
}उदाहरण चलाना
क्लाइंट स्ट्रीमिंग को कार्य करते हुए देखने के लिए:
- पहले, आवश्यक Java क्लास उत्पन्न करने के लिए अपनी
.protoफ़ाइल का संकलन करें। - LogServer ऐप्लिकेशन चलाएँ। यह अनुरोधों के लिए सुनना शुरू करेगा।
- फिर, LogClient ऐप्लिकेशन चलाएँ। यह तीन लॉग प्रविष्टियाँ भेजकर सर्वर के सारांश की प्रतीक्षा करेगा।
संदेशों के प्रवाह को समझने के लिए क्लाइंट और सर्वर, दोनों के कंसोल आउटपुट पर ध्यान दें।
मुख्य StreamObserver विधियाँ
स्ट्रीमिंग RPC को संभालने के लिए StreamObserver इंटरफ़ेस अत्यंत महत्वपूर्ण है। क्लाइंट और सर्वर, दोनों इस इंटरफ़ेस के कार्यान्वयन का उपयोग करते हैं।
onNext(T value): स्ट्रीम में प्राप्त प्रत्येक संदेश के लिए कॉल किया जाता है। क्लाइंट इसका उपयोग संदेश भेजने के लिए और सर्वर प्राप्त करने के लिए करता है।onError(Throwable t): RPC विफल होने या रद्द किए जाने पर कॉल किया जाता है।onCompleted(): स्ट्रीम समाप्त होने पर कॉल किया जाता है। सभी संदेश भेजने के बाद क्लाइंट इसे कॉल करता है; सर्वर अपनी अंतिम प्रतिक्रिया भेजने के बाद इसे कॉल करता है।
क्लाइंट स्ट्रीमिंग का उपयोग कब करें
क्लाइंट स्ट्रीमिंग उन परिस्थितियों के लिए आदर्श है, जहाँ क्लाइंट को सर्वर को बड़ी मात्रा में डेटा या संबंधित संदेशों की श्रृंखला भेजनी हो और उसे केवल एक अंतिम परिणाम की आवश्यकता हो।
- बड़ी फ़ाइलों का अपलोड: फ़ाइल को हिस्सों में भेजना।
- लॉग एकत्रीकरण: किसी केंद्रीय लॉगिंग सेवा को अनेक लॉग प्रविष्टियाँ भेजना।
- बैच संचालन: संसाधित किए जाने वाले आइटम की सूची को एकल बैच के रूप में भेजना और सारांश प्राप्त करना।
- सेंसर डेटा संग्रह: सेंसर उपकरण से रीडिंग लगातार भेजना।
त्वरित जाँच
आप एक ऐसी gRPC सेवा बना रहे हैं, जिसमें क्लाइंट को सेंसर रीडिंग की श्रृंखला सर्वर को भेजनी है और सर्वर उन्हें संसाधित करके एकल सारांश रिपोर्ट लौटाएगा।
पुनरावलोकन: क्लाइंट स्ट्रीमिंग
आपने gRPC में क्लाइंट-साइड स्ट्रीमिंग के बारे में सीखा है!
- क्लाइंट स्ट्रीमिंग से क्लाइंट संदेशों का क्रम भेज सकता है।
- सर्वर इन संदेशों को संसाधित करके एकल प्रतिक्रिया भेजता है।
- प्रोटोबफ़ में इसे अनुरोध प्रकार के साथ
streamकीवर्ड का उपयोग करके परिभाषित किया जाता है। - संदेशों के प्रवाह को प्रबंधित करने के लिए क्लाइंट और सर्वर, दोनों
StreamObserver(onNext(),onError(),onCompleted()) का उपयोग करते हैं। - यह बड़ी मात्रा में डेटा अपलोड करने या लगातार लॉग प्रविष्टियाँ भेजने जैसे कार्यों के लिए उपयोगी है।
अब हम सर्वर-साइड स्ट्रीमिंग देखेंगे!
एआई शिक्षक के साथ gRPC और उच्च-प्रदर्शन वाले एपीआई सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 12
- पाठ
- 48
अक्सर पूछे जाने वाले प्रश्न
क्या “क्लाइंट स्ट्रीमिंग की व्याख्या” पाठ निःशुल्क है?
हाँ—“क्लाइंट स्ट्रीमिंग की व्याख्या” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और gRPC और उच्च-प्रदर्शन वाले एपीआई पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। gRPC और उच्च-प्रदर्शन वाले एपीआई पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“क्लाइंट स्ट्रीमिंग की व्याख्या” में मैं क्या सीखूँगा?
क्लाइंट-पक्षीय स्ट्रीमिंग लागू करना सीखें, जिससे क्लाइंट सर्वर को संदेशों का क्रम भेज सकता है। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ gRPC और उच्च-प्रदर्शन वाले एपीआई का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या gRPC और उच्च-प्रदर्शन वाले एपीआई शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर gRPC और उच्च-प्रदर्शन वाले एपीआई शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।
“क्लाइंट स्ट्रीमिंग की व्याख्या” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस gRPC और उच्च-प्रदर्शन वाले एपीआई पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर gRPC और उच्च-प्रदर्शन वाले एपीआई पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- सर्वर स्ट्रीमिंग की व्याख्या
- क्लाइंट स्ट्रीमिंग की व्याख्या
- द्विदिशीय स्ट्रीमिंग
- स्ट्रीमिंग प्रवाह नियंत्रण और बैकप्रेशर