2017-03-01 7 views
0

私は好奇心のためにJavaでHTTPサーバーを構築しようとしています。Javaソケットを使用してWebブラウザにファイルを送信するには?

私はHTTPがソケットを使用していることを知っています(私が間違っていると私を修正します)。したがって、最初にServerSocketクラスを使用してプログラミングを開始しました。

public class Server 
{ 

    public static void main(String[] args) throws IOException 
    { 
     System.out.println("Listening....."); 
     ServerSocket ss = new ServerSocket(80); 
     while(true) 
     { 
     Socket s = ss.accept(); 
     Scanner sc = new Scanner(s.getInputStream()); 
     while(sc.hasNextLine()) 
     { 
      String line = sc.nextLine(); 
      if(line.equals("")) 
       break; 
      else 
       System.out.println(line); 
     } 
     System.out.println("-------------------------------"); 
     PrintStream ps = new PrintStream(s.getOutputStream()); 
     ps.println("Hello from Server"); 
     s.close(); 
     ps.close(); 
     sc.close(); 
     } 
    } 
} 

(私は複数のユーザーにサービスを提供するために、私の実際のコードでThreadを使用しています。私は、基本的なコードを単に提供してきました。)

私は、Webブラウザからのすべてのヘッダを取得しています。しかし、どのようにファイルや画像を送信できますか?

単純なHTMLの場合は、ファイルを読み取り、PrintStreamを使用してWebブラウザで印刷できます。

しかし、JavaScript、画像などをブラウザに送信するにはどうすればよいですか?

答えて

2

HTTPにはプロトコルがありますので、そのプロトコルに従う必要があります。依然として広く使われているHTTP 1.1プロトコル仕様は、公式に新しいRFC 7230,7231,7232,7233,7234、および7235に置き換えられていますが、RFC 2616です。 another questionからmy answer

、私は直接JavaのSocketからのインバウンドHTTPリクエストを読むため正しい道を示します。

返信を返信するときは、PrintStreamまたはPrintWriterを使用して応答HTTPヘッダーを送信できます。ただし、本文の内容は、Content-TypeおよびTransfer-Encoding応答ヘッダーで指定された形式に基づいて生のバイトとして送信されます。通常、生のバイトをソケットのOutputStreamに直接送信するか、または少なくともBufferedOutputStreamに接続するだけです。タイプに関係なく、既存のファイルをディスクから送信する場合は、そのファイルに対してInputStreamを開いてから、そのデータをソケットのOutputStreamに直接コピーすることができます。データを動的に生成する場合、中間クラスが適切であれば、ソケットのOutputStreamにデータを送信します。 Print...クラスは画像のようなバイナリデータではなく、テキストデータにのみ適しています。つまり、Javaは独自のHttpServerHttpsServerクラスを持っています。それらの使用を検討する必要があります。

1

基本的には同じです。生のバイトをソケットのOutputStreamに「印刷」する必要があります。

ただし、ブラウザで理解できるようにするには、HTTP/1.1 protocolに従ってレスポンスを設定する必要があります。 Content-Typeヘッダーを指定すると、ブラウザから受信した内容をブラウザに通知します。 Content-Lengthヘッダーを指定すると、ブラウザから受信しているバイト数がブラウザに通知されます。その他

関連する問題