Anfänge in der Netzprogrammierung

Status
Nicht offen für weitere Antworten.
I

ich²

Gast
Hallo Forum (mal wieder ;) ),

ich habe mich mittlerweile dazu durchgerungen mich mit Netzwerkprogrammierung auseinander zusetzen. Da ich nicht viel Ahnung von Netzwerken habe und wie das so alles grundlegend funktioniert, hab ich mir gedacht, dass ich mich anhand des Netzwerkkapitels von "Java ist auch nur eine Insel" ein wenig einarbeite.

Weil ich mich vornehmlich zwischen für die Kommunikation zwischen n PCs im Lokalen Netz und/oder über das Internet interessiere bin ich auf folgenden Code-Schnippsel in besagtem Kapitel gestoßen:

Code:
import java.net.*;
import java.io.*;

class MulClient
{
  public static void main( String[] args )
  {
    Socket server = null;
    try
    {
      server = new Socket( "localhost" , 3141 );
      InputStream in = server.getInputStream();
      OutputStream out = server.getOutputStream();
      out.write( 4 );
      out.write( 9 );
      int result = in.read();
      System.out.println( result );
    }
    catch ( UnknownHostException e ) {
      e.printStackTrace();
    }
    catch ( IOException e ) {
      e.printStackTrace();
    }
    finally
    {
      if ( server != null )
        try { server.close(); } catch ( IOException e ) { e.printStackTrace(); }
    }
  }
}

Dieser löst bei mir aber folgende Exception aus:

ConnectException hat gesagt.:
java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:507)
at java.net.Socket.connect(Socket.java:457)
at java.net.Socket.<init>(Socket.java:365)
at java.net.Socket.<init>(Socket.java:178)
at MulClient.main(MulClient.java:11)

da wie gesagt Netzwerkprogrammierung für mich ein komplett neues Thema ist habe ich keine Ahnung woran das liegen kann. Für Tipps, was die Ursache sein könnte bin ich dankbar!

mfg

ich²
 

bazz-dee

Aktives Mitglied
du versuchst auf port 3141 auf dem localhost zu verbinden, da dort aber kein server auf verbindungen wartet bekommst du "connection refused"
 

langnase

Neues Mitglied
Hi,

dein Prog will sich auf deinem Rechner mit einem Server verbinden der auf Port 3141 lauscht. Läuft der Server denn überhaupt?? sprich hast du Ihn gestartet??

Gruß
Dirk
 
I

ich²

Gast
Hallo und danke für die Antworten!

Muss ich das denn? Im oben genannten Buch ist es als Beispielcode aufgeführt, deswegen bin ich davon ausgegangen, dass es dann auch so funktioniert :? .

Was muss ich dann machen, dass es funktioniert?

Ich habe in der Zwischenzeit mal versucht ob es funktioniert wenn ich einen ServerSocket vorher erstellen. Also einfach im Code ein

Code:
ServerSocket serversocket = new ServerSocket(3141);

eingefügt. Das hat soweit dann auch funktioniert, nur beim Lesen (also bei in.read()) hat er dann einfach gar nichts mehr gemacht (auch keine Exception o. ä. geworfen).

Ich weiß, dass ist eigentlich Kindergarten, aber als kompletter Netzwerk-Newbie stellt mich das vor einen rießigen Problem :oops: .

Vielen Dank im Voraus!

mfg

ich²
 

byte

Top Contributor
Generell läuft das so ab:

1. ServerSocket erzeugen
2. ServerSocket horcht, ob eine Verbindung reinkommt
3. ServerSocket nimmt ankommende Verbindung mit ServerSocket.accept() an (liefert ein Socket Objekt)
4. Server kann über dieses Socket mit dem Client kommunizieren

Du musst also etwa folgendes programmieren:

Client:
- Socket an irgendeinem Port

Server:
- ServerSocket an dem selben Port
- horcht, ob Verbindung reinkommt und erzeugt ggf. Socket für diese Verbindung mit serverSocket.accept()

Der Datenaustausch findet dann über entsprechenden Streams zwischen diesen beiden Sockets statt. Der ServerSocket horcht weiterhin nur auf weitere Verbindungen. Daher ist es sinnvoll, für jede Verbindung einen eigenen Thread zu öffnen beim Server, denn sonst kannst Du nur eine Verbindung gleichzeitig offen haben.
 
I

ich²

Gast
Falls ich das jetzt richtig verstanden habe müsste das hier ja theoretisch funktionieren:

Code:
import java.net.*;
import java.io.*;

public class Communicate {
	
	public static void main(String[] args) throws Exception {
		
		ServerSocket server = new ServerSocket(7);
		Socket client = new Socket("localhost", 7);
		client = server.accept();
		InputStream in = client.getInputStream();
		OutputStream out = client.getOutputStream();
		out.write(2);
		System.out.println(in.read());
	}
}

Ich hab nen ServerSocket erzeugt, nen Socket am selben port, gesagt, dass der server die Verbingung akzeptieren soll, mit nem OutputStream die 2 geschrieben und dann wieder versucht mit dem InputStream die Zahl auszugeben. Aber er hängt sich immernoch beim Ausgeben auf. Scheinbar muss ich was wichtiges vergessen haben.

Langsam glaub ich, ich sollte es gleich lassen, wenn ich schon an solch elementaren Sachen kläglich scheitere ... :oops: :cry:
 

