Advanced
Java
Services
|
Sockets |
Einfache Server/Client Beispiele realisiert mit Sockets
Die folgenden Beispiele zeigen einfache Clients und Server. Es werden Daten vom Client zum Server geschickt.
Der Server nimmt sie entgegen, schickt aber selbst keine Daten.
SimpleServerDemo1
/*
der server wird immer zuerst gestartet und wartet auf den client
diese server kann genau eine anfrage abfertigen
er gibt die daten, die er vom client erhält auf die konsole aus
sein inputstream erhält vom client ein EOF
d.h. der client beendet die verbindung
arbeitet zusammen mit SimpleClientDemo1
*/
import java.io.*;
import java.net.*;
import java.util.*;
public class SimpleServerDemo1
{
public static void main(String[] args)
{
try
{
int port = 888;
ServerSocket serverSocket = new ServerSocket(port);
Socket clientSocket;
System.out.println("server gestartet");
System.out.println("warte auf anfrage");
clientSocket = serverSocket.accept();
// accept blockiert bis ein client eine TCP/IP-verbindung aufgebaut hat.
InputStream is = clientSocket.getInputStream();
System.out.println("inputstream opened");
//OutputStream os = client.getOutputStream();
//System.out.println("outputstream opened");
int ch;
// der server wartet bis der client die verbindung abbricht
// die verbindung wird abgebrochen wenn der client EOF schickt
System.out.println("erhalte die folgenden daten") ;
System.out.println("--------------- begin ---------------") ;
while( (ch=is.read())!=-1 )
{
System.out.print( (char)ch) ;
}
System.out.println() ;
System.out.println("---------------- end ----------------") ;
System.out.println("verbindung durch client beendet");
is.close();
clientSocket.close();
}
catch(IOException ex)
{
System.out.println("Fehler "+ex);
}
}
}
/*
dieser clientschickt genau einmal daten an den server
der client schließt den outputstream und sendet damit
ein EOF an den server und setzt damit die verbindung zurück
ein clientSocket.close() schließt beide streams und sendet damit
speziell auch ein EOF über den outputstream. das sieht man,
indem man out.close() durch clientSocket.close() ersetzt.
nach clientSocket.close() kann man das socket nicht mehr verwenden
arbeitet zusammen mit SimpleServerDemo1 oder SimpleServerDemo3
*/
import java.io.*;
import java.net.*;
import java.util.*;
public class SimpleClientDemo1
{
public static void main(String[] args)
{
try
{
int port = 888;
String host = "127.0.0.1";
Socket clientSocket = new Socket(host, port);
System.out.println("verbindung aufgebaut host = " + host + " port = " + port);
OutputStream out = clientSocket.getOutputStream();
System.out.println("outputstream opened");
String data = "hello localhost";
out.write( data.getBytes() );
out.close(); // sendet EOF
System.out.println("daten gesendet und stream geschlossen");
}
catch(IOException ex)
{
System.out.println("Fehler "+ex);
}
}
}
/*
dieser server kann genau eine anfrage abfertigen
er gibt die daten, die er vom client erhält auf die konsole aus
der inputstream des server erhält kein EOF, denn das würde
bedeuten, daß der client die verbindung beendet. der server kann
also nicht einfach bis EOF einlesen.
stattdessen wird die methode available() verwendet.
zunächst wird mit
while( in.available() == 0 ) ;
gewartet bis daten anliegen. auch der aufbau einer lokalen TCP/IP
verbindung dauert einige zeit. das warten ist also notwendig.
der server liest dann die daten ein und sendet über den
outputstream ein EOF an den client und beendet damit die verbindung.
arbeitet zusammen mit SimpleClientDemo2
*/
import java.io.*;
import java.net.*;
import java.util.*;
public class SimpleServerDemo2
{
public static void main(String[] args)
{
try
{
int port = 888;
ServerSocket serverSocket = new ServerSocket(port);
Socket clientSocket;
System.out.println("server gestartet");
System.out.println("warte auf anfrage");
clientSocket = serverSocket.accept();
// accept blockiert bis ein client eine TCP/IP-verbindung aufgebaut hat.
InputStream in = clientSocket.getInputStream();
System.out.println("inputstream opened");
OutputStream out = clientSocket.getOutputStream();
System.out.println("outputstream opened");
// warten bis daten anliegen !
while( in.available() == 0 ) ;
System.out.println("es liegen " + in.available() + " bytes an") ;
System.out.println("erhalte die folgenden daten") ;
System.out.println("--------------- begin ---------------") ;
for( int ch=0; in.available() > 0; )
{
ch = in.read();
System.out.print( (char)ch) ;
}
System.out.println() ;
System.out.println("---------------- end ----------------") ;
System.out.println("verbindung wird beendet");
out.close();
//clientSocket.close();
}
catch(IOException ex)
{
System.out.println("Fehler "+ex);
}
}
}
/*
diese client schickt einmal daten an den server
der server beendet nach erhalt der daten die verbindung
arbeitet zusammen mit SimpleServerDemo2 oder SimpleServerDemo4
*/
import java.io.*;
import java.net.*;
import java.util.*;
public class SimpleClientDemo2
{
public static void main(String[] args)
{
try
{
int port = 888;
String host = "127.0.0.1";
Socket clientSocket = new Socket(host, port);
System.out.println("verbindung aufgebaut host = " + host + " port = " + port);
OutputStream out = clientSocket.getOutputStream();
System.out.println("outputstream opened");
InputStream in = clientSocket.getInputStream();
System.out.println("inputstream opened");
String data = "hello localhost";
out.write( data.getBytes() );
out.flush();
System.out.println("daten gesendet");
int ch = in.read(); // server schickt keine daten, nur EOF
if (ch == -1)
System.out.println("server hat verbindung beendet");
}
catch(IOException ex)
{
System.out.println("Fehler "+ex);
}
}
}
/*
der server wird immer zuerst gestartet und wartet auf den client
dieser server kann mehrere anfragen abfertigen
er gibt die daten, die er vom client erhält auf die konsole aus
sein inputstream erhält vom client ein EOF
d.h. der client beendet die verbindung
nach dem beenden der verbindung wartet der server mit serverSocket.accept()
auf einen neuen client und legt dann ein neues clientSocketobjekt an
arbeitet zusammen mit SimpleClientDemo1
*/
import java.io.*;
import java.net.*;
import java.util.*;
public class SimpleServerDemo3
{
public static void main(String[] args)
{
try
{
int port = 888;
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("server gestartet");
Socket clientSocket;
for(;;)
{
try
{
System.out.println("warte auf anfrage");
clientSocket = serverSocket.accept();
// accept blockiert bis ein client eine TCP/IP-verbindung aufgebaut hat.
InputStream is = clientSocket.getInputStream();
System.out.println("inputstream opened");
//OutputStream os = client.getOutputStream();
//System.out.println("outputstream opened");
int ch;
// der server wartet bis der client die verbindung abbricht
// die verbindung wird abgebrochen wenn der client EOF schickt
System.out.println("erhalte die folgenden daten") ;
System.out.println("--------------- begin ---------------") ;
while( (ch=is.read())!=-1 )
{
System.out.print( (char)ch) ;
}
System.out.println() ;
System.out.println("---------------- end ----------------") ;
System.out.println("verbindung durch client beendet");
is.close();
clientSocket.close();
}
catch(IOException ex)
{
System.out.println("Fehler "+ex);
}
} // end for
}
catch(IOException ex)
{
System.out.println("Fehler "+ex);
}
} // end main
}
/*
diese server kann mehrer anfragen abfertigen
er gibt die daten, die er vom client erhält auf die konsole aus
der inputstream des server erhält kein EOF, denn das würde
bedeuten, daß der client die verbindung beendet. der server kann
also nicht einfach bis EOF einlesen.
stattdessen wird die methode available() verwendet.
zunächst wird mit
while( in.available() == 0 ) ;
gewartet bis daten anliegen. auch der aufbau einer lokalen TCP/IP
verbindung dauert einige zeit. das warten ist also notwendig.
der server liest dann die daten ein und sendet über den
outputstream ein EOF an den client und beendet damit die verbindung.
arbeitet zusammen mit SimpleClientDemo2
*/
import java.io.*;
import java.net.*;
import java.util.*;
public class SimpleServerDemo4
{
public static void main(String[] args)
{
try
{
int port = 888;
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("server gestartet");
Socket clientSocket;
for(;;)
{
try
{
System.out.println("warte auf anfrage");
clientSocket = serverSocket.accept();
// accept blockiert bis ein client eine TCP/IP-verbindung aufgebaut hat.
InputStream in = clientSocket.getInputStream();
System.out.println("inputstream opened");
OutputStream out = clientSocket.getOutputStream();
System.out.println("outputstream opened");
// warten bis daten anliegen !
while( in.available() == 0 ) ;
System.out.println("es liegen " + in.available() + " bytes an") ;
System.out.println("erhalte die folgenden daten") ;
System.out.println("--------------- begin ---------------") ;
for( int ch=0; in.available() > 0; )
{
ch = in.read();
System.out.print( (char)ch) ;
}
System.out.println() ;
System.out.println("---------------- end ----------------") ;
//in.close();
System.out.println("verbindung wird beendet");
out.close();
//clientSocket.close();
}
catch(IOException ex)
{
System.out.println("Fehler "+ex);
}
} // end for
}
catch(IOException ex)
{
System.out.println("Fehler "+ex);
}
} // end main
}