client/server programm fehler !

  • Themenstarter Themenstarter cb
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
C

cb

Gast
ich habe eine einfache client/server programm geschrieben


zuerst starte ich den server, dann den client der sich zum server verbinded. dann tauschen die beiden ein paar nachrichten aus und der client beendet seine verbindung. der server wartet dann mit x = y.accept(); auf einen neuen client.
bis hierher funktioniert es problemlos.

wenn ich den client jetzt wieder starte bekomme ich beim client die fehlermeldung "java.net.SocketException: Connection reset" und beim server "java.lang.NullPointerException".


ganz verstehe ich das nicht, da ich ja den client nur ein 2. mal starte, also exakt das selbe programm das beim 1. mal funktioniert hat.


muss ich dem server auch irgendwie mitteilen das der client die verbindung cancelt ? bis jetzt hab ich nur beim client die verbindung mit y.close(); gecancelt.


bitte um hilfe
 
kannst du die ausschlaggebenden zeilen posten.
zudem bist du falsch hier. es gibt eine sparte netzwerk prog.
 
für mich war es eher eine anfängerfrage. tut mir leid


so ungefähr schaut der server aus:
Code:
.
ServerSocket server;
server = new ServerSocket(3141);

while(true) {
Socket client = server.accept();
//Programm
}
.


und so der client
Code:
.
Socket server = new Socket ( "localhost", 3141 );
//Programm
server.close();
.
 
ja gut das sind die standard zeilen. was soll der server machen? was schickt der client usw.
Bsp.
Code:
// Server
public class Server {

    public Server(int port) throws IOException {
        ServerSocket server = new ServerSocket(port);
        while(true) {
            Socket client = server.accept();
            BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
            String clientName = in.readLine();
            System.out.println("New Client "+clientName+" vom "+client.getInetAddress);
            IrgendetwasmitThread  i_X = new IrgendetwasmitThread ();
            i_X.start();
        }
    }
}
Code:
// Client
public class Client extends Thread{
    ...
    try {
        socket = new Socket(server, port):
        ...
        this.start();
    }
    catch() {}
    ...
}
ich denke diese Sachen sollten reichen. Habe einige Zeilen ausgelassen. Wenn doch Bedarf ist posten.
 
mein problem ist ja das eigentlich alles so läuft wie es soll, nur das wenn ich den client beende und nocheinmal starte, nichts mehr gesendet wird. nur ich weiß nicht warum
 
das sollte eigentlich für den server egal sein. schau mal nach ob jeder client sein eigenen thread bekommt.
 
ich starte ja jedes mal den selben client, das problem ist das es beim 1.mal starten funktioniert beim 2. mal starten geht gar nichts mehr.
 
das habe ich schon verstanden. aber ich hatte gefragt was dein server macht !!! nicht client. was macht er? hängt der sich auf wenn ein client abschmiert?
 
dann würde der server ja nur ein einzigen client verwalten können. das dürfte nicht der fall sein. ist auch NPE.
 
der server liest einen string mit "String s = in.readLine();"ein. da bekommt er null zurück, obwohl der client eigentlich mit "out.println("start");" etwas sendet. nachdem der client das gesendet hat, bekomme ich beim client die fehlermeldung "java.net.SocketException: Connection reset"
 
dir ist schon klar, dass du, wenn du mehrere Clients gleichzeitig an deinen ServerSocket accepten willst, mehrere Threads verwenden musst?
 
scheinbar hab ich mich nicht richtig ausgedrückt.

der server soll nur jeweils eine verbindung aktzeptieren. d.h zuerst verbinde ich den client ein mit dem server, dann beendet der client die verbindung und dann verbinde ich ihn noch einmal mit dem server.
 
RTFM

setReuseAddress

public void setReuseAddress(boolean on)
throws SocketException

Enable/disable the SO_REUSEADDR socket option.

When a TCP connection is closed the connection may remain in a timeout state for a period of time after the connection is closed (typically known as the TIME_WAIT state or 2MSL wait state). For applications using a well known socket address or port it may not be possible to bind a socket to the required SocketAddress if there is a connection in the timeout state involving the socket address or port.

Enabling SO_REUSEADDR prior to binding the socket using bind(SocketAddress) allows the socket to be bound even though a previous connection is in a timeout state.

When a ServerSocket is created the initial setting of SO_REUSEADDR is not defined. Applications can use getReuseAddress() to determine the initial setting of SO_REUSEADDR.

The behaviour when SO_REUSEADDR is enabled or disabled after a socket is bound (See isBound()) is not defined.
 
das ist doch auch OK. aber sobald du den client beendest und neu verbindest hast du doch den zweiten client sozusagen. meldest du es richtig beim server ab?
 
@ CelikBlek:

das war ja meine frage.

vor dem beenden des client schließe ich eingabe und ausgabestream sowie den socket.



@ Bleiglanz:

das hört sich ganz interessant an, muss mal darüber nachdenken
 
jetzt hab ich es mit setReuseAddress(boolean on)probiert, allerdinfgs wieder die selbe fehlermeldung bekommen
 
durch meine vielen versuche ist der code momentan in einem unlesbaren zustand.

ich hab das ganze jetz umgangen indem ich beim server den port schließe und gleich wieder öffne.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben