Socket-Fehler

PhilippGer

Mitglied
Hi!
Ich soll für die Uni ein kleines Programm schreiben, dass mit Sockets arbeitet.

EIn Client schickt zwei Double-Zahlen an den Server und dieser berechnet das Produkt und sendet es an den Client zurrück.

Ansich eine einfache Sache, allerdings bekomme ich einen Fehler bei meinem Programm den sich weder ich selbst noch meine Übungsleiter in der Uni erklären konnten.

Der Server startet soweit gut, aber sobald ich einen Clienten starte, schmeißt der Server eine Fehlermeldung.
Code:
java.net.SocketException: Connection reset
	at java.net.SocketInputStream.read(Unknown Source)
	at java.io.ObjectInputStream$PeekInputStream.read(Unknown Source)
	at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)
	at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source)
	at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
	at java.io.ObjectInputStream.<init>(Unknown Source)
	at MulServer.<init>(MulServer.java:33)
	at MulServer.main(MulServer.java:63)

Diese Fehlermeldung wird beim Erzeugen des Input-Streams des Servers geworfen.

Hat jemand eine Ahnung was das sein könnte?


Client:
Code:
import java.awt.BorderLayout;
import java.awt.List;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;

import javax.swing.JFrame;
import javax.swing.JPanel;


public class MulClient {
	
	private static String url = "";
	private static Integer port = 13457;
	private List list;
	
	public MulClient( Double a,Double b,Integer port){
		this.port = port;
		try{
			Socket client = new Socket(url, port);
			writeGUI("start");
			
			ObjectInputStream read = new ObjectInputStream (client.getInputStream());
			ObjectOutputStream writer = new ObjectOutputStream( client.getOutputStream() );

			writeGUI("erste Zahl");
			writer.writeDouble(a);
			writer.flush();
			writeGUI("zweite Zahl");
			writer.writeDouble(b);
			writer.flush();
			client.wait(5000);		
			
			Double e = read.readDouble();
			writeGUI("Ergebnis empfangen");
			
			writeGUI(a + " x " + b + " = " + e);
			
			client.close();
		}catch(IOException e){
			System.out.println("1");
			e.printStackTrace();
		} catch (InterruptedException e) {
			System.out.println("warten-fehler");
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		new MulClient( 1.0, 2.0, 3412);
	}
	
	public void draw(){
		JFrame frame = new JFrame("Client");
		JPanel pane = new JPanel();
		pane.setLayout( new BorderLayout() );
		pane.setPreferredSize(new java.awt.Dimension(500, 400));
		
		this.list = new List();
		pane.add(list);
		
		frame.setContentPane(pane);
		frame.pack();
		frame.setVisible(true);
	}
	
	
	public void writeGUI(String s){
		this.list.add(s);
	}
	
}



Server:
Code:
import java.awt.BorderLayout;
import java.awt.List;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JFrame;
import javax.swing.JPanel;



public class MulServer {
	
	private static Integer port = 13457;
	private static ServerSocket server;
	private List list;
	
