Java Einfaches Client - Server wo ist der Fehler?

Zwickl-Pain

Lt. Junior Grade
Registriert
Dez. 2005
Beiträge
341
Hej ihr,

wahrscheinlich ist der Fehler total trivial und lächerlich... Aber ich sitz jetzt schon den ganzen Tag dran ( ist eine Praktikumsaufgabe) und die Funktionen passen auch soweit ich beurteilen kann...
Nur die eigentliche Verbindung und Kommunikation läuft nicht so wie es soll... Erhalte immer die gleichen Fehler... Hab inzwischen in meinem Server und den Server1 (Socket) alles soweit geändert das es eigentlich laufen muss... Aber irgendwie bin ich echt zu blöd... Falls jemand beim überfliegen den Fehler findet, würde ich mich freuen!

Ich mache für die Praktikumsaufgabe das erste mal was in Java, von daher ist es dreckiger Programmierstyle ;)

_____________________________________________

So nach langem Suchen stellt hatte mein Client einen **** Fehler...
Jetzt erhalte ich eine

java.net.SocketException: Unexpected end of file from server


Sobald ich die zweite Anfrage an den Server schicke... Server sieht noch so aus wie in Post 6
 
Zuletzt bearbeitet:
public BufferedReader empfang=null;
...
anfrage = empfang.readLine();

Da fehlt doch was, oder?
 
Da war mal was, aber das hab ich erstmal gelöscht bis ich überhaupt ne Verbindung hinkrieg... Bin wie gesagt ziemlicher, nein absoluter Java Noob ^^
 
PHP:
	public Server1(Socket bla)
	{
		this.clientSocket = bla;
		try {
			sender = new BufferedWriter(new OutputStreamWriter(bla.getOutputStream()));
			empfang = new BufferedReader(new InputStreamReader(bla.getInputStream()));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

Damit sollte er weiter kommen.

Aber du solltest auch mal den Anfang des mehrzeiligen Kommentars (/*) rauswerfen, der hört nämlich nicht mehr auf :) Außerdem ist ganz unten noch ein try/catch-Block außerhalb einer Methode, das ist so auch nicht erlaubt.
 
Danke =)
Jetzt muss ich mal schauen was passiert wenn ich das Debuge =) Mach nur kurz meinen Client "fertig" :-\
 
So,
jetzt hab ich folgendes Problem:
Mein Server erhält die Anfrage meines Clients (mit System.out gecheckt)
Jedoch erhält der Client keine Antwort...

Ich bin leider immernoch nicht so firm mit dem Materie, falls mir jemand weiterhelfen kann wäre ich euch dankbar.... Bin der Meinung tippse nicht funktioniert

Code:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
//import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
//import java.util.Hashtable;
//import java.util.Enumeration;
//import java.util.ArrayList;
//--------------------------------------------------------------------------------

public class TestServer
{
    public static void main(String[] args) 
    {
        try {
            ServerSocket server = new ServerSocket(8088);
            System.out.println("127.0.0.1:" + 8088+ "wartet");
            while (true)
            {
            Socket socketserver = server.accept();
            System.out.println("Client: "+socketserver.getInetAddress() +" hat sich verbunden");// Nimmt Client an
            new Thread(new Server1(socketserver)).start(); //Thread laeuft an
            }
          } catch (IOException e) 
          {
            System.err.println("IO Error in the socket class.");
            e.printStackTrace();
          } 
    }
	
}
class Server1 implements Runnable 
{
  public Socket bla;
  private BufferedReader schreiber=null;
  private BufferedWriter tippse=null;
  
  public Server1(Socket bla)
  { 	this.bla = bla;  }

  public void run() 
  {
	  OutputStreamWriter sender=null;
	  InputStreamReader empfang=null;
      try{
          sender = new OutputStreamWriter(bla.getOutputStream());
          empfang = new InputStreamReader(bla.getInputStream());
      } catch (IOException e){ e.printStackTrace();} 
         
      	 tippse=new BufferedWriter(sender);
      	 schreiber= new BufferedReader(empfang);
          try 
          {
              while(schreiber.readLine()!=null);
              {
            	  vergleiche(schreiber.readLine());
              }
          } catch (IOException e) 
          {
              e.printStackTrace();
          }
  }
 
Zuletzt bearbeitet:
Editiere mal bitte code tags in deinen Beitrag, sonst kann man das so schwer lesen.

Edit:
HTML:
[CODE]paste code here[/CODE]
Da gibts sogar einen Knopf dafür im "Erweitert"-Editor, also nicht im "Direkt antworten"-Editor.
 
Zuletzt bearbeitet:
So, hoffe nun ist es besser, danke für den Hinweis =)
Ergänzung ()

*push*

Edit:
Hat vllt. doch jemand Muse das kurz durchzulesen? Ich bin mit meinem mikrigen Javalatein am Ende...
Mein Server tut soweit das was er tun soll... Jedoch ohne zu antworten :-( Wie gesagt, ich denke das ich bei dem BufferedWriter nen Fehler hab, aber ich find ihn nicht... -.-
 
Zuletzt bearbeitet:
Werde mich heute im Laufe des Tages mal an ein ausführliches Beispiel mit Erklärung setzen. Solange bitte gedulden...
 
Also, mein Server läuft so halb, hab nen Fehler in meinem Client gefunden... Jetzt erhalte ich die Antworten von meinem Server, jedoch nach jeden Aufruf ein:

java.net.SocketException: Unexpected end of file from server

Quellcode noch so wie in Post 6. Die Funktion Vergleiche dient zum aufsplitten der HTTP - Anfrage nach get / set und ist weggelassen worden, da ich nicht denke das hier ein Fehler liegt...
 
Vielleicht kannst du hiermit etwas anfangen:

TestEnvironment.java
Code:
public class TestEnvironment {

	public static void main(String[] args) throws IOException {
		// Einen Server starten
		new Server(1234);
		
		// Einen neuen Client erzeugen und ihn zum Server verbinden lassen
		new Client("127.0.0.1", 1234);
	}
}

Server.java
Code:
public class Server extends ServerSocket {

	// ==================================================================================================
	// {[> Inner Classes
	// =================
	private class ClientManager extends Thread {

		/* Attributes */
		private Socket client;
		private BufferedReader reader;
		private BufferedWriter writer;

		/* Initializers and Constructors */
		public ClientManager(Socket client) {
			this.client = client;
			start();
		}

		/* Methods */
		private void send(String command) throws IOException {
			// Suche, wir schreiben unseren Befehl in den BufferedWriter und fügen eine Leerzeile hinzu (damit die Methode readLine() funktionieren kann!)
			// Damit wir auch sicher gehen, dass der Befehl abgeschickt wird, rufen wir die Methode flush() auf. Damit schicken wir alles, was im Buffer
			// ist los, auch, wenn dieser noch gar nicht voll ist...
			writer.write(command + "\n");
			writer.flush();
		}

		private boolean shakeHands() throws IOException {
			send("friend or foe?");

			String answer = reader.readLine();
			if (answer != null && answer.equals("friend!")) {
				send("Hi there, buddy!");
				return true;
			}

			return false;
		}

		public void run() {

			// So, als erste bauen wir mal unsere Kommunikationskanäle auf, damit wir überhaupt reden können mit unserem Client...
			try {
				reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
				writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
			} catch (IOException e) {
				e.printStackTrace();
				return;
			}

			// Nun gehts weiter zum Handshake. Damit gehen wir sicher, dass es sich auch wirklich um einen Client handelt, der mit unserer Art von
			// Antworten zurechtkommt. Hier kannst du alles mögliche machen, was dir eben wichtig erscheint...
			try {
				if (!shakeHands()) {
					return;
				}
			} catch (IOException e) {
				e.printStackTrace();
				return;
			}

			// So, es ist ein ordentlicher Client, nun gehen wir einen Modus, in dem wir einfach auf Anfragen vom Client warten und diese beantworten.
			// Natürlich könnten wir ihm auch selber Sachen schicken, die muss eben dann er entsprechend verarbeiten...
			try {
				String line;
				while ((line = reader.readLine()) != null) {
					if (line.equals("someCommandToHandle")) {
						// Anfrage abarbeiten
					} else if (line.equals("someOtherCommandToHandle")) {
						// Anfrage abarbeiten
					}
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}



	// ==================================================================================================
	// {[> Initializers and Constructors
	// =================================
	public Server(int port) throws IOException {
		super(port);

		new Thread() {

			public void run() {
				while (true) {
					try {
						// Wir warten auf Clients und geben sie sofort an eine eigene Klasse weiter, die sich um sie kümmert
						new ClientManager(accept());
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			};
		}.start();
	}
}

Client.java
Code:
public class Client extends Socket {

	// ==================================================================================================
	// {[> Attributes
	// ==============
	private BufferedReader reader;
	private BufferedWriter writer;



	// ==================================================================================================
	// {[> Initializers and Constructors
	// =================================
	public Client(String host, int port) throws UnknownHostException, IOException {
		super(host, port);

		reader = new BufferedReader(new InputStreamReader(getInputStream()));
		writer = new BufferedWriter(new OutputStreamWriter(getOutputStream()));

		new Thread() {

			public void run() {
				try {
					if (!shakeHands()) {
						return;
					}
				} catch (IOException e) {
					System.err.println("Fehler beim HandShake!");
					e.printStackTrace();
					return;
				}

				// Ab hier kann normal mit dem Server kommuniziert werden...
				// send("irgendwelche Anfragen, die dann wieder wie in der shakeHands()-Methode ausgelesen und verarbeiten werden müssen.")

			};
		}.start();
	}



	// ==================================================================================================
	// {[> Methods
	// ===========
	private void send(String command) throws IOException {
		// Funktioniert wie die Methode in der Klasse 'Server'.
		writer.write(command + "\n");
		writer.flush();
	}

	private boolean shakeHands() throws IOException {
		String answer = reader.readLine();
		if (answer != null && answer.equals("friend or foe?")) {
			send("friend!");
		}

		answer = reader.readLine();
		if (answer != null && answer.equals("Hi there, buddy!")) {
			return true;
		}

		return false;
	}
}
 
Danke für deine Mühen, es lag an Eclipse ^^ eine neuinst hat den Fehler beseitigt... Irgendwas hat da nicht so funktioniert wie es sollte...
Naja, danke für deine Mühe =) wirklich sehr nett!
lg.
 
Zurück
Oben