Bu sayfa son olarak Mayıs 2013 tarihinde güncellendi ve 0.9.6 yöneltici sürümü için geçerli.

Neden I2P için özel kod yazmalısınız?

I2P üzerinde uygulamaları kullanmanın birden çok yolu vardır. I2PTunnel kullanarak, açık I2P desteğini programlamanıza gerek kalmadan normal uygulamaları kullanabilirsiniz. Bu kullanım, tek bir site ile bağlantı kurmanız gereken istemci-sunucu senaryoları için çok etkilidir. Şekil 1'de gösterildiği gibi, bu siteye bağlanmak için I2PTunnel kullanarak bir tünel oluşturabilirsiniz.

Uygulamanız dağıtılmış yapıdaysa, çok sayıda eşle bağlantı kurması gerekir. I2PTunnel kullanarak, Şekil 2'de gösterildiği gibi, iletişim kurmak istediğiniz her eş için yeni bir tünel oluşturmanız gerekir. Bu süreç elbette otomatikleştirilebilir. Ancak çok sayıda I2PTunnel kopyası çalıştırmak büyük miktarda ek yük oluşturur. Ek olarak, birçok iletişim kuralıyla, herkesi tüm eşler için aynı bağlantı noktası kümesini kullanmaya zorlamanız gerekir. Örneğin DCC sohbetini güvenilir bir şekilde çalıştırmak istiyorsanız, TCP/IP iletişim kuralına özel bilgiler (sunucu adresi ve bağlantı noktası) içerdiğinden, herkesin 10001 numaralı bağlantı noktasının Alice, 10002 numaralı bağlantı noktasının Bob, 10003 numaralı bağlantı noktasının da Charlie olduğu konusunda hemfikir olması gerekir.

Genel ağ uygulamalarında genellikle kullanıcıların kimliğini belirlemek için kullanılabilecek birçok ek veri gönderilir. Sunucu adları, bağlantı noktaları, saat dilimleri, karakter kümeleri gibi pek çok veri kullanıcının bilgisi olmadan gönderilir. Bu nedenle, ağ iletişim kuralını özellikle anonimliği göz önünde bulundurarak tasarlamak, kullanıcı kimliklerinin belirlenmesini önleyebilir.

I2P üzerinde nasıl etkileşim kurulacağını belirlerken gözden geçirilmesi gereken verimlilik konuları da vardır. Akış kitaplığı ve bunun üzerine kurulan şeyler, TCP yapısındakine benzer el sıkışmaları ile çalışır. Çekirdek I2P iletişim kuralları (I2NP ve I2CP) ise kesinlikle ileti tabanlıdır (UDP veya bazı durumlarda ham IP adresi gibi). Önemli fark, I2P ile iletişimin uzun ve dolu bir ağ üzerinden çalışmasıdır. Her uçtan uca iletide önemsiz gecikmeler olacaktır, ancak birkaç KB boyutunda yükler bulunabilir. Basit bir istek ve yanıta gerek duyan bir uygulama, MTU algılaması veya iletilerin parçalanması konusunda endişelenmeden (en iyi çaba) veri şemalarını kullanarak herhangi bir durumdan kurtularak, başlatma ve kapatma el sıkışmalarından kaynaklanan gecikmeyi azaltabilir.

I2PTunnel kullanarak bir sunucu-istemci bağlantısı oluşturmak için yalnızca tek bir tünel oluşturulması gerekir.

Şekil 1: I2PTunnel kullanarak bir sunucu-istemci bağlantısı oluşturmak için yalnızca tek bir tünel oluşturulması gerekir.

Eşler arası uygulamalarla bağlantı kurmak için çok büyük sayıda tünel oluşturulması gerekir.

Şekil 2: Eşler arası uygulamalarla bağlantı kurmak için çok büyük sayıda tünel oluşturulması gerekir.

Özetle, I2P uygulamasına özel kod yazmak için birkaç neden:
  • Büyük miktarda I2PTunnel kopyası oluşturmak, önemsiz sayılamayacak miktarda kaynak tüketir ve bu, dağıtılmış uygulamalar için sorunlu bir durumdur (her eş için yeni bir tünel gerekir).
  • Genel ağ iletişim kurallarında genellikle kullanıcıların kimliğini belirlemek için kullanılabilecek birçok ek veri gönderilir. Özellikle I2P için program geliştirmek, bu tür bilgileri sızdırmayan, kullanıcıları anonim ve güvende tutan bir ağ iletişim kuralının oluşturulmasını sağlar.
  • Normal İnternet üzerinde kullanılmak üzere tasarlanmış ağ iletişim kuralları, çok daha yüksek gecikme süresine sahip bir ağ olan I2P üzerinde verimsiz olabilir.

I2P, geliştiriciler için standart bir eklenti arayüzünü destekler böylece uygulamalar kolayca bütünleştirilebilir ve dağıtılabilir.

Java ile yazılmış ve standart webapps/app.war aracılığıyla bir HTML arayüzü kullanılarak erişilebilen/çalıştırılabilen uygulamaların I2P dağıtımına katılması düşünülebilir.

Önemli kavramlar

I2P kullanırken değiştirilmesi gereken birkaç ayar bulunuyor:

Hedef ~= sunucu + bağlantı noktası

I2P üzerinde çalışan bir uygulama, şifreleme açısından güvenli benzersiz bir uç noktadan - bir "hedef" üzerinden iletiler gönderir ve alır. TCP veya UDP tanımlarında, bir hedef (genellikle) bir sunucu adı ile bağlantı noktası çiftinin eşdeğeri olarak kabul edilebilir. Ancak birkaç fark vardır.

  • Bir I2P hedefinin kendisi şifrelenmiş bir yapıdır. Birine gönderilen tüm veriler, evrensel IPsec dağıtımı varmış gibi şifrelenir ve uç noktanın (anonimleştirilmiş) konumu, evrensel DNSSEC dağıtımı varmış gibi imzalanır.
  • I2P hedefleri mobil tanımlayıcılardır. Bir I2P yönelticiden diğerine taşınabilirler (veya "birden çok barındırma" kullanıyor bile olabilir ya da aynı anda birden fazla yöneltici üzerinde çalışabilirler). Bu, tek bir uç noktanın (bağlantı noktası) tek bir bilgisayarda bulunması gereken TCP veya UDP dünyasından oldukça farklıdır.
  • I2P hedefleri çirkin ve büyüktür. Perde arkasında, şifreleme için herkese açık 2048 bit ElGamal anahtarı, imzalama için herkese açık 1024 bit DSA anahtarı ve çalışıyor olmanın kanıtı veya kör veriler içerebilen değişken boyutlu bir sertifika içerirler.

    Bu büyük ve çirkin hedefleri kısa ve güzel adlarla ("irc.duck.i2p" gibi) anmanın çeşitli yöntemleri bulunuyor. Ancak bu yöntemler küresel olarak benzersizliği garanti etmez (çünkü her kişinin bilgisayarındaki bir veri tabanında yerel olarak depolanırlar) ve var olan yöntem özellikle ölçeklenebilir veya güvenli değildir (sunucu bilgisayar listesindeki güncellemeler, adlandırma hizmetlerine "abonelikler" kullanılarak yönetilir). Gelecekte bir gün güvenli, insan tarafından okunabilen, ölçeklenebilir ve küresel olarak benzersiz bir adlandırma sistemi var olabilir. Ancak böyle dev bir yapının mümkün olmayacağını düşünenler bulunduğundan, uygulamalar bunun yapının varlığına bağlı olmamalıdır. Adlandırma sistemi hakkında ayrıntılı bilgi alabilirsiniz.

Çoğu uygulamanın iletişim kurallarını ve bağlantı noktalarını ayırt etmesi gerekmese de, I2P bunları destekler. Karmaşık uygulamalar, bağlantı noktasından bağlantı noktasına ve ileti bazında bağlantı noktasına, tek bir hedef üzerinde çoklayıcı trafiğe gibi farklı uygulamalar için belirli bir iletişim kuralını seçebilir. Ayrıntılı bilgi almak için veri şeması sayfasına bakabilirsiniz. Basit uygulamalar, bir hedefin "tüm bağlantı noktaları" üzerindeki "tüm iletişim kurallarını" dinleyerek çalışır.

Anonimlik ve gizlilik

I2P, ağ üzerinden geçirilen tüm veriler için uçtan uca şeffaf şifreleme ve kimlik doğrulama özelliğine sahiptir Bob, Alice hedefine bir veri gönderdiğinde, yalnızca Alice'in hedefi bunu alabilir ve Bob veri akış şemalarını veya akış kitaplığını kullanıyorsa, Alice Bob'un hedefi olduğunu ve veriyi gönderen kişinin o olduğunu kesin olarak bilir.

Tabii ki, I2P, Alice ve Bob arasında gönderilen verileri şeffaf bir şekilde anonimleştirir. Ancak gönderdiklerinin içeriğini anonimleştirmek için hiçbir şey yapmaz. Örneğin, Alice Bob'a tam adını, resmi kimliklerini ve kredi kartı numaralarını içeren bir form gönderirse, I2P bu durumda bir şey yapamaz. Bu nedenle, iletişim kuralları ve uygulamalar, hangi bilgileri korumaya çalıştıklarını ve hangi bilgileri açık etmeye istekli olduklarını göz önüne almalıdır.

I2P veri şemalarının boyutu birkaç KB kadar olabilir

I2P veri şemalarını (ham veya güvenilir olanlar) kullanan uygulamalar aslında UDP gibi düşünülebilir. Veri şemaları sırasız, en iyi çaba gerektiren ve bağlantısızdır. Ancak UDP aksine, uygulamaların MTU algılaması konusunda endişelenmesi gerekmez ve büyük veri şemaları basitçe ateşlenebilir. Üst sınır nominal olarak 32 KB iken, ileti aktarılmak için parçalanır, bu nedenle bütünün güvenilirliği düşer. Şu anda yaklaşık 10 KB boyutunun üzerindeki veri şemaları önerilmiyor. Ayrıntılı bilgi almak için datagram sayfasına bakabilirsiniz. Birçok uygulamada, tam bir istek veya yanıt için 10 KB boyutunda veri yeterlidir. Bu değer, uygulamanın parçalama, yeniden gönderme gibi işlemler yapmasına gerek kalmadan, I2P üzerinde UDP benzeri şeffaf bir şekilde çalışmasını sağlar.

Geliştirme seçenekleri

I2P üzerinden veri göndermek için, her birinin artı ve eksi yönleri olan birkaç yöntem vardır. Akış kitaplığı, önerilen ve I2P uygulamalarının çoğu tarafından kullanılan arabirimdir.

Akış kitaplığı

Tam akış kitaplığı artık standart arabirimdir. Streaming geliştirme rehberinde açıklandığı gibi, programlamada TCP benzeri soketlerin kullanılabilmesini sağlar.

BOB

BOB, herhangi bir dilde bir uygulamanın I2P üzerinden geliş ve gidiş akış bağlantıları kurmasını sağlayan Basic Open Bridge uygulamasıdır. Şu anda UDP desteği yok, ancak yakın gelecekte UDP desteği olması planlanıyor. BOB üzerinde ayrıca, hedef anahtar oluşturma ve bir adresin I2P özelliklerine uygunluğunu doğrulama gibi çeşitli araçlar bulunur. BOB kullanımı ile ilgili güncel bilgiler ve uygulamalar I2P sitesinde bulunabilir.

SAM, SAM V2, SAM V3

SAM önerilmez. SAM V2 iyidir, SAM V3 önerilir.

SAM, herhangi bir dilde yazılmış bir uygulamanın düz bir TCP soketi üzerinden bir SAM köprüsüyle konuşmasını ve bu köprünün tüm I2P trafiğini çoklamasını, şifrelemesini/şifre çözmesini ve olay tabanlı işlemesini şeffaf bir şekilde koordine etmeyi sağlayan basit anonim iletişim kuralıdır (Simple Anonymous Messaging). SAM, üç çalışma şeklini destekler:

  • Akışlar, Alice ve Bob birbirlerine güvenilir ve sırayla veri göndermek istediğinde
  • Güvenilir veri şemaları, Alice Bob'a, Bob'un yanıtlayabileceği bir ileti göndermek istediğinde
  • Ham veri şemaları, Alice olabildiği kadar bant genişliğini ve başarımı sıkıştırmak istediğinde ve Bob veri göndericisinin kimliğinin doğrulanıp doğrulanmadığını umursamadığında (örneğin, aktarılan veri kendi kendini doğruluyorsa)

SAM V3, SAM ve SAM V2 ile aynı hedefe ulaşmayı amaçlar. Ancak çoklamayı ya da çoklamayı çözmeyi gerektirmez. Her I2P akışı, uygulama ile SAM köprüsü arasındaki kendi soketi tarafından işlenir. Ayrıca, SAM köprüsü ile veri şeması iletişimleri yoluyla uygulama tarafından veri şemaları gönderilebilir ve alınabilir.

SAM V2, imule tarafından kullanılan ve bazı SAM sorunlarını gideren yeni bir sürümdür.
SAM V3, imule tarafından 1.4.0 sürümünden beri kullanılmaktadır.

I2PTunnel

I2PTunnel uygulaması, I2PTunnel 'istemci' uygulamaları (belirli bir bağlantı noktasını dinleyen ve o bağlantı noktasına bir soket açıldığında belirli bir I2P hedefine bağlanan) veya I2PTunnel 'sunucu' uygulamaları oluşturarak, uygulamaların eşler için belirli TCP benzeri tüneller kurmasını sağlar (bunlar belirli bir I2P hedefini dinler ve ne zaman yeni bir I2P bağlantısı alırsa, belirli bir TCP sunucusuna/bağlantı noktasına çıkış vekil sunucusu olarak gönderir). Bu akışlar 8 bit temiz veri içerir ve SAM tarafından kullanılan akış kitaplığı aracılığıyla kimliği doğrulanır ve güvence altına alınır. Ancak her birinin kendi benzersiz I2P hedefi ve kendi tünel kümesi, anahtarları vb. olduğundan, birden çok benzersiz I2PTunnel kopyası oluşturmayla ilgili önemsiz bir ek yük oluşur.

SOCKS

I2P, bir SOCKS V4 ve V5 vekil sunucusunu destekler. Gidiş bağlantıları iyi çalışıyor. Geliş (sunucu) ve UDP özellikleri eksik ve denenmemiş olabilir.

Ministreaming

Kaldırıldı

Eskiden basit bir "mini akış" kitaplığı vardı. Ancak şimdi tam akış kitaplığının arayüzleri için yalnızca ministreaming.jar kullanılıyor.

Veri şemaları

UDP benzeri uygulamalar için önerilir

Veri şeması kitaplığı, UDP benzeri paketlerin gönderilmesini sağlar. Şunlar kullanılabilir:

  • Güvenilir veri şemaları
  • Ham veri şemaları

I2CP

Önerilmez

I2CP dilden bağımsız bir iletişim kuralıdır. Ancak bir I2CP kitaplığını Java yerine başka bir şeye uygulamak için yazılması gereken önemli miktarda kod vardır (şifreleme alt programları, nesne sıralama, asenkron ileti işleme, vb.). Birisi C ya da başka bir dil üzerinde bir I2CP kitaplığı yazabilirken, C SAM kitaplığını kullanmak büyük olasılıkla daha yararlı olacaktır.

İnternet uygulamaları

I2P, Jetty site sunucusuyla birlikte gelir ve kolayca bunun yerine Apache sunucusunu kullanacak şekilde yapılandırılabilir. Herhangi bir standart internet uygulaması teknolojisinin çalışması beklenir.

Geliştirmeye giriş: Basit bir rehber

I2P kullanarak yazılım geliştirmek için, çalışan bir I2P kurulumu ve kendi seçtiğiniz bir geliştirme ortamı gerekir. Java kullanıyorsanız, akış kitaplığı veya veri şeması kitaplığı kullanarak geliştirmeye başlayabilirsiniz. Başka bir programlama dili kullanılarak SAM veya BOB kullanılabilir.

Akış kitaplığı ile yazılım geliştirmek

Aşağıdaki örnek, akış kitaplığını kullanarak TCP benzeri istemci ve sunucu uygulamalarının nasıl oluşturulacağını gösterir.

Bunun için, sınıf yolunuzda şu kitaplıklar bulunmalıdır:

  • $I2P/lib/streaming.jar: Akış kitaplığının kendisi
  • $I2P/lib/mstreaming.jar: Akış kitaplığı için atölye ve arayüzler
  • $I2P/lib/i2p.jar: Standart I2P sınıfları, veri yapıları, API ve yardımcı programlar

Bunları bir I2P kurulumundan alabilir veya Maven Central üzerinden aşağıdaki bağımlılıkları ekleyebilirsiniz:

  • net.i2p:i2p:2.7.0
  • net.i2p.client:streaming:2.7.0

Ağ iletişimi için, I2P ağ soketlerinin kullanımı gerekir. Bunu göstermek için, bir istemcinin bir sunucuya metin iletileri gönderebileceği, iletileri yazdıracak ve istemciye geri gönderecek bir uygulama oluşturacağız. Başka bir deyişle, sunucu bir yankı işlevi görecek.

Sunucu uygulamasını başlatarak başlayacağız. Bu, bir I2PSocketManager almayı ve bir I2PServerSocket oluşturmayı gerektirir. I2PSocketManagerFactory üzerine var olan bir hedef için kaydedilmiş anahtarları sağlamayacağız, bu nedenle bizim için yeni bir hedef oluşturacak. Oluşturulan hedefi bulabilmemiz için I2PSocketManager üzerinden bir I2PSession isteyeceğiz. Daha sonra istemcinin bizimle bağlantı kurabilmesi için bu bilgileri kopyalayıp yapıştırmamız gerekecek.

package i2p.echoserver;

import net.i2p.client.I2PSession;
import net.i2p.client.streaming.I2PServerSocket;
import net.i2p.client.streaming.I2PSocketManager;
import net.i2p.client.streaming.I2PSocketManagerFactory;

public class Main {

    public static void main(String[] args) {
        //Initialize application
        I2PSocketManager manager = I2PSocketManagerFactory.createManager();
        I2PServerSocket serverSocket = manager.getServerSocket();
        I2PSession session = manager.getSession();
        //Print the base64 string, the regular string would look like garbage.
        System.out.println(session.getMyDestination().toBase64());
        //The additional main method code comes here...
    }

}

1. kod örneği: Sunucu uygulamasını başlatma.

Bir I2PServerSocket elde ettiğimizde, istemcilerden geliş bağlantılarını kabul etmek için I2PSocket kopyaları oluşturabiliriz. Bu örnekte, aynı anda yalnızca bir istemciyi işleyebilen tek bir I2PSocket kopyası oluşturacağız. Gerçek bir sunucunun birden fazla istemciyi idare edebilmesi gerekir. Bunu yapmak için, her biri ayrı bir işlem olarak çalışan birden çok I2PSocket kopyasının oluşturulması gerekir. I2PSocket kopyasını oluşturduktan sonra verileri okur, yazdırır ve istemciye geri göndeririz. Eklediğimiz yeni kod kalın yazılmıştır.

package i2p.echoserver;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.SocketTimeoutException;
import net.i2p.I2PException;
import net.i2p.client.streaming.I2PSocket;
import net.i2p.util.I2PThread;

import net.i2p.client.I2PSession;
import net.i2p.client.streaming.I2PServerSocket;
import net.i2p.client.streaming.I2PSocketManager;
import net.i2p.client.streaming.I2PSocketManagerFactory;

public class Main {

    public static void main(String[] args) {
        I2PSocketManager manager = I2PSocketManagerFactory.createManager();
        I2PServerSocket serverSocket = manager.getServerSocket();
        I2PSession session = manager.getSession();
        //Print the base64 string, the regular string would look like garbage.
        System.out.println(session.getMyDestination().toBase64());

        //Create socket to handle clients
        I2PThread t = new I2PThread(new ClientHandler(serverSocket));
        t.setName("clienthandler1");
        t.setDaemon(false);
        t.start();
    }

    private static class ClientHandler implements Runnable {

        public ClientHandler(I2PServerSocket socket) {
            this.socket = socket;
        }

        public void run() {
            while(true) {
                try {
                    I2PSocket sock = this.socket.accept();
                    if(sock != null) {
                        //Receive from clients
                        BufferedReader br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
                        //Send to clients
                        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));
                        String line = br.readLine();
                        if(line != null) {
                            System.out.println("Received from client: " + line);
                            bw.write(line);
                            bw.flush(); //Flush to make sure everything got sent
                        }
                        sock.close();
                    }
                } catch (I2PException ex) {
                    System.out.println("General I2P exception!");
                } catch (ConnectException ex) {
                    System.out.println("Error connecting!");
                } catch (SocketTimeoutException ex) {
                    System.out.println("Timeout!");
                } catch (IOException ex) {
                    System.out.println("General read/write-exception!");
                }
            }
        }

        private I2PServerSocket socket;

    }

}

2. kod örneği: İstemcilerden gelen bağlantıları kabul etme ve iletileri işleme.

Yukarıdaki sunucu kodunu çalıştırdığınızda, bunun gibi bir şey yazdırmalıdır (ancak satır sonları olmadan, yalnızca büyük bir karakter bloğu olmalıdır):

    y17s~L3H9q5xuIyyynyWahAuj6Jeg5VC~Klu9YPquQvD4vlgzmxn4yy~5Z0zVvKJiS2Lk
    poPIcB3r9EbFYkz1mzzE3RYY~XFyPTaFQY8omDv49nltI2VCQ5cx7gAt~y4LdWqkyk3au
    6HdfYSLr45zxzWRGZnTXQay9HPuYcHysZHJP1lY28QsPz36DHr6IZ0vwMENQsnQ5rhq20
    jkB3iheYJeuO7MpL~1xrjgKzteirkCNHvXN8PjxNmxe-pj3QgOiow-R9rEYKyPAyGd2pe
    qMD-J12CGfB6MlnmH5qPHGdZ13bUuebHiyZ1jqSprWL-SVIPcynAxD2Uu85ynxnx31Fth
    nxFMk07vvggBrLM2Sw82pxNjKDbtO8reawe3cyksIXBBkuobOZdyOxp3NT~x6aLOxwkEq
    BOF6kbxV7NPRPnivbNekd1E1GUq08ltDPVMO1pKJuGMsFyZC4Q~osZ8nI59ryouXgn97Q
    5ZDEO8-Iazx50~yUQTRgLMOTC5hqnAAAA
    
Bu, sunucu hedefinin base64 gösterimidir. İstemci, sunucuya ulaşmak için bu dizgeye gerek duyacaktır.

Şimdi istemci uygulamasını oluşturacağız. Yine, başlatma için birkaç adım gereklidir. Yine, bir I2PSocketManager alarak başlamamız gerekecek. Bu sefer bir I2PSession ve bir I2PServerSocket kullanmayacağız. Bunun yerine, bağlantımızı başlatmak için sunucu hedef dizgesini kullanacağız. Kullanıcıdan hedef dizgesini isteyeceğiz ve bu dizgeyi kullanarak bir I2PSocket oluşturacağız. Bir I2PSocket elde ettiğimizde, sunucuya veri göndermeye ve sunucudan veri almaya başlayabiliriz.

package i2p.echoclient;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InterruptedIOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ConnectException;
import java.net.NoRouteToHostException;
import net.i2p.I2PException;
import net.i2p.client.streaming.I2PSocket;
import net.i2p.client.streaming.I2PSocketManager;
import net.i2p.client.streaming.I2PSocketManagerFactory;
import net.i2p.data.DataFormatException;
import net.i2p.data.Destination;

public class Main {

    public static void main(String[] args) {
        I2PSocketManager manager = I2PSocketManagerFactory.createManager();
        System.out.println("Please enter a Destination:");
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String destinationString;
        try {
            destinationString = br.readLine();
        } catch (IOException ex) {
            System.out.println("Failed to get a Destination string.");
            return;
        }
        Destination destination;
        try {
            destination = new Destination(destinationString);
        } catch (DataFormatException ex) {
            System.out.println("Destination string incorrectly formatted.");
            return;
        }
        I2PSocket socket;
        try {
            socket = manager.connect(destination);
        } catch (I2PException ex) {
            System.out.println("General I2P exception occurred!");
            return;
        } catch (ConnectException ex) {
            System.out.println("Failed to connect!");
            return;
        } catch (NoRouteToHostException ex) {
            System.out.println("Couldn't find host!");
            return;
        } catch (InterruptedIOException ex) {
            System.out.println("Sending/receiving was interrupted!");
            return;
        }
        try {
            //Write to server
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            bw.write("Hello I2P!\n");
            //Flush to make sure everything got sent
            bw.flush();
            //Read from server
            BufferedReader br2 = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String s = null;
            while ((s = br2.readLine()) != null) {
                System.out.println("Received from server: " + s);
            }
            socket.close();
        } catch (IOException ex) {
            System.out.println("Error occurred while sending/receiving!");
        }
    }

}

3. kod örneği: İstemciyi başlatma ve sunucu uygulaması ile bağlantı kurma.

Son olarak, hem sunucuyu hem de istemci uygulamasını çalıştırabilirsiniz. İlk olarak, sunucu uygulamasını başlatın. Bir hedef dizgesi yazdıracaktır (yukarıda gösterildiği gibi). Ardından, istemci uygulamasını başlatın. Bir hedef dizgesi istediğinde, sunucu tarafından yazdırılan dizgeyi yazabilirsiniz. Ardından istemci sunucuya 'Hello I2P!' (yeni bir satırla birlikte) iletisini gönderecek ve sunucuda yazdırılan ileti istemciye geri gönderilecek.

Tebrikler, I2P üzerinden iletişim kurmuş oldunuz!

Uygulamalardan çıkmak

Katkıda bulunmak isterseniz bizimle görüşün.

See also all the plugins on plugins.i2p, the applications and source code listed on echelon.i2p, and the application code hosted on git.repo.i2p.

See also the bundled applications in the I2P distribution - SusiMail and I2PSnark.

Uygulama fikirleri

  • NNTP sunucusu: Geçmişte bazıları vardı, şu anda yok
  • Jabber sunucusu: Geçmişte bazıları vardı ve şu anda herkese açık İnternete erişimi olan bir tane var
  • PGP anahtar sunucusu ve/veya vekil sunucu
  • İçerik dağıtımı / "Dağıtılmış karma tablosu" (DHT) uygulamaları: Akış alanını diriltme, bağlantı noktası dijjer, alternatif arama
  • Syndie geliştirmesine yardım edin
  • İnternet tabanlı uygulamalar - bloglar, yapıştırma kutuları, depolama, izleme, akış gibi site sunucusu tabanlı uygulamaları barındırmanın sınırı yoktur. Perl, PHP, Python veya Ruby gibi herhangi bir internet veya CGI teknolojisinin çalışması beklenir.
  • Daha önce i2p kaynak paketinde bulunan bazı eski uygulamaları yeniden canlandırın - bogobot, pantol, proxyscript, q, stasher, çorap proxy, i2ping, feedspace