日期:2014-05-20  浏览次数:20576 次

一个关于socket接收post数据的问题
写了一个MyServer模拟http server 接收post请求。
java代码:
Java code

package socket;

import java.io.*;
import java.net.*;

public class MyServer {
 public static void main(String args[]) throws Exception{
  ServerSocket serverSocket = new ServerSocket(8080);
  System.out.println("server is ok.");
  while(true){
   Socket socket = serverSocket.accept();
   BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
   String line = in.readLine();
   while(line!=null){
    System.out.println("Client: " + line);
    line = in.readLine();
   }
   System.out.println("current user close the session.");
   in.close();
   socket.close();
  }
 }
}



用浏览器打开下面的html文件,并提交数据:
HTML code

<head> 
<title>test my server</title> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
</head> 
<body> 
<p>upload</p> 
<form name="UploadForm" method="post" action="http://localhost:8080/1.jsp">
<input type="text" name="myname" /><br>
<select name="myage">
  <option value="18">18</option>
  <option value="20">20</option>
  <option value="22">22</option>
</select><br>
<input type="submit"value="Sutmit">
</form>
</body> 
</html>


MyServer打印出来的数据开始还正常:
server is ok.
Client: POST /testupload.jsp HTTP/1.1
Client: Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Client: Referer: http://localhost:8080/post.html
Client: Accept-Language: zh-cn
Client: User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)
Client: Content-Type: application/x-www-form-urlencoded
Client: Accept-Encoding: gzip, deflate
Client: Host: localhost:8080
Client: Content-Length: 28
Client: Connection: Keep-Alive
Client: Cache-Control: no-cache
Client:
走到这里的时候, 按http协议,接下来浏览器该传送post的数据了,但是程序走到这里就不走了。当我按esc之后,post数据才被提交上去
Client: myname=wwwwwwwwwwww&myage=18
current user close the session.

很奇怪!
高手出来!

------解决方案--------------------
有两个问题:

1、因为你是readLine,最后的数据并没有回车换行,所以readLine就一直悬停了,你可以改成read(char[])这个方法试试,就能读到数据
2、你在读到数据后,应该向客户端发出应答,否则客户端不会关闭Socket(除非超时,可能很长),这样你的程序还是会挂在那里不退出。
------解决方案--------------------
并不奇怪,
readline要到文本行结尾才返回,
但post提交的数据通过http消息体发送,末尾不必加换车符,
所以此时readline就卡在那里了。

空行是http头和消息体的分隔,
可以在读到空行后,退出循环,转而用普通的读字符方式处理。

------解决方案--------------------
学习了
------解决方案--------------------
为什么不用 httpClient 呢? 已经封装好了的..
------解决方案--------------------
我晕,这都开始给学生讲课了啊,呵呵!
对于原始数据的Socket发送,一定不要用readLine,否则以后会出现很多编码字符上的误解!
------解决方案--------------------
引用楼主 sunxing007 的帖子:
写了一个MyServer模拟http server 接收post请求。
java代码:

Java code
package socket;

import java.io.*;
import java.net.*;

public class MyServer {
public static void main(String args[]) throws Exception{
ServerSocket serverSocket = new ServerSocket(8080);