-1

Java サーブレットから HTTP リクエストを送信し、ServerSocket を使用して TCP ポートで受信する場合、HTTP リクエスト パラメータをどのように読み取るのでしょうか。誰でもこれについて私を助けてもらえますか?

以下は私のデザインです

サーブレット

HttpURLConnection を使用した GET/POST

    URL url = new URL("http://localhost:2309/");
    HttpURLConnection connection = (HttpURLConnection)url.openConnection();
    connection.setRequestProperty("Content-Type", "application/text");
    connection.setRequestProperty("Accept", "application/text");
    connection.setRequestMethod("POST");        
    connection.setRequestProperty("header1", "value1");

at localhost : 2309 ServerSocket を起動して、上記のサーブレットからのリクエストをリッスンしています。リクエストを読み取ろうとしていますが、HTTPヘッダーのみを読み取っていますが、リクエストパラメータが表示されません(上記の例では、パラメータを送信していないことがわかっています。接続の出力ストリームを取得して書き込むことでこれを試しましたそれ)。

これは、ServerSocket プログラムにリクエスト パラメータを送信しようとした方法です。

byte[] parameters = someString.getBytes();
        OutputStream outStream = connection.getOutputStream();
        outStream.write(parameters);

以下は私のServerSocketプログラムです。

public static void main(String... args) {
    int port = 2309;
    ServerSocket sSocket = new sSocket(port);
    System.out.println("### SERVER IS UP AND RUNNING, WAITING FOR A CLIENT TO CONNECT ON " + port + " ###");
    Socket cSocket = sSocket.accept();
    System.out.println("### CONNECTION WITH THE CLIENT CREATED ###");
    BufferedReader readRequest = new BufferedReader(new InputStreamReader(cSocket.getInputStream()));
    PrintWriter writeResponse = new PrintWriter(cSocket.getOutputStream());
    String line = "";
    while (readRequest != null  && (line = readRequest.readLine()) != null) {
        if (line.length() == 0)
            break;
        System.out.println(line);
    }
    writeResponse.write("HTTP/1.0 200 OK\r\n");
    writeResponse.write("Date: Fri, 31 Dec 1999 23:59:59 GMT\r\n");
    writeResponse.write("Server: Apache/0.8.4\r\n");
    writeResponse.write("Content-Type: text/html\r\n");
    writeResponse.write("Content-Length: 59\r\n");
    writeResponse.write("Expires: Sat, 01 Jan 2000 00:59:59 GMT\r\n");
    writeResponse.write("Last-modified: Fri, 09 Aug 1996 14:21:40 GMT\r\n");
    writeResponse.write("\r\n");
    writeResponse.write("<TITLE>Example</TITLE>");
    writeResponse.write("<P>This is an example</P>");
}

以下は、ServerSocket プログラムの OUTPUT に表示される内容です。

### SERVER IS UP AND RUNNING, WAITING FOR A CLIENT TO CONNECT ON 2309 ###
### CONNECTION WITH THE CLIENT CREATED ###
POST / HTTP/1.1
Content-Type: application/text
Accept: application/text
header1: value1
Cache-Control: no-cache
Pragma: no-cache
User-Agent: Java/1.7.0_75
Host: localhost:2309
Connection: keep-alive
### CONNECTION WITH THE CLIENT TERMINATED ###

誰でも私に提案できますか

  1. リクエストパラメータの読み方

  2. 接続オブジェクトの出力ストリームに書き込むと、その場所で要求パラメーターが取得されますか?

  3. スタンドアロン サーバーを維持したいだけの場合、これは良いアプローチでしょうか。これは、単一のポートに着信する要求をリッスンして処理するだけです [OR] これを実行するためのより良い方法はありますか?

4

2 に答える 2

0

HTTP ペイロードから本文を取得できませんでした。そして考えられる理由は一線以下でした。

BufferedReader readRequest = new BufferedReader(new InputStreamReader(cSocket.getInputStream()));

に変更しました

    public static void main(String... args) {
    int port = 2309;
    sSocket sSocket = new sSocket(port);
    System.out.println("### SERVER IS UP AND RUNNING, WAITING FOR A CLIENT TO CONNECT ON " + port + " ###");
    Socket cSocket = sSocket.accept();
    System.out.println("### CONNECTION WITH THE CLIENT CREATED ###");
    InputStream readRequest = cSocket.getInputStream();
    PrintWriter writeResponse = new PrintWriter(cSocket.getOutputStream());
    byte[] buf = new byte[4096];
    readRequest.read(buf);
    String httpPayload = new String(buf, "UTF-8");
    HttpPayload httpPayloadObject = new HttpPayload(httpPayload);
    Map<String, Object> httpParameters = httpPayloadObject.getHttpPayloadBodyMap();
    PushNotificationEvent event = new PushNotificationEvent(httpParameters);
    event.processEvent();
    writeResponse.write("HTTP/1.0 200 OK\r\n");
    writeResponse.write("Date: Fri, 31 Dec 1999 23:59:59 GMT\r\n");
    writeResponse.write("Server: Apache/0.8.4\r\n");
    writeResponse.write("Content-Type: text/html\r\n");
    writeResponse.write("Content-Length: 59\r\n");
    writeResponse.write("Expires: Sat, 01 Jan 2000 00:59:59 GMT\r\n");
    writeResponse.write("Last-modified: Fri, 09 Aug 1996 14:21:40 GMT\r\n");
    writeResponse.write("\r\n");
    writeResponse.write("<TITLE>Example</TITLE>");
    writeResponse.write("<P>This is an example</P>");
}

Buffered 入力ストリームは本体部分を省略しました。これで、必要に応じて出力が得られます

POST / HTTP/1.1
Host: 127.0.0.1:2309
Connection: keep-alive
Content-Length: 63
Origin: chrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo
header1: value1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW6**strong text**4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36
Content-Type: application/json
Accept: */*
Accept-Encoding: gzip, deflate
    en-US,en;q=0.8

{jsondata : {key1:value1_getting_bigger_content,  key2:value2}}

以前はペイロードに表示されていなかった部分は

{jsondata : {key1:value1_getting_bigger_content,  key2:value2}}

BufferedReader または BufferedInputStream が本文を省略した理由はまだわかりません

于 2015-02-18T21:04:11.317 に答える