2012-04-04 5 views
0

Wie kann ich URL-Abfragen mit einem System wie diesem analysieren.URL Parsing mit Java-Server mit Runnable-Klasse

Zum Beispiel so etwas wie diese URL-Argumente in Variablen.

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

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

Ich habe diese Dateien

WorkerRunnable.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(); 
    } 
    } 
} 

MultiThreadedServer.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(); 

} 

} 

Antwort

2

Sie sind soweit gut.

Lesen Sie die Daten aus dem InputStream (BufferedReader könnte helfen) Zeile für Zeile. Lesen und lernen Sie das HTTP-Protokoll (siehe Abschnitt Nachrichten anfordern hier: http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol).

Die erste Zeile, die der Client sendet, folgt diesem Format: GET /foo.html?x=y&a=b HTTP/1.1 gefolgt von \ n \ n das ist die Methode, URL (mit Abfrageparametern) und Protokoll. Teilen Sie diese Zeile (auf den Leerzeichen ...) und brechen Sie dann die URL gemäß den Spezifikationen auf.

Alles, was Sie brauchen, finden Sie in der String-Klasse zum Parsen der Daten.

-2

Technisch gesehen, können Sie, aber es würde Sie mit der Implementierung des HTTP-Protokolls auf eigene Faust verlassen.

Eine viel bessere Option wäre die Verwendung des Java HTTP Servers von Oracle. Siehe den folgenden Artikel für Tipps http://alistairisrael.wordpress.com/2009/09/02/functional-http-testing-with-sun-java-6-httpserver/

+0

Ich benutze den obigen Code, um einen Server für ein Projekt in der Schule zu betreiben Ich bin nicht vertraut mit Netzwerk-Programmierung in Java. Ich möchte URL-Argumente analysieren. – BillPull

+1

Ist das eine tatsächliche Antwort? Nein, warum sagt es dann "Antwort"? – Whymarrh

+0

@Whymarrh, da ich keine Fragen durch Kommentare zu der Frage selbst stellen kann, lässt es mir keine andere Wahl, als in einer Frage zu fragen. Danke für die Abstimmung. –

0

Sie haben vergessen zu lesen, was die Clients senden. In http öffnet der Client die Verbindung und sendet die Anfrage und wartet auf die Antwort des Servers.

Um die Anfrage zu lesen, haben Sie zwei Möglichkeiten. Verwenden Sie einen BufferedReader oder lesen Sie Byte für Byte. Der BufferedReader ist einfacher. Sie erhalten eine Zeichenfolge für jede Zeile und können sie einfach teilen oder Zeichen ersetzen, oder was auch immer;)

Lesen jedes Byte ist ein wenig schneller, aber es wird nur relevant sein, wenn Sie eine große Menge an Anfrage pro liefern müssen Sekunden. Dann kann das wirklich etwas bewirken. Ich lege diese Informationen nur, damit Sie wissen;)

Ich habe den notwendigen Teil zum Lesen in Ihre WorkerRunnable.java enthalten. Dies liest und druckt die gesamte Client-Anfrage aus.

dem Server starten, öffnen Sie Ihren Browser und geben Sie: http://127.0.0.1:9000/hello?one=1&two=2&three=3 Die erste Zeile auf der Konsole erscheint: GET/hallo one = 1 & zwei = 2 & drei = 3 HTTP/1?.1

Bevor Sie einen OutputStream schließen, müssen Sie die flush() -Methode aufrufen. Dadurch werden alle gepufferten Bytes zum Schreiben gezwungen. Wenn Sie es nicht tun, dann fehlen möglicherweise einige Bytes/Zeichen und Sie werden möglicherweise lange nach dem Fehler suchen.

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); 

Ich weiß nicht genau, was Sie dort tun. Sie haben uns gerade gesagt, dass Sie die URL analysieren müssen, aber ein besserer Weg ist die Verwendung des SimpleFrameworks (http://www.simpleframework.org) Es ist wie bei einem eingebetteten HTTP-Server, Sie können sich das Tutorial ansehen. Es wird Ihnen ein Anfrageobjekt geben, von dort können Sie einfach die Parameter in der URL abrufen.