0

クライアントからファイル名を取得し、サーバー上にあるファイルの内容を読み取り、それをクライアントにストリーミングする tcp サーバーを作成しました。

ファイルを受信するクライアントも作成しました。私の問題は、クライアントでファイルを受信した後です。ループを終了して接続を閉じるにはどうすればよいですか?

サーバーコードは次のとおりです。

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」は、Web サイトのリストを含むサーバー上のファイルです。

4

2 に答える 2

1

inFromServerはより多くのデータを期待しているため、while ループは終了しません。outToClientクライアントがこれ以上データが来ないことを確認できるように、サーバー側で接続 ( ) を閉じる必要があります。

于 2013-02-27T10:01:55.843 に答える
0

これを達成するための大まかな方法​​の1つは、すべてのデータをクライアントに送信した後、ファイル転送の完了を示すトリガー[サーバーからの文字列]を送信することです。クライアント側でこの文字列を確認し、この文字列を受信すると、 whileループを実行し、接続を閉じることができます。

もう1つのより良いアプローチは、実際のファイルコンテンツを送信する前にサーバー側でファイルのサイズを送信し、次に実際のファイルデータを送信し、クライアント側で、以前に投稿されたサイズに等しいバイトを読み取った後、読み取られたバイトを追跡することです。 whileループを終了できます

于 2013-02-27T10:02:35.510 に答える