2013-02-27 99 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 

客户端请求:

GET /domains.txt HTTP/1.1 

其中 “domains.txt”是包含网站列表的服务器上的文件。

+0

你不应该使用读者和作家,除非你知道该文件是文本。使用InputStreams和OutputStreams:它们适用于所有文件。 – EJP 2013-02-27 12:29:27

回答

0

while循环没有终止,因为inFromServer期待更多的数据。您需要关闭服务器端的连接(outToClient),以便客户端可以确保没有更多数据可用。

+0

谢谢。这很简单。 – user2114721 2013-02-27 10:06:20

0

实现此目的的一个原因是发送一个触发器[字符串从服务器],发送完所有数据到客户端,表示完成文件传输,在客户端您可以检查此字符串,并在收到此字符串可以从你的while循环中出来并关闭连接。

另一种更好的方法是,在服务器端发送实际文件内容之前,发送文件的大小,然后是实际的文件数据,在客户端保持跟踪读取的字节,一旦读取了字节相等以较早发布的大小,你可以终止你的while循环

+0

谢谢先生。我将基于这个想法来进行更复杂的文件传输。 – user2114721 2013-02-27 10:06:55

+0

除非您在数据中开始转义,否则当您不得不逃脱逃跑时,没有触发器可以作为数据出现。 – EJP 2013-02-27 12:30:36

+0

@EJP你是正确的,因此只有第二种方法更好,还有我们需要照顾与实际数据分离长度,基本上需要添加头和有效载荷机制,其中头可以包含有效载荷元数据,有效载荷本身将是实际文件内容 – 2013-02-27 13:08:56