	public MulServer(Integer port){
		draw();
		this.port = port;
		writeGUI("Port: "+port);
		try{
			server = new ServerSocket(port);
			
			writeGUI("Server:\thorcht...");
			Socket con = server.accept();
			writeGUI("Server:\tVerbindung empfangen");
			
			ObjectInputStream read = new ObjectInputStream(con.getInputStream());
			ObjectOutputStream write = new ObjectOutputStream(con.getOutputStream());
			
			writeGUI("Warten auf Zahl 1");
			Double a = read.readDouble();
			writeGUI(a+" empfangen");
			writeGUI("Warten auf Zahl 2");
			Double b = read.readDouble();
			writeGUI(b+" empfangen");
			Double e = a*b;
			writeGUI(e+" berechnet");
			write.writeDouble(e);
			writeGUI("Server:\t Ergebnis versendet");
			
			server.close();
			
		}catch(IOException e){
			System.out.println("Error 2");
			System.out.println(e.toString()+"\n\n");
			e.printStackTrace();
		}finally{
			try {
				this.server.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	public static void main(String[] args) {
		new MulServer(3412);
	}
	
	public void draw(){
		JFrame frame = new JFrame("Server");
		JPanel pane = new JPanel();
		pane.setLayout( new BorderLayout() );
		pane.setPreferredSize(new java.awt.Dimension(300, 300));
		
		this.list = new List();
		pane.add(list);
		
		frame.setContentPane(pane);
		frame.pack();
		frame.setVisible(true);
	}
	
	
	public void writeGUI(String s){
		this.list.add(s);
	}
}
 
Ich hab das Gleiche vor etwas einem Jahr gemacht und den Code zum Glück noch.

Hab die Codes eben verglichen und bin mir nicht mehr sicher, ob du das server.accept() in einem Thread laufen lassen musst, sodass es immer wieder aufgerufen wird. Das hab ich bei deinem Code mal eingebaut. hab aber immer noch die gleiche Fehlermeldung bekommen. Das Ganze ist bei mir leider schon lange her.


Ich kann dir mal meinen Code geben. Ich hab noch eine zusätzliche Klasse Values, wo einfach die 2 Doublewerte gespeichert werden.

Client:
Beim Client ist es ganz wichtig, dass du zuerst den OutputStream und erst dann den InputStream instanzierst. Sonst bekommt der Client irgendwie keine Antwort :p
Code:
package client;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

import com.Values;

/**
 * Client der dem Server Werte schickt und die Antwort liest und ausgibt
 * 
 */
public class ObjectClient {
	private Object response = null;

	/**
	 * Konstruktor, stellt eine Verbindung mit dem Server her, schickt eine
	 * Instanz von Values und liest die Anwort des Servers
	 * 
	 * @param values
	 *            Instanz von Values
	 */
	public ObjectClient(Object values) {

		ObjectOutputStream output = null;
		ObjectInputStream input = null;

		Socket socket = null;

		try {
			socket = new Socket("localhost", 4000);

			output = new ObjectOutputStream(socket.getOutputStream());
			input = new ObjectInputStream(socket.getInputStream());

			output.writeObject(values);
			output.flush();

			response = input.readObject();
			output.close();
			input.close();

		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}

	/**
	 * Startet den Server setzt die 2 Doublewerte
	 * 
	 * @param argv
	 */
	public static void main(String argv[]) {
		Values values = new Values();
		// Wenn andere Werte übergeben werden sollen, dann hier ändern
		values.setValue1(14.55);
		values.setValue2(85.22);
		ObjectClient client = new ObjectClient(values);
		System.out.println(client.getResponse());
	}

	/**
	 * @return the response
	 */
	public Object getResponse() {
		return response;
	}
}

Server:
Code:
package server;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

import com.Values;

/**
 * Server der die Anfrage des Servers liest, die Operationen ausführt und dem
 * Client eine Antwort sendet
 * 
 */
public class ObjectServer implements Runnable {

	/**
	 * Serversocket
	 */
	private ServerSocket serverSocket;

	/**
	 * Konstruktor, stellt eine Verbindung zum Client her und startet einen
	 * neuen Thread
	 */
	public ObjectServer() {
		super();
		try {
			serverSocket = new ServerSocket(4000);
			new Thread(this).start();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Runnable#run()
	 */
	public void run() {
		Socket client;
		ObjectInputStream input = null;
		ObjectOutputStream output = null;
		try {
			client = serverSocket.accept();
			new Thread(this).start();

			input = new ObjectInputStream(client.getInputStream());
			output = new ObjectOutputStream(client.getOutputStream());

			// Gesendetes Objekt in einer Variable speichern
			Object object = input.readObject();

			// Wenn dem Server eine Instanz von Values geschickt wird
			if (object instanceof Values) {
				Values values = (Values) object;
				Double value1 = values.getValue1();
				Double value2 = values.getValue2();

				// Ergebnisse mit den 2 Doublewerten ausrechnen
				Double addition = value1 + value2;
				Double subtraktion = value1 - value2;
				Double mulitplikation = value1 * value2;
				Double division = value1 / value2;

				// Dem Client eine Antwort senden
				output.writeObject("Addition: " + addition + "\nSubtraktion: "
						+ subtraktion + "\nMultiplikation: " + mulitplikation
						+ "\nDivision: " + division);
				output.flush();
			}
			// Wenn eine unbekannte Instanz gesendet wird
			else {
				System.out.println("Unbekanntes Objekt");
				output.flush();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Startet den Server
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		new ObjectServer();
	}

}

Values:
Code:
package com;

import java.io.Serializable;

/**
 * Klasse Values die an den Server geschickt wird. Zwei Doublewerte können
 * gesetzt werden
 * 
 */
public class Values implements Serializable {
	private static final long serialVersionUID = -3428114904655899216L;
	/**
	 * Erster Doublewert
	 */
	private Double value1;

	/**
	 * Zweiter Doublewert
	 */
	private Double value2;

	/**
	 * @return the value1
	 */
	public Double getValue1() {
		return value1;
	}

	/**
	 * @param value1
	 *            the value1 to set
	 */
	public void setValue1(Double value1) {
		this.value1 = value1;
	}

	/**
	 * @return the value2
	 */
	public Double getValue2() {
		return value2;
	}

	/**
	 * @param value2
	 *            the value2 to set
	 */
	public void setValue2(Double value2) {
		this.value2 = value2;
	}

}
 
Hab auch mal en bisschen mit deinem Code rumgespielt.
In deiner Client Klasse muss tatsächlich der OutputStream zuerst instanziert werden.
Ausserdem muss in der Server Klasse noch geflusht werden nachdem du das Ergebnis sendest. Dann hat das ganze bei mir funktioniert.
Wenn du weiterhin Probleme hast kann ich dir den geänderten Code gerne noch posten.

Hoffe ich konnte dir ein bisschen helfen.

Gruß
sony2
 
Aaaaalso.. erstmal danke fürs Feedback :)

Output- vor InputStream ist berücksichtigt....

server.accept()
lässt an der Stelle halten, bis eine Verbindung besteht.

Ist natütlich sinnvoll es in einem Thread laufen zu lassen, weil das Programm ja normalerweise nicht nur einmal auf eine Verbindung warten soll.
Da hier zum Test aber nur eine Verbindung gemacht wird, kann es auch so stehen bleiben.

Ansonsten habe ich immernoch den selben Fehler...

werde jetzt mal den Code von java123 nehmen und den bei mir testen.


€dit:
Funktioniert einwandfrei...ich habe keine Ahnung was bei mir da im Argen liegt...
Werde das Programm dann auf Basis deines Codes abändern, wenn das genehm ist :)
 
Zuletzt bearbeitet:
seas,

habs mal durchgetestet und bei mir klappt das liegt evt daran das du das so startest

HTML:
public static void main(String[] args) {
		new MulServer(3412);
	}

versuch das ganze mal so:

PHP:
public static void main(String[] args) {
		new MulServer(port);
	}

Hab nur deinen Server getestet mit einem von mir geschriebenen Client. der sich einfach nur drauf Connectet

Du setzt oben den Port als Static Variable mit der du auch mit dem Client drauf Connectest

HTML:
public static void main(String[] args) {
		new MulClient( 1.0, 2.0, 3412);
	}
in ---->private static Integer port = 13457; <-------
PHP:
public static void main(String[] args) {
		new MulClient( 1.0, 2.0,port);
	}

Gruß
 
Zuletzt bearbeitet von einem Moderator:
Klar kannst du meinen Code brauchen und verändern :)

Mit der Änderung von mirkoku dürfte es wohl auch funktionieren. Habe ebenfalls gesehen, dass du den Port mit dem Konstruktoraufruf übergibst und nachher setzt. Jedoch habe ich nicht bemerkt, dass Port eine static Variable ist :/

Edit: Frage: bist du Azubi und arbeitest bei einer Bank mit 3 Buchstaben?^^ (ich weiss da oben steht UNI, aber komischerweise musste ich dasselbe vor genau einem Jahr auch machen)
 
Zuletzt bearbeitet:
:D Das ganze geht nun.. habe deinen Code entsprechend abgeändert und es läuft.. aber ich merks mir für die Zukunft :)

Und neeee, arbeite bei keiner Bank!

Ist ne Aufgabe für Fortgeschrittene Programmiertechniken an der Uni...

Das ganze war ne Vorbereitung für ne Client-Server-Anwendung.. ne Art simulierter Onlineshop mit Verwaltungs- und Verkaufs-Client

Danke nochmal an Alle für die Hilfe :)
 

Neue Beiträge

Zurück