2013-02-27 2 views
0

Я сделал tcp-сервер, который берет имя файла от клиента и считывает содержимое файла, расположенного на сервере, а затем передает его обратно клиенту.Закрыть соединение сокета после приема потока - java

Я также сделал клиент для получения файла. Моя проблема в том, что после получения файла на клиенте, как мне закончить цикл, я могу закрыть соединение?

Вот код сервера:

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 

Вот код клиента: запрос

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 с сервера, как, например:

GET /domains.txt HTTP/1.1 

где "domains.txt" это файл на сервере, содержащий список веб-сайтов.

+0

Вы не должны использовать Readers and Writers, если не знаете, что это текст. Используйте InputStreams и OutputStreams: они работают для всех файлов. – EJP

ответ

0

Цикл while не заканчивается, потому что inFromServer ожидает больше данных. Вам необходимо закрыть соединение (outToClient) на стороне сервера, чтобы клиент мог убедиться, что больше нет данных.

+0

Спасибо. Это было так просто. – user2114721

0

Одна из целей достижения этого - отправить триггер [Строка с сервера], после отправки всех данных клиенту, указывающих завершение передачи файла, на стороне клиента вы можете проверить эту строку, и после получения этой строки вы может выйти из цикла while и закрыть соединение.

Еще один лучший подход - на стороне сервера перед отправкой фактического содержимого файла отправить размер файла, а затем фактические данные файла, на стороне клиента отслеживать прочитанные байты, как только вы прочтете байт равным к размеру, опубликованному ранее, вы можете завершить цикл while

+0

Спасибо, сэр. Я опишу эту идею для более сложных передач файлов. – user2114721

+0

Нет триггера, который вы можете отправить, который не может появиться как данные, если только вы не начнете его избегать в данных, когда вам тоже нужно избежать побега. – EJP

+0

@ EJP. Вы правы, поэтому лучше использовать второй подход, нам также нужно позаботиться о разделении длины с фактическими данными, в основном необходимо добавить механизм заголовка и полезной нагрузки, где заголовок может содержать метаданные полезной нагрузки, а сама полезная нагрузка будет фактической содержимое файла –

Смежные вопросы