Ένα προσαρμοσμένο πρωτόκολλο TCP μπορεί να ταξιδέψει μέσα από έναν μεσολαβητή HTTP όταν αυτός επιτρέπει CONNECT προς τον προορισμό. Το πρωτόκολλο της εφαρμογής δεν χρειάζεται να γίνει HTTP: το HTTP στήνει τη σήραγγα και έπειτα η εφαρμογή ανταλλάσσει τα δικά της byte μέσα σε αυτή.

Το OpenJDK 25 παρέχει διαδρομή μέσω μεσολαβητή HTTP στο Socket(Proxy). Η υλοποίησή του εκτελεί την ανταλλαγή CONNECT και επιστρέφει ένα συνδεδεμένο socket για χρήση από την εφαρμογή.

Proxy route = new Proxy(
    Proxy.Type.HTTP,
    new InetSocketAddress("proxy.example", 8080));

try (Socket socket = new Socket(route)) {
    socket.setSoTimeout(10000);
    socket.connect(
        InetSocketAddress.createUnresolved("tcp-service.example", 8443),
        5000);
    InputStream input = socket.getInputStream();
    OutputStream output = socket.getOutputStream();
}

Αυτό το απόσπασμα χρησιμοποιεί κλάσεις από το java.net και το java.io. Αντικαταστήστε τα δύο τελικά σημεία και εκτελέστε την ανταλλαγή πρωτοκόλλου πριν βγείτε από το μπλοκ try. Για έναν επιτρεπόμενο δημόσιο στόχο TCP, επιλέξτε υποψηφίους HTTP από τη λίστα μεσολαβητών HTTP μόνο αφού ελέγξετε την άδεια CONNECT για τη θύρα αυτού του στόχου. Η διεύθυνση του μεσολαβητή είναι το σημείο όπου συνδέεται πρώτα η Java· η διεύθυνση που περνά στο connect προσδιορίζει την υπηρεσία που πρέπει να φτάσει ο μεσολαβητής.

Ο προορισμός που δεν έχει επιλυθεί διατηρεί το όνομα κεντρικού υπολογιστή του για το αίτημα CONNECT αυτής της υλοποίησης. Ένα επιλυμένο InetSocketAddress αντίθετα παρέχει τη διευθυνσιοδότηση IP που έχει επιλυθεί σε αυτό το αίτημα. Αυτή η διάκριση μετράει όταν ο μεσολαβητής πρέπει να επιλύσει το όνομα της υπηρεσίας ή να εφαρμόσει πολιτική βάσει ονόματος κεντρικού υπολογιστή.

Τι σας αφήνει μια επιτυχημένη σύνδεση

Οι ροές που προκύπτουν μεταφέρουν τα δεδομένα της υπηρεσίας μέσα στη σήραγγα. Δεν εκθέτουν ξεχωριστή απόκριση HTTP που θα έπρεπε η εφαρμογή σας να διαβάσει και να απορρίψει. Η προσθήκη δεύτερης ανταλλαγής CONNECT θα έστελνε κείμενο HTTP στην υπηρεσία αφού το JDK έχει ήδη στήσει τη σήραγγα.

Το παράδειγμα παρέχει χρονικό όριο σύνδεσης και χρονικό όριο ανάγνωσης socket· αυτά είναι ξεχωριστοί έλεγχοι, όχι μία συνολική προθεσμία για τη συνεδρία της εφαρμογής.

Η άδεια CONNECT ανήκει ακόμη στον μεσολαβητή. Ένα τελικό σημείο που προωθεί συνηθισμένα αιτήματα ιστού μπορεί να απορρίψει τη θύρα της υπηρεσίας ή να απαιτήσει έλεγχο ταυτότητας πριν ανοίξει σήραγγα. Κρατήστε αυτές τις αποτυχίες χωριστά από έναν διακομιστή που δέχεται τη σήραγγα αλλά αργότερα απορρίπτει το πρωτόκολλο της εφαρμογής σας.

Αν αυτό το πρωτόκολλο χρειάζεται TLS, διαπραγματευτείτε TLS μέσω του συνδεδεμένου socket με το προβλεπόμενο όνομα κεντρικού υπολογιστή της υπηρεσίας και τους συνήθεις ελέγχους πιστοποιητικών. Το CONNECT μόνο του δεν κρυπτογραφεί τη ροή. Για ένα πραγματικό HTTP API, ένας πελάτης HTTP παραμένει η πιο βολική διεπαφή, επειδή χειρίζεται και τα μηνύματα HTTP.

Σχετικά άρθρα