Leroy42

Top Contributor
ich² hat gesagt.:
Langsam glaub ich, ich sollte es gleich lassen, wenn ich schon an solch elementaren Sachen kläglich scheitere ... :oops: :cry:

Blödsinn! Du solltest dich in das eigenständige Gebiet der Netzwerkprogrammierung einfach anhand
eines einfachen, gut erklärten, lauffähigen Beispiels eines Tutorials einarbeiten, anstatt dich da ganz alleine
in der Art von trial-and-error heranzurobben.

Ausgehend von diesem Beispiel kannst du dann selbst kleine Änderungen vornehmen. Zum Beispiel
ein server der gleichzeitige mehrere clients bedient, ...der Anfragen der einzelnen clients speichert, ...der alle
clients über die Anfrage jedes einzelnen clients informiert, ...und bevor du es überhaupt
bemerkst, hast du bereits einen kleinen Chat-Server entwickelt :cool:
 
I

ich²

Gast
Hallo Leroy42,

danke, dass du mir ein wenig Mut gemacht hast ;).

Du wirst lachen, aber genau so wollte ich mich einarbeiten. Anhand eines kleinen fertigen Programm (wie gesagt, z. B. nur eine Message von einem PC an einen anderen schicken) mir Schritt für Schritt das wesentliche aneigne. Nur dazu müsste ich erstmal ein funktionierendes Beispiel-Programm dass sowas macht finden. Es soll ja auch nicht zuviel können wie z. B. das KnockKnock Programm aus den Java Tutorial, da wäre ich dann ein wenig mit überforert ;).

Sry, dass ich jetzt ein wenig schlampig schreibe, muss jetzt aber gleich in einen Termin ;).

mfg

ich²
 
I

ich²

Gast
Guten Abend,

ich muss nochmal stören :lol: . Hab das jetzt nochmal zuhause getestet (da hab ich wenigstens komplette Admin-Rechte ;) ).

Mittlerweile denke ich, dass es nicht an meinem Code sondern an etwas anderem liegt, dass es nicht funktionert, da selbst Code-Schnippsel von z. B. java.sun.com nicht funktionieren und genau gleich beim Lesen einfrieren. Was gibts da noch zu beachten? Software-Firewall steht auf "Allow All", am Router sind die entsprechenden Ports freigegeben, Windows-Firewall nutze ich nicht. Netzwerkverbindung steht (LoopBack funktioniert).

Danke für eure Antworten und noch einen schönen Abend!

mfg

ich²
 
I

ich²

Gast
Guten Morgen!

RicoSoft hat gesagt.:
[/quote]

Danke, aber der Link funktioniert nicht :x .

Macht aber nichts, Hobbit_im_Blutrausch hat mir die Links gestern schon weitergegeben. An dieser Stelle nochmal ein ganz herzliches "Danke" von meiner Seite. Ich werde es heute bei Zeit gleich mal ausprobieren.

@Rest, die anderen Fragen stehen natürlich immernoch im Raum ...

mfg

ich²
 

byte

Top Contributor
ich² hat gesagt.:
Code:
import java.net.*;
import java.io.*;

public class Communicate {
	
	public static void main(String[] args) throws Exception {
		
		ServerSocket server = new ServerSocket(7);
		Socket client = new Socket("localhost", 7);
		client = server.accept();
		InputStream in = client.getInputStream();
		OutputStream out = client.getOutputStream();
		out.write(2);
		System.out.println(in.read());
	}
}

Anscheinend habe ich mich oben nicht ganz klar ausgedrückt. Der Server muss sich ein eigenes Socket über die accept() holen. Die Kommunikation findet dann zwischen Socket (Client) und Socket (Server) statt. Du musst auch bei den Ports aufpassen, dass Du einen nimmst, der nicht belegt ist. Und IIRC brauchst Du für Ports < 1000 (??) Root-Rechte. Also:

Code:
ServerSocket serverSocket = new ServerSocket(9999);
Socket server = serverSocket.accept();
Socket client = new Socket(9999);
...
 
I

ich²

Gast
Hallo Byto,

doch du hast dich schon klar ausgedrückt, nur ich war mal wieder ein wenig blind. :oops:

Habs jetzt nochmal so ausprobiert wie du geschrieben hast. Ich muss den server vorher einen Socket zuweisen, bevor ich ihn accepten kann (kA warum, evtl. kannst du mir das erklären) und der Client benötigt noch einen Host o. ä. damit ich ihn erstellen kann ;). Aber ansonsten hat alles geklappt, bis auf eine Tatsache: Es funktioniert immer noch net :x .

Lange Rede kurzer Sinn: kannst du (oder jemand anderes) mir ein funktionsfähiges Beispiel posten? Ist glaub ich gescheider als wenn ich hier noch ewig was rumfuhrwerk und euch mit meiner Inkompetenz auf die Nerven gehe ... :? !? Muss ja nichts großes sein, einfach nur ein Beispiel das einen Text durchs Netz schickt und dann wieder angezeigt wird. Eben sowas wie ich hier die ganze Zeit versuche ... :autsch: . Das wäre super :toll:

Vielen Dank

mfg

ich²
 
I

ich²

Gast
Hallo nochmal,

Thread kann als erledigt abgehackt werden, hab einen funktionierenden Beispiel-Code durch die Foren-Suche gefunden ...

Thx an alle!

mfg

ich²
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben