2012-04-04 5 views
0

このようなシステムでURLクエリを解析するにはどうすればよいですか。URL Runnableクラスを使用したJavaサーバーでの解析

たとえば、これらのURL引数を変数として取得するようなものです。

http://localhost?format=json&apikey=838439873473kjdhfkhdf

http://tutorials.jenkov.com/java-multithreaded-servers/multithreaded-server.html

私は

MultiThreadedServer.java

package servers; 

import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.IOException; 
import java.net.Socket; 

/** 

*/ 
public class WorkerRunnable implements Runnable{ 

protected Socket clientSocket = null; 
protected String serverText = null; 

public WorkerRunnable(Socket clientSocket, String serverText) { 
    this.clientSocket = clientSocket; 
    this.serverText = serverText; 
} 

public void run() { 
    try { 
     InputStream input = clientSocket.getInputStream(); 
     OutputStream output = clientSocket.getOutputStream(); 
     long time = System.currentTimeMillis(); 
     output.write(("HTTP/1.1 200 OK\n\nWorkerRunnable: " + 
       this.serverText + " - " + 
       time + 
       "").getBytes()); 
     output.close(); 
     input.close(); 
     System.out.println("Request processed: " + time); 
    } catch (IOException e) { 
     //report exception somewhere. 
     e.printStackTrace(); 
    } 
    } 
} 

WorkerRunnable.javaこれらのファイルに

を作りました

package servers; import java.net.ServerSocket; import java.net.Socket; import java.io.IOException; public class MultiThreadedServer implements Runnable{ protected int serverPort = 8080; protected ServerSocket serverSocket = null; protected boolean isStopped = false; protected Thread runningThread= null; public MultiThreadedServer(int port){ this.serverPort = port; } public void run(){ synchronized(this){ this.runningThread = Thread.currentThread(); } openServerSocket(); while(! isStopped()){ Socket clientSocket = null; try { clientSocket = this.serverSocket.accept(); } catch (IOException e) { if(isStopped()) { System.out.println("Server Stopped.") ; return; } throw new RuntimeException( "Error accepting client connection", e); } new Thread( new WorkerRunnable( clientSocket, "Multithreaded Server") ).start(); } System.out.println("Server Stopped.") ; } private synchronized boolean isStopped() { return this.isStopped; } public synchronized void stop(){ this.isStopped = true; try { this.serverSocket.close(); } catch (IOException e) { throw new RuntimeException("Error closing server", e); } } private void openServerSocket() { try { this.serverSocket = new ServerSocket(this.serverPort); } catch (IOException e) { throw new RuntimeException("Cannot open port 8080", e); } } } 

Dispatch.java

package servers; 

public class Dispatch { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    MultiThreadedServer server = new MultiThreadedServer(9000); 
    new Thread(server).start(); 

    try { 
     Thread.sleep(20 * 1000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    System.out.println("Stopping Server"); 
    server.stop(); 

} 

} 

答えて

2

これまでのところうまくやっています。

一度に1行ずつ、InputStream(BufferedReaderが役に立ちます)のデータを読み込みます。 HTTPプロトコル(「メッセージのリクエスト」セクション:http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocolを参照)を読んで理解してください。

クライアントが送信する最初の行は、GET /foo.html?x=y&a=b HTTP/1.1の後に\ n \ n、それにメソッド、URL(クエリパラメータ付き)、プロトコルが続きます。その行を(スペース上で)分割してから、スペックに従ってURLを分割します。

必要なものはすべて、データを解析するためのStringクラスにあります。

-2

いえば技術的には、することができますが、それは自分でhttpプロトコルを実装してあなたを残します。

もっと良い選択肢は、OracleのJava Httpサーバーを使用することです。ヒントについては、次の記事を参照してください。http://alistairisrael.wordpress.com/2009/09/02/functional-http-testing-with-sun-java-6-httpserver/

+0

私は上記のコードを使用して、学校でプロジェクト用のサーバーを実行しています。私はJavaのネットワークプログラミングに精通していません。私はURLの引数を解析したい。 – BillPull

+1

これは実際の回答ですか?いいえ、それはなぜ「答え」と言うのでしょうか? – Whymarrh

+0

@Whymarrh私は質問自体についてのコメントを介して質問することができないので、質問する以外の選択肢はありません。投票結果ありがとうございました。 –

0

あなたはクライアントが何を送るのを忘れてしまったのですか? httpでは、クライアントは接続を開き、要求を送信してサーバーが応答するのを待機します。

リクエストを読むには2つの方法があります。 BufferedReaderを使用するか、バイト単位で読み取ります。 BufferedReaderは簡単です。

すべてのバイトを読むのが少し速くなりますが、大量のリクエストを処理する必要がある場合にのみ関連性があります秒。それは実際に違いを生むことができます。

は、私はあなたのWorkerRunnable.javaで読み取ることが必要な部分が含まれている);私はちょうどあなたが知っているだけのように、この情報を置きます。 これは読み込み、全クライアント要求を出力します。

、サーバーを起動し、ブラウザや種類を開く

http://127.0.0.1:9000/hello?one=1&two=2&three=3 コンソール上の最初の行が読み取られます:1 = 1 & 2 = 2 & 3 = 3 HTTP/1ハロー/ GET?。1

OutputStreamを閉じる前に、必ずflush()メソッドを呼び出してください。これにより、バッファされたバイトが強制的に書き出されます。あなたがそれをしないと、いくつかのバイト/文字が欠落しているかもしれないし、あなたはエラーを探して長い時間を費やしているかもしれません。

try { 
    InputStream input = clientSocket.getInputStream(); 

    // Reading line by line with a BufferedReader 
    java.io.BufferedReader in = new java.io.BufferedReader(
     new java.io.InputStreamReader(input)); 
    String line; 
    while (!(line=in.readLine()).equals("")){ 
     System.out.println(line); 
    } 

    OutputStream output = clientSocket.getOutputStream(); 
    long time = System.currentTimeMillis(); 
    output.write(("HTTP/1.1 200 OK\n\nWorkerRunnable: " + 
      this.serverText + " - " + 
      time + 
      "").getBytes()); 
    output.flush(); 
    //Flushes this output stream and forces any buffered output bytes to be written out. 
    output.close(); 
    input.close(); 
    System.out.println("Request processed: " + time); 

あなたが行っていることは正確にはわかりません。あなたはURLを解析する必要があると言いましたが、simpleframework(http://www.simpleframework.org)を使う方が良いかもしれません。 組み込みHTTPサーバのようなものです。チュートリアルを見ることができます。リクエストオブジェクトを提供し、そこから簡単にURLのパラメータを取得できます。

関連する問題