D-Programmieren

Zum Inhalt

Phobos Socket-Tutorial

Anleitungen, Beispielcode und Tipps zu D. Bitte hier keine Fragen, sondern nur Anleitungen als neue Themen öffnen. Fragen gehören in das Einsteigerforum.

Phobos Socket-Tutorial

Beitragvon Prometheus am März 04, 2008, 05:30:06 PM

Dieses Tutorial stellt einen einfachen Einstieg in die Netzwerk-Programmierung mit Sockets unter D mit Phobos dar.

Bei der Socket-Programmierung unterscheidet man zwischen Client und Server. Ein Server wartet auf Anfragen und bedient oftmals mehrere Clients während ein Client eine Verbindung zu einem Server aufnimmt.

Es werden die Module std.socket und std.socketstream benötigt.

Client:
Möchte man mit D eine Verbindung zu einem Server aufbauen und kommunizieren, geht man folgendermaßen vor:

  • Socket-Objekt erstellen
  • Verbindung zu der Adresse über einen bestimmten Port aufbauen
  • Mithilfe eines Stream-Objektes Daten austauschen
  • Verbindung schließen
Um ein Socket-Objekt zu erstellen muss man zunächst sich ein Protokoll aussuchen. Das gängige Internetprotokoll ist das TCP Protokoll.
Code: Alles auswählen
Socket socket = new TcpSocket ();
//Socket socket = new UdpSocket (); für das UDP Protokoll

Die Verbindung wird über die Methode connect hergestellt. Dieser Methode wird ein InternetAddress-Objekt übergeben. Der Konstruktor von InternetAddress erwartet als ersten Parameter einen String mit der Adresse und eine Zahl mit dem Port.
Code: Alles auswählen
Socket.connect (new InternetAddress (“www.google.de”, 80));

Jetzt wurde die Verbindung hergestellt und es können Daten gesendet und empfangen werden. Dazu stehen einen die Methoden send und receive zur Verfügung. Etwas mehr Komfort bietet die Klasse SocketStream, die die üblichen Methoden wie writeLine und readLine enthält. Man übergibt dem Konstruktor einfach das Socket-Objekt.
Code: Alles auswählen
SocketStream stream = new SocketStream (socket);

Mit diesem Objekt kann man nun einfach Daten empfangen und senden. Als Beispiel wird ein HTTP-Request durchgeführt und die Antwort des Servers ausgegeben.
Code: Alles auswählen
//Daten an Google senden
stream.writeLine ("GET / HTTP/1.0");
stream.writeLine ("Host: www.google.de");
stream.writeLine ("");

char[] line;
while (!stream.eof()) //solange der Stream offen ist lesen
{
   line = stream.readLine(); //eine Zeile aus dem Stream lesen
   writefln (line);
}
   
socket.close();  //Socket schließen

Man sollte die Verbindung immer am Ende mit der Closemethode des Sockets oder vom SocketStream schließen.

So, ich hoffe das hilft jemanden. Konstruktive Kritik ist natürlich auch erwünscht.
Prometheus
Full Member
 
Beiträge: 122
Registriert: Januar 16, 2007, 07:44:40 PM
Wohnort: Dresden

Re: Phobos Socket-Tutorial

Beitragvon gamble am Februar 02, 2010, 02:20:18 AM

Hallo, kann mir jemand einen Tipp geben warum das Programm beim Kompilieren den Fehler

sockets.d(9): Error: need 'this' to access member connect

ausgibt?
Hab mich schon durch Phobos/Socket.d, Phobos/SocketStream.d gelesen,
alles Original von hier kopiert, aber immer die gleiche Meldung.
Soweit ich weiß hat "this" etwas mit der OOP zu tun, bin da allerdings noch nicht so sehr bewandert.
Würde auch gerne versuchen den Fehler selber zu entdecken, also wenn es sich vermeiden lässt nicht gleich alles verraten ;)
Ich benutze übrigens dmd2, jungfräulich, also ohne irgendwas (außer dmc) dabei.


Code: Alles auswählen
import std.stdio;
import std.socket;
import std.socketstream;

int main() {
    Socket socket = new TcpSocket();
    //Socket socket = new UdpSocket();
   
    Socket.connect(new InternetAddress ("www.google.de", 80));
    SocketStream stream = new SocketStream(socket);
   
    // Daten senden
    stream.writeLine("GET / HTTP/1.0");
    stream.writeLine("Host: www.google.de");
    stream.writeLine("");
   
    char[] line;
    while (!stream.eof()) {
        line = stream.readLine();
        writefln(line);
    }
    socket.close();
   
    return 0;
}


Mit freundlichen Grüßen
gamble
Newbie
 
Beiträge: 4
Registriert: November 29, 2009, 07:18:56 AM

Re: Phobos Socket-Tutorial

Beitragvon IcyT am Februar 02, 2010, 09:40:14 AM

Das Problem dürfte hier begraben liegen:
Code: Alles auswählen
Socket socket = new TcpSocket();
Socket.connect(new InternetAddress("www.google.de", 80));


Du rufst die connect-Methode auf der Klasse auf, du musst sie aber auf dem Objekt aufrufen, das du vorher mit new erzeugt hast, da sie nicht "static" ist. Ich nenne mal deine Variable um, dann siehst du es besser:
Code: Alles auswählen
Socket foo = new TcpSocket();
foo.connect(new InternetAddress("www.google.de", 80));


Hab dir jetzt zwar alles verraten, aber dürfte ja trotzdem verständlich sein :)
--
IRC-Chan: #D.de auf irc.freenode.net
Jabber MUC: d@conference.jabber.ccc.de
My Jabber ID: IcyT@jabber.ccc.de
My Website: http://www.icysoft.de
My Blog: http://www.icyt.de

In the beginning was the word and the word was content-type: text/plain
Benutzeravatar
IcyT
Administrator
 
Beiträge: 239
Registriert: August 24, 2007, 05:31:05 PM

Re: Phobos Socket-Tutorial

Beitragvon gamble am Februar 02, 2010, 03:18:20 PM

Faszinierend, das hatte ich auch schon probiert, gestern gings nicht, jetzt klaptts :)
Da werd ich wohl beim rumprobieren nen anderen Fehler ausgemerzt zu haben ;)

Vielen Dank für die Hilfe
gamble
Newbie
 
Beiträge: 4
Registriert: November 29, 2009, 07:18:56 AM

Re: Phobos Socket-Tutorial

Beitragvon darkdragon am Februar 08, 2010, 03:54:33 PM

Hier schwirren auch noch irgendwo ein paar OOP-Tutorials rum. Die Reihe ist zwar mangels Interesse (braucht das jemand momentan?) nie ganz fertig geworden aber vielleicht hilft dir das in Punkto OOP ein wenig.

gruß
dd
Post licensed under CC BY-NC-SA
JID: darkdragon (a.t) jabber.ccc.de
Benutzeravatar
darkdragon
Full Member
 
Beiträge: 195
Registriert: Februar 20, 2007, 04:41:20 PM


Zurück zu Hilfe für D

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron