Sockets: ein alter Hut - für Euch - für mich nicht!

Status
Nicht offen für weitere Antworten.

data89

Bekanntes Mitglied
Hallo,

ich möchte mich in die Netzwetzwerkkommunikation mittels Sockets in Java einarbeiten. Grundlagen habe ich mir schon in diversen Tutorialen angeeignet.

Nun möchte ich zwei "Programme" habe: Client und Server. Beide sollen miteinander Kommunizieren können! Ein Beispiel für einen Server (mit Threads) habe ich hier im Forum gefunden!

Nun muss ich noch den Clienten hinbekommen! Dieser sollte auch in einem Thread laufen und Nachrichten entgegennehmen und versenden können (an den Server)!

Bis hier hin kein Problem. Ich habe auch schon einen einfachen Clienten geschrieben, der sich nach einer gesendeten Nachricht beendet (s.u.).
Doch nun hab ich keine Ahnung! Ich weiß nicht wie ich weitermachen soll ...

Könnt Ihr mir weiterhelfen?
data89

=====================================
Tserver:
Code:
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;


public class Tserver {

	public static void main(String[] args) {
		try {
			System.out.println( "[Server]~> Server gestartet!" );
			// Server aufbauen
			ServerSocket server = new ServerSocket(1234);
			Socket s;
			while(true) {
			// Auf verbindung warten
			s = server.accept();
			// kommunikation an einen nebenläufigen Thread abgeben
			ServerThread t = new ServerThread(s);
			t.start();
			// und wieder auf neue Verbindungen warten
			}
		} catch( IOException e ) {
			System.out.println( "[Server]~> " + e.toString() );
		}
	}
	
}

ServerThread:
Code:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;


public class ServerThread extends Thread {
private Socket s;
public ServerThread(Socket s) {
this.s = s;
}

public void run() {
try {
	// lesen
	BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
	String text = in.readLine();
	System.out.println( "[Server]~> " + text );
	// schreiben

	BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
	out.write(text.toUpperCase());
	out.newLine();
	out.flush();

	// aufräumen
	out.close();
	in.close();
} catch( IOException e ) {
	System.out.println( "[Server]~> " + e.toString() );
}
}
}

Client:
Code:
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;


public class Client {

	public Client( Socket socket ) throws IOException {
		PrintWriter pw = new PrintWriter( socket.getOutputStream() );
		pw.print( "Hallo Welt!" );
		pw.flush();
		socket.close();
	}
	
	public static void main(String[] args) {
		try {
			Socket ss = new Socket( "127.0.0.1" , 1234 );
			Client client = new Client( ss );
		} catch( IOException e ) {
			System.out.println( "[Client]~> " + e.toString() );
		}
	}
	
}
 

Murray

Top Contributor
Was ist denn genau das Problem? Der Client muss, nachdem er seine Nachricht an der Server geschickt hat, die Antwort auslesen (-> Socket#getInputStream) . Und wenn es mehr als eine Nachricht gibt, dann sollte er den Socket nicht sofort wieder schliessen, sondern die Verbindung halten. Daher sollte weder das Senden der Nachricht, noch das Schliessen des Stream im Konstruktor erfolgen.
 

data89

Bekanntes Mitglied
Also ich bekomme es nicht hin einen Client und einen dzugehörigen Thread zu schreiben, der die entsprechenden Methoden hat :cry:
 

data89

Bekanntes Mitglied
Der Client soll Nachrichten annehmen und mit System.out... ausgeben und Nachrichten Senden können! Den Thread benutze ich, damit das Socket erhalten bleibt!
 

data89

Bekanntes Mitglied
Ich habe mal am Client angefangen, doch wenn ich ihn gestartet habe kommt immer "Connection refused"!

Client:
Code:
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;


public class Client {

	private ClientThread t;
	
	
	public Client( ) {}
	
	public void MessageToServer( ) {
		t.SendMessage( "Nachricht vom Client an den Server!" );
	}
	
	public static void main(String[] args) {
		
		try {
			System.out.println( "[Client]~> Client gestartet!" );
			
			// Client aufbauen
			Socket socket = new Socket( "127.0.0.1" , 11111 );
			Client client = new Client( );
			
			while( true ) {
			
				// Kommunikation an thread abgeben
				ClientThread t = new ClientThread( socket );
				t.start();
				
			}
		} catch( IOException e ) {
			System.out.println( "[Client]~> " + e.toString() );
		}
		
	}
	
}

ClientThread:
Code:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;


public class ClientThread extends Thread {

	private Socket s;
	
	public ClientThread( Socket socket ) {
		this.s = socket;
	}
	
	public void run() {
		
		try {

			BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
			String text = in.readLine();
			System.out.println( "[Client]~> " + text );
			
		} catch( IOException e ) {
			System.out.println( "[Client]~> " + e.toString() );
		}
		
	}
	
	public void SendMessage( String message ) {
		
	}
	
	
}

data89
 

DocRandom

Top Contributor
Moin!

Connection refused bedeutet in Deinem Fall, das Du zum falschen Port verbindest.
Du startest den Server auf Port 1234, verbindest Dich aber mit dem Clienten auf Port 11111.
Das kann nicht funktionieren.

lg
DocRandom
 

Murray

Top Contributor
data89 hat gesagt.:
Der Client soll Nachrichten annehmen und mit System.out... ausgeben und Nachrichten Senden können! Den Thread benutze ich, damit das Socket erhalten bleibt!
Wozu man da zwingend einen Thread braucht, verstehe ich noch nicht. Auf jeden Fall ist das
Code:
         while( true ) {
         
            // Kommunikation an thread abgeben
            ClientThread t = new ClientThread( socket );
            t.start();
            
         }
eher Unfug - es wird ohne Verzögerung ein Thread nach dem anderen erzeugt und gestartet. Und alle diese Threads lesen (blockierend) vom gleichen Stream, was sicher nicht gewollt ist - der Server schreibt auf den Stream die Daten doch sicher nur einmal pro Client. Und selbst wenn der Server genug Daten für alle Threads liefert, würde er das wohl nicht so schnell tun, wie der Client neue Threads erzeugen kann. Daher wird es früher oder später (eher früher) einen OutOfMemoryError geben.
 

data89

Bekanntes Mitglied
Murray hat gesagt.:
Wozu man da zwingend einen Thread braucht, verstehe ich noch nicht.

Man benötigt garkeinen Thread, um die Verbindung offen zu halten? Ja wenn das so ist! Ich hatte irgendwo gelesen, dass man einen Thread benötigt, um die Verbindung offen zu halten ...

Also mir geht es darum einfach zwei Klassen zu erstellen, mit denen ich eine Verbindung zwischen zwei Programmen realisieren kann - zunächst ein sehr trivialer Chat.

Gibt es irgendwo eine Seite wo ein ganz einfaches Beispiel gegeben wird (hab ich mit Google noch nicht gefunden)? Oder: Was muss ich zu diesem Beispiel (http://www.peuss.com/java/Sockets.php) noch hinzufügen, damit die Verbindung dauerhaft offen bleibt?

data89
 

Murray

Top Contributor
Solange der Client den Socket nicht zumacht (Socket.close), bleibt die Verbindung auch bestehen. Der Client müsste nach meinem Verständnis in einer Endlosschleife Daten aus dem Stream lesen. Das bedingt erstmal noch keine Thread. Wenn man parallel aber auch Daten schicken will, dann braucht man einen (und nicht endlos viele) zusätzlichen Thread.

Um im Hintergrund Daten von Server zu lesen, könnte die run-Methode des Thread etwa so aussehen:

Code:
public void run() {
  try {
    while ( true) {
      String data = socketReader.readLine(); //--- ein BufferedReader auf dem InputStream des Sockets
      processData( data); //--- was auch immer mit den Daten passieren soll
    }
  } catch ....
  }
}

Der Hauptthread der Anwendung kann derweil Daten (von der Konsole oder aus einer GUI) entgegennehmen und um Server schicken.
 

data89

Bekanntes Mitglied
Danke für die Antwort! :D
War genau das, was ich wissen wollte (der Rest hat sich erledigt!)!

data89 :idea:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Jannn Socket Sockets an ein anderes Gerät weiterreichen? Netzwerkprogrammierung 8
JaXnPriVate Java HTTPS Server (Secure Sockets) Netzwerkprogrammierung 15
B Socket Bilder verschicken via Sockets. Heap-Problem. Netzwerkprogrammierung 2
E Socket Parameter über Sockets übergeben und auslesen ! Netzwerkprogrammierung 5
D Socket Verwirrung bei Sockets Netzwerkprogrammierung 1
E Mehrere Sockets Netzwerkprogrammierung 2
N Fragen zu Sockets Client Netzwerkprogrammierung 3
A Sockets Serialisierung Netzwerkprogrammierung 1
K Threads closen und Sockets schliessen Netzwerkprogrammierung 5
H Sockets oder HTTP- Methoden? Netzwerkprogrammierung 3
T Socket Bidirektionale Verbindung mit Sockets Netzwerkprogrammierung 8
P Problem mit Datagram-Sockets Netzwerkprogrammierung 2
C Socket Datagram-Sockets mit integrierter Message Queue? Netzwerkprogrammierung 2
M Problem Client - Server Sockets: .ready() wird nie true! Netzwerkprogrammierung 6
F Technologiewahl: Swing/RMI/Sockets Netzwerkprogrammierung 13
B Sockets, Threads & Plugins Netzwerkprogrammierung 7
T Verbindungsversuche über TCP Sockets von mehreren Threads führt zu Serverabsturz Netzwerkprogrammierung 2
D Mehrere Clients über Java-Sockets Netzwerkprogrammierung 13
F FTP Client mit Sockets - wann sagt der Server nichts mehr? Netzwerkprogrammierung 7
U Socket Abhören eines Sockets/Ports in extra Thread Netzwerkprogrammierung 8
M Socket Sockets Grundlage Netzwerkprogrammierung 25
I Socket HTTP Nachrichten über Sockets verschicken Netzwerkprogrammierung 2
D Socket Raw Sockets mit java.net.*? Bsp ICMP Netzwerkprogrammierung 7
H Komprimierte Sockets Netzwerkprogrammierung 4
V Verbindung zweier Rechner über das Internet mit Sockets Netzwerkprogrammierung 8
L Sockets übergeben Netzwerkprogrammierung 4
G NIO Sockets Architektur Problem Netzwerkprogrammierung 2
S Problem bzgl. Sockets / Server-Client-Struktur Netzwerkprogrammierung 3
B Socket Was muss man bei Sockets beachten? Netzwerkprogrammierung 10
N Socket Sockets und Events Netzwerkprogrammierung 11
A Programm umschreiben von Pipes auf Sockets Netzwerkprogrammierung 12
B Paralleler Dateitransfer: Ein Client - Mehrere Sockets? Wie connecten? Netzwerkprogrammierung 16
D RMI oder Sockets Netzwerkprogrammierung 4
P Sockets +Port Forwarding = Chaos Netzwerkprogrammierung 4
clupus Exception beim Schließen eines Sockets Netzwerkprogrammierung 6
Q Thread und Sockets... Netzwerkprogrammierung 2
G Sockets und HTTP: Ende des Datenempfangs erkennen Netzwerkprogrammierung 3
J Array oder Object über Sockets Netzwerkprogrammierung 8
O Sockets -- Einsieg Netzwerkprogrammierung 3
S Sockets und gzip Netzwerkprogrammierung 8
B Nachricht über Sockets kommt nicht an Netzwerkprogrammierung 8
S Wiedereinmal Sockets ;-) Netzwerkprogrammierung 15
J Ascii / Unicode bei Sockets? Netzwerkprogrammierung 2
G Datagram-Sockets für UDP-Kommunikation Netzwerkprogrammierung 2
K "Ende eines Sockets" Netzwerkprogrammierung 9
A Sockets Netzwerkprogrammierung 10
feuervogel Sockets - Lokalen Port aber nicht IP bestimmen Netzwerkprogrammierung 3
C Einfacher Filedownload mit Sockets geht nicht für pdffiles Netzwerkprogrammierung 16
E Sockets, readLine() Netzwerkprogrammierung 7
M Sockets und InputStream Netzwerkprogrammierung 8
G Verbindung über Sockets Netzwerkprogrammierung 2
S zip-files über sockets übertragen Netzwerkprogrammierung 11
G immer wieder gleiche Sockets Netzwerkprogrammierung 2
V Suche Alternative zu Sockets Netzwerkprogrammierung 3
E Problem bei Sockets/InputStream über externe Klasse Netzwerkprogrammierung 5
A Datenverlust (zuviele Daten!) über Sockets Netzwerkprogrammierung 4
AlClemento Sockets -> BufferedReader Problem Netzwerkprogrammierung 2
F Problem mit Threads und Sockets Netzwerkprogrammierung 3
B Übertragung via Sockets Netzwerkprogrammierung 12
C Dateien über Sockets versenden? Netzwerkprogrammierung 10
T Sockets Verständnisfrage: abwechelnd lesen-schreiben Netzwerkprogrammierung 4
S Habe ein Problem mit Sockets -> Client Server Netzwerkprogrammierung 2
G Strings über Sockets senden Netzwerkprogrammierung 5
P Probleme mit einem Array aus Sockets Netzwerkprogrammierung 2
Y buch: Netwerprogrammierung und Sockets Netzwerkprogrammierung 2
B Eigenes Protokoll über Sockets verschicken Netzwerkprogrammierung 4
P Welche Art von Sockets für ein Spiel? Netzwerkprogrammierung 3
C Sockets über Internet Netzwerkprogrammierung 10
K Applet - Servlet Kommunikation ohne Sockets Netzwerkprogrammierung 5
S Objekte zwischen Client und Server über Sockets senden Netzwerkprogrammierung 2
Z chat: wann http und wann sockets verwenden? Netzwerkprogrammierung 11
D Java Sockets Probs Netzwerkprogrammierung 4
N Verarbeitung nach Weiterleitung in Sockets Netzwerkprogrammierung 2
A Serialisierung über Sockets möglich? Netzwerkprogrammierung 3
M sockets (security) Netzwerkprogrammierung 2
C IRC CHAT auslesen -> Sockets/input und output Streams Netzwerkprogrammierung 9
FrankenDerStein HTTP Https Server Bibliothek für Linux und Android gesucht. Netzwerkprogrammierung 7
FrankenDerStein Socket UDP Multithreading für ein Port Netzwerkprogrammierung 2
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
Tobero Java serversocket nicht nur zuganglich für localhost Netzwerkprogrammierung 6
T Brauche Hilfe beim GET-String für HttpURLConnection Netzwerkprogrammierung 4
F Server für Java Applikationen Netzwerkprogrammierung 16
B Webview für Anwendung Netzwerkprogrammierung 7
M Sicheres Login-System für App implementieren Netzwerkprogrammierung 6
J Netty umsetzung für ein Protokoll Netzwerkprogrammierung 1
J ERM für kleine Verwaltungsdatenbank Netzwerkprogrammierung 2
H Machbarkeitsfrage: TCP/IP Client (z.B. Netty) für Java Web Applcation Netzwerkprogrammierung 1
Messoras Launcher für mein Spiel Netzwerkprogrammierung 7
F Einfaches Gateway für Log-Files Netzwerkprogrammierung 1
P RMI - Neue eigene Instanz für jeden Aufruf auf nicht serialisierbares Objekt - wie? Netzwerkprogrammierung 0
P PPTP Protokoll für JAVA Netzwerkprogrammierung 14
T FTP Wie Notwendigkeit für "rekey" klientenseitig detektieren? Netzwerkprogrammierung 3
S Webserver für Jar File Netzwerkprogrammierung 4
G Socket Socket verbindung für Chat System Netzwerkprogrammierung 3
V Templates für Java Client rabbitmq Netzwerkprogrammierung 4
M Erreichbar für alle zu sein Netzwerkprogrammierung 9
M Server nur für eine Aufgabe Netzwerkprogrammierung 2
N Selbes URL Objekt für alle Requests nutzen Netzwerkprogrammierung 7
T uberspace.de als (v)root-Ersatz für kleinere Java-Anwendungen? Netzwerkprogrammierung 12
L Proxy für Dateidownload? Netzwerkprogrammierung 3

Ähnliche Java Themen

Neue Themen


Oben