Socketprogrammierung

Bigbutcher

Erfahrenes Mitglied
Moin Moin,

ich hab folgende Probleme

a) bin ich ein Java Anfänger

b) muss ich ein Client Server Programm schreiben, dass nur kommuniziert, spricht nur ein "Hallo Server, ich bin bei dir" bzw "Hallo Client, du bist auf mir drauf" ausgibt.

Soweit die Theorie.
Grundlage für mein Programm soll ein Beispielcode sein, dass ich im Buch "Java als erste Programmiersprache" von Joachim Goll gefunden habe.

Das TCPServer Programm läuft ganz gut, glaub ich zumindest, jedoch kommt beim TCPClient immer:
"Rechnername unbekannt:
client"
Die richtige Ausgabe müsste lauten:
"Verbunden mit Rechner: xxx Port: xxxx
name empfangen: Hallo Server"
bzw
"Verbunden mit Rechner: xxx"
Kann mir jemand bitte helfen und mir ein paar Ratschläge/Korrekturvorschläge mitteilen?








Hier der Code: TCPClient.java
----------------------------------------------------------------------------------------------------------------
package tcpclient;
import java.net.*;
import java.io.*;
public class TCPClient {
static String hostname = "client";
static int port = 10001;
public static void main (String[] args)
{
try
{
Socket socket = new Socket (hostname, port);
socket.getOutputStream().write("Hallo Server".getBytes());
socket.close();
}
catch (UnknownHostException e)
{
System.out.println("Rechnername unbekannt:\n" +e.getMessage());
}
catch (IOException e)
{
System.out.println("Fehler während der Kommunikation:\n" +e.getMessage());
}
}
}










TCPServer.java
----------------------------------------------------------------------------------------------------------------
package tcpserver;
import java.net.*;
import java.io.*;
public class TCPServer {
static int port = 10001;
public static void main (String[] args)
{
try {
ServerSocket socket = new ServerSocket (port);
Socket client = socket.accept ();
System.out.println("Verbunden mit: " +client.getInetAddress() .getHostName() +" Port: " +client.getPort());
byte[] b = new byte[128];
InputStream stream = client.getInputStream();
int size = 0;
while (size == 0)
{
size = stream.available();
}
stream.read(b);
String message = new String (b, 0, size);
System.out.println("Nachricht empfangen: " +message);
client.close();
socket.close();
}
catch (UnknownHostException e)
{
System.out.println("Rechnername unbekannt:\n" +e.getMessage());
}
catch (IOException e)
{
System.out.println("Fehler während der Kommunikation:\n" +e.getMessage());
}
}
}










edit:
----------------------------------------------------------------------------------------------------------------
Das habe ich ja noch vergessen, da ist bei mir noch eine Verständnisfrage hinzugekommen. Wie verbindet sich der Client hier mit dem Programm?
Man gibt ja nirgends eine IP Adresse ein.
 
Zuletzt bearbeitet:
static String hostname = "client";

das ist die gesuchte stelle oder? "client" ist sicher kein gültiger Rechnername in deinem Netzwerk, von daher.. stell da mal was anderes ein. z.B. "127.0.0.1"




Ansonsten noch 2 tips zur socket programmierung...
... Es ist leichter textbasiert zu arbeiten wenn du einen BufferedIReader und einen PrintWriter auf den Socket aufsetzt ;-)

beispiel:
Code:
Socket Sock = new Socket("localhost", "80");
PrintWriter out = new PrintWriter(Sock.getOutputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(Sock.getInputStream()));

nun kannst du nämlich einfach, zeilen lesen und schreiben
mit
in.readLine()
beispielsweise kannst du eine zeile rein lesen
mit
out.println(String)
schreibst du eine...


Und als 2....
Bei Serverprogrammierung tut man gut daran mehrere Clients zu verarbeiten, ein einziger, das bringts meist net wirklich...

dazu hatt man eine kleine schleife die einen thread startet, und den socket daran übergibt...
Man tut allerdings gut daran die threadobjekte z.B. in einem Vector zu speichern, einerseits wegen der GC, anderersets wenn ein client mit dem anderen kommunizieren muss, geht das sonst nur schwer.
 
chibisuke hat gesagt.:
static String hostname = "client";

das ist die gesuchte stelle oder? "client" ist sicher kein gültiger Rechnername in deinem Netzwerk, von daher.. stell da mal was anderes ein. z.B. "127.0.0.1"

THx das war mein Fehler und zugleich meine Verständnisfrage.
Mit der Threadprogrammierung wollte ich mich auch noch auseinandersetzen, bin bislang aber nicht dazu gekommen und dein Quellcodevorschlag werd ich auch gleich einarbeiten :)

Nocheinmal ein großes Danke

MfG

BB
 

Neue Beiträge

Zurück