Schließen socket-Verbindung nach Erhalt stream - java
Machte ich einen tcp-server, der nimmt einen Dateinamen vom client aus und Lesen Sie den Inhalt der Datei auf dem server gespeichert und dann übertragen Sie Sie an den client zurück.
Ich habe auch einen client, um die Datei zu empfangen. Mein problem ist, nach dem Empfang der Datei auf dem client, wie kündige ich die Schleife, so kann ich die Verbindung schließen?
Hier ist der server-code:
import java.io.*;
import java.net.*;
import java.util.*;
public class WebTCPServer_file {
public static void main(String argv[]) throws Exception{
String request;
ServerSocket welcomeSocket = new ServerSocket(6790); //opening socket
while(true){
Socket connectionSocket = welcomeSocket.accept();
Scanner inFromClient = new Scanner(connectionSocket.getInputStream());
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
request = inFromClient.nextLine(); //client request
System.out.println("Received: "+request);
/*dividing request command*/
String reqMeth = request.substring(0, 3);
String reqURL = request.substring(5, (request.lastIndexOf("HTTP/1.1")));
String reqProto = request.substring(request.indexOf("HTTP/1.1"));
System.out.println("Request Method:\t" +reqMeth +"\nRequest URL:\t" +reqURL+ "\nRequest Protocol: " +reqProto);
File localFile = new File(reqURL.trim());
FileReader in = new FileReader(localFile);
BufferedReader inBuff = new BufferedReader(in);
String c;
while((c = inBuff.readLine())!=null){
outToClient.writeBytes(c + '\n');
System.out.println(c);
} //END while
outToClient.flush();
in.close();
} //END while(true)
} //END main
} //END class
Hier ist der client-code:
import java.io.*;
import java.net.*;
import java.util.*;
public class TCPClient_file {
public static void main(String[] args) throws Exception{
String sentence ;
Scanner inFromUser = new Scanner(System.in);
Socket clientSocket = new Socket("192.168.0.16", 6790);
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(
new InputStreamReader(
clientSocket.getInputStream()));
sentence = inFromUser.nextLine();
outToServer.writeBytes(sentence + '\n');
String serverfile;
while ((serverfile = inFromServer.readLine()) != null)
System.out.println(serverfile);
inFromServer.close();
outToServer.close();
clientSocket.close();
} //END main
} //END class
Client-Anfrage vom server als solche:
GET /domains.txt HTTP/1.1
wo "domains.txt" ist eine Datei auf dem server mit einer Liste von websites.
- Sie sollten nicht Leser und Schreiber, es sei denn, Sie wissen, die Datei ist text. Verwenden InputStreams und OutputStreams: Sie arbeiten für alle Dateien.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die while-Schleife nicht beendet, da
inFromServer
erwartet mehr Daten. Sie müssen die Verbindung schließen (outToClient
) auf der server-Seite, so dass der client sicher sein kann es gibt keine Daten mehr kommen.Einem feuchten, dies zu erreichen, ist das senden einer trigger [String von server], nach dem senden aller Daten an den client zur Anzeige des Abschlusses der Datenübertragung, auf der client-Seite können Sie prüfen, ob diese Zeichenfolge und nach receiveing diese Zeichenfolge können Sie kommen aus der while-Schleife und kann in enger Verbindung.
Anderen der bessere Ansatz ist, auf der server-Seite vor dem senden den tatsächlichen Inhalt der Datei senden Sie die Größe der Datei und dann die eigentliche Datei Daten, die auf der client-Seite verfolgen von bytes zu Lesen, sobald Sie Sie gelesen haben, das byte gleich Größe weiter oben geschrieben, können Sie kündigen Ihre while-Schleife