2015-02-11 124 views
-1

如果我从Java Servlet发送HTTP请求并使用ServerSocket在TCP端口上接收它,我将如何读取HTTP请求参数。任何人都可以帮助我吗?使用Java ServerSocket读取TCP端口上的HTTP参数

下面是使用HttpURLConnection的

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

在本地主机我的设计

的Servlet

GET/POST:2309我有一个ServerSocket并侦听来自上面的servlet的请求。我试图读取请求,但我只读了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]有通过什么更好的方法 我可以执行此操作吗?

+0

您的代码不会出现您描述的问题,并且您完全省略了服务器端代码。请修复您的问题,以便可以回复。 – EJP 2015-02-11 04:01:21

+1

为什么不使用像Spring MVC或Jersey这样的预先包装的框架来完成所有这些工作? – chrylis 2015-02-11 04:16:52

+1

或者'Servlet?'不需要重新发明这个轮子。 – EJP 2015-02-11 05:41:25

回答

0

我无法从HTTP Payload获取正文。可能的原因在线以下。

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

缓冲的输入数据流中省略本体部分上。现在,我得到所期望

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忽略了身体

+0

它不是读者,它是你没有发布在这里的新代码。只是发布预期/正确的输出对任何人都没有任何实际用处。 – EJP 2015-02-18 21:43:14

+0

@EJP这里是完整的工作代码。 – hiren 2015-02-21 01:08:08

0

你忽略提供的内容长度并尝试读取直到流结束,因为客户端未关闭连接,因此他将尝试读取响应,所以永远不会到达。如果该标题存在,则当您在标题后面读取content-length个字节时,您需要停止阅读。

注意:如果您使用的是Reader,您应该使用在标头中发送的相同CharSet来构建它。