2016-10-06 7 views
1

私は自分のHTTPサーバーを作成しようとしています。
URLで呼び出され、コードにバインドするServerSocketまたはSocketクラスのメソッドとはどのようなものですか。ServerSocketクラスとSocketクラスを使用してブラウザから完全なURLパスを取得

たとえば、次のリンク<b>http://localhost:8080/coupon/add?name=coupon name</b>をブラウザに書き込むと、このリンクを自分のコードに挿入したいと考えています。

どうすればいいですか?

私の簡単なコード:

import java.io.IOException; 

import java.net.ServerSocket; 
import java.net.Socket; 


public class HTTPServer { 

    public static void main(String[] args) { 

     new HTTPServer().startServer(); 
    } 

    public void startServer() { 
     try (ServerSocket serverSocket = new ServerSocket(8080)) { 

      System.out.println("Server is started"); 
      while (true) { 
       Socket socket = serverSocket.accept(); 

      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

おかげ

+1

あなたは具体的でした/明確化 - (元のコメントで、あなたの状態&リストなど)リンクについてあなたのWebサーバでやろうとしていますか?私はあなたが最初からWebサービスを作成しようとしているのかどうか分からないので、私は尋ねます。また、あなたのURLにもサービスするクエリがあるように見えます - これも質問の一部ですか? –

+0

あなたが求めているのはhttp * client * not * server *です。おそらく、既存のクライアントを使用するべきです。 https://docs.oracle.com/javase/7/docs/api/java/net/HttpURLConnection.htmlまたはさらに必要な場合:https://hc.apache.org/httpcomponents-client-ga/あなた自身のHTTPクライアントを書くことから非常に長い道のりです。 – xaxxon

+0

リンク 'http:// localhost:8080/coupon/add?name = coupon name'は' https:// www.google.com'のような基本的なリンクですが、いくつかの送信パラメータがあります。パラメータを渡すことは問題ありません。私にとっては問題ありません – morris

答えて

1

あなたのすべてのコードが今TCPサーバーに設定されているん。

HTTPはLayer 7プロトコルです。

クライアントからの接続を受け入れると、そのTCPソケットを介した通信にHTTPを使用できます。

クライアントが送信するHTTPリクエストを解析する必要があります。そのリクエストからURLを知る必要があります。あなたのケースでは

、あなたが言った:

を、私は、ブラウザで

を次のリンクhttp://localhost:8080/coupon/add?name=coupon nameを書くお使いのブラウザは、次の例のようにHTTPリクエストを送信します:では

GET /coupon/add?name=coupon+name HTTP/1.0 
Host: localhost:8080 

を現実には、そこにはさらに多くのHTTPヘッダーがあり、末尾には\r\nがありますが、単純にしましょう。

メモスペースなどの特殊文字がURL-encodedであることはスペースもクエリ文字列に+としてエンコードされた - それは、クライアントに応じて、+または%20のいずれかである可能性があります。

このHTTPリクエストからどのようにURLを取得するのか、この説明から分かりやすいことをお勧めします。

実際のフルリンクから欠落している部分はhttp://部分のみです。 HTTPとHTTPSの区別は、HTTPプロトコルの一部ではなく、ソケットレイヤの上にありますが、HTTPプロトコルレイヤの下にあります。あなたがSSLソケットを持っていたなら、それはサーバー側で知っていて、それがhttphttpsかどうかにかかわらず、それがSSLソケットか "プレーン"ソケットかに基づいて判断します。

希望に役立ちます。

+0

詳細な回答ありがとうございます。しかし、まだブラウザからリンクやデータを取得するのに問題があります。はい、私はリクエストとレスポンスの方法について理解していますが、私はどのようにしてそれらから情報を得ることができるのか分かりません。 – morris

0

startServer情報の取得方法をテストするために改善されました。 私はどのブラウザからのURLに由来するデータも、JAVAのURIまたはURLクラスに含めようとしています。 これは不可能ですか?多分私はこれをどうやってできるのか分かっているのだろうか?

public void startServer() { 
    try (ServerSocket serverSocket = new ServerSocket(8080)) { 

     System.out.println("Server is started"); 
     while (true) { 

      Socket socket = serverSocket.accept(); 

      System.out.println("SERVER SOCKET TESTS:"); 
      System.out.println("getChannel: " + serverSocket.getChannel()); 
      System.out.println("getInetAddress: " + serverSocket.getInetAddress()); 
      System.out.println("getLocalPort: " + serverSocket.getLocalPort()); 
      System.out.println("getLocalSocketAddress: " + serverSocket.getLocalSocketAddress()); 

      System.out.println(); 

      System.out.println("CLIENT SOCKET TESTS:"); 
      System.out.println("getChannel: " + socket.getChannel()); 
      System.out.println("getLocalAddress: " + socket.getLocalAddress()); 
      System.out.println("getLocalPort: " + socket.getLocalPort()); 
      System.out.println("getLocalSocketAddress: " + socket.getLocalSocketAddress()); 
      System.out.println("getRemoteSocketAddress: " + socket.getRemoteSocketAddress()); 
      System.out.println("getInetAddress: " + socket.getInetAddress()); 
      System.out.println("getInputStream: " + socket.getInputStream()); 
      System.out.println("getOutputStream: " + socket.getOutputStream()); 

      System.out.println(); 

      System.out.println("URI - GET INFORMATION:"); 
      URI uri = new URI("httpscheme://world.hello.com/thismy?parameter=value"); 
      System.out.println(uri.getHost()); 
      System.out.println(uri.getPath()); 
      System.out.println(uri.getQuery()); 
      System.out.println(uri.getScheme()); 
     } 

    } catch (Exception e) { 
     System.out.println("error"); 
    } 
} 

少しテスト:

enter image description here

私は、コードを実行し、その後、ブラウザを開いて、私は例えば、私のブラウザで書く:http://localhost:8080私は情報を得るが、私は理解していません次のようになります。 getInetAddressメソッド(serverSocket.getInetAddress)のserverSocketオブジェクトにIP4があり、0.0.0.0(私のコンピュータで定義されている標準ローカルIPではないのはなぜですか)とオブジェクトがgetInetAddressメソッド)はIP6を持ち、それは0:0:0:0:0:0:0:1です。標準ホスト名を取得するにはどうすればいいですか?localhost URIクラスを取得する方法(リンクのデータを含む)?ポートが素敵ゲートされ

:8080

0

問題解決URLパスを取得するため。


package pk6HttpServer; 

import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.Reader; 
import java.net.MalformedURLException; 
import java.net.ServerSocket; 
import java.net.Socket; 

/** 
* Created by Morris on 08/10/16. 
*/ 
public class HTTPServer { 

    private static String headerData; 

    public static void main(String[] args) { 

     new HTTPServer().startServer(); 
    } 

    public void startServer() { 

     try (ServerSocket serverSocket = new ServerSocket(8080)) { 

      boolean isClosed = false; 

      System.out.println("Server is started"); 

      while (true) { 
       Socket socket = serverSocket.accept(); 

       try { 
        try (InputStream raw = socket.getInputStream()) { // ARM 

         System.out.println("=================BEFORE STARTING READING HEADER ======================="); 

         System.out.println("Collecting data to string array..."); 

         headerData = getHeaderToArray(raw); 
// 
         System.out.println("+++++++++++++++++ AFTER ENDING READING HEADER +++++++++++++++++++++++"); 
         System.out.println("Hello World"); 
        } 
       } catch (MalformedURLException ex) { 
        System.err.println(socket.getLocalAddress() + " is not a parseable URL"); 

       } catch (IOException ex) { 
        System.err.println(ex.getMessage()); 
       } 
      } 

     } catch (Exception ex) { 
      System.out.println("error# " + ex.getMessage()); 
     } 
    } 

    public static String getHeaderToArray(InputStream inputStream) { 

     String headerTempData = ""; 

     // chain the InputStream to a Reader 
     Reader reader = new InputStreamReader(inputStream); 
     try { 
      int c; 
      while ((c = reader.read()) != -1) { 
       System.out.print((char) c); 
       headerTempData += (char) c; 

       if (headerTempData.contains("\r\n\r\n")) 
        break; 
      } 
     } catch (IOException ex) { 
      System.err.println(ex.getMessage()); 
     } 
     headerData = headerTempData; 

     return headerTempData; 
    } 
} 
関連する問題