2017-02-20 18 views
0

I einfache Server-Client-Anwendung zu machen versuche, die der Client eine Datei an den Server senden können dann sendet der Server Bestätigungsnachricht, dass sie die Datei empfangenJava-Socket-Verbindung zurückgesetzt

dies ist der Serverklasse.

public class Server { 

public static void main(String[] args) { 
    try { 
     ServerSocket server=new ServerSocket(9090); 
     while(true){ 
      Socket clientSocket=server.accept(); 
      ClientThread client=new ClientThread(clientSocket); 
      client.start(); 
     } 
    } catch (IOException e) { 
     System.out.println(e.toString()); 
    } 

} 

} 

ClientThread Klasse

public class ClientThread extends Thread { 

private Socket socket;// socket to connect through 
private BufferedInputStream SocketInput;// stream to read from socket 
private BufferedOutputStream FileOutput;// stream to write file through it 
private PrintWriter SocketOutput; // print writer to write through socket 

public ClientThread(Socket socket){// constructor 
    this.socket=socket; 
} 

public void run(){ 
    try { 
     //get socket input stream 
     SocketInput=new BufferedInputStream(socket.getInputStream()); 

     //get socket output stream 
     SocketOutput=new PrintWriter(socket.getOutputStream(),true); 

     // get the file from client 
     int NBytes=0; 
     byte[] data=new byte[1024]; 

     FileOutput=new BufferedOutputStream(new FileOutputStream("C:/Users/mohamed/Desktop/Download/band.jpg"));  
     while((NBytes=SocketInput.read(data))!=-1){ 
      FileOutput.write(data,0,NBytes); 
      FileOutput.flush(); 
     } 

     // send ack. that file has been received 
     SocketOutput.println("File has been sent sucessfully"); 

     //close all streams 
     FileOutput.close(); 
     SocketInput.close(); 
     SocketOutput.close(); 
     socket.close(); 

    } 
    catch (IOException e) { 
     System.out.println(e.toString()); 
    } 
} 
} 

Client-Klasse

public class Client { 

public static void main(String[] args) { 

    // file will be sent 
    File f=new File("D:/images/band.jpg"); 

    try { 

     // get address of local host 
     InetAddress serverAddress=InetAddress.getLocalHost(); 

     //create socket 
     Socket socket=new Socket(serverAddress,9090); 

     // create streams 
     BufferedInputStream input=new BufferedInputStream(new FileInputStream(f)); 
     BufferedOutputStream output=new BufferedOutputStream(socket.getOutputStream()); 
     BufferedReader p=new BufferedReader(new InputStreamReader(socket.getInputStream())); 

     // send the file 
     byte[] data=new byte[1024]; 
     int Nbytes=0; 

     while((Nbytes=input.read(data))!=-1){ 
      output.write(data,0,Nbytes); 
      output.flush(); 
     } 

     // read the ack. and print it 
     System.out.println(p.readLine()); 

     //close streams & socket 
     p.close(); 
     input.close(); 
     output.close(); 
     socket.close(); 

    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

} 

, was ich, wenn ich den Server und den Client-i nichts bekam laufen, wenn ich den Client die Server-App-Typen stoppen in Die console exception connection reset, aber wenn ich den Teil der Bestätigung entferne die Datei empfangen und nichts schief geht, was ist das Problem?

Antwort

-1

Denn wenn Sie Anschlussseite des Code wie dies

while((Nbytes=input.read(data))!=-1){ 
     output.write(data,0,Nbytes); 
     output.flush(); 
    } 

    // read the ack. and print it 
    System.out.println(p.readLine()); 

haben Sie in der letzten Zeile blockiert und für die Eingabe warten. Aber da Steckdosen noch Ihre Leseseite Code öffnen,

while((NBytes=SocketInput.read(data))!=-1){ <-- HERE U ARE BLOCKED 
     FileOutput.write(data,0,NBytes); 
     FileOutput.flush(); 
    } 

blockiert auf while Schleifenbedingung. Bis die Verbindung gültig ist und die Eingabe nicht geschlossen ist, wird #read nicht zurückgegeben, Sie haben also blockiert.

Try Ausgabe-Stream zu schließen, nachdem der gesamte Inhalt wird Sie diese

while((Nbytes=input.read(data))!=-1){ 
     output.write(data,0,Nbytes); 
     output.flush(); 
    } 
    output.close(); // this should unblock blocked thread on the other side 
    // read the ack. and print it 
    System.out.println(p.readLine()); 

sollte effektiv sagen, auf der anderen Seite, dass keine anderen Daten transmited wird transmited (gesperrt lesen Methode -1 zurück)

+0

Wenn Sie den Ausgabestream schließen, wird der Socket geschlossen, so dass die folgende 'readLine()' eine 'socket closed' Ausnahme erhält. – EJP

0

bin festgefahren. Der Client liest den Socket bis zum Ende des Streams und Sie haben den Socket nicht geschlossen. Es gibt also kein Ende des Streams. Wenn Sie also die ACK-Zeile lesen, lesen beide Peers.

Sie benötigen die ACK-Leitung nicht. Einfach entfernen. Schick es nicht und lies es nicht.

+0

Ich lese die ACK in dieser Zeile in der Client-Klasse System.out.println (p.readLine()); wo p ist gepufferter Leser –

+0

Sie lesen die ACK-Zeile, während Ihr Server noch auf das Ende des Streams in seinem eigenen 'read()' wartet. – EJP