SOCKET发送HTTP请求,Servlet处理的问题

wudeaaa 2010-11-02 10:00:17
客户端用socket连接web服务器发送HTTP请求,访问一个Servlet /service .并接收servlet的相应数据
我的客户端可以连接上服务端,但是发送的消息Servlet接收不到,Servlet发送回的消息客户端也接收不到。
客户端:

public class Client {
public static void main(String[] arg) {
Socket socket;
try {
socket = new Socket("10.20.64.203", 7001);
OutputStream os = socket.getOutputStream();
InputStream ins = socket.getInputStream();
String data= getXmlString();
StringBuffer sb = new StringBuffer();
sb.append("POST /service HTTP/1.1\r\n");// 注意\r\n为回车换行
sb.append("Accept-Language: zh-cn\r\n");
sb.append("Connection: Keep-Alive\r\n");
sb.append("Host:localhost\r\n");
sb.append("Content-Length:11\r\n");
sb.append("\r\n");
sb.append("data=abc\r\n");
sb.append("\r\n");


// 接收Web服务器返回HTTP响应包
os.write(sb.toString().getBytes());
os.flush();
byte[] b = new byte[1000];
ins.read(b); //读取http头
InputStreamReader ireader = new InputStreamReader(ins);
java.io.BufferedReader reader = new java.io.BufferedReader(ireader);
String s = null;//读取内容
System.out.println( "response:");
while(( s= reader.readLine())!= null){//读取不到内容?
System.out.println(s);
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

Servlet

public class ProcessServlet extends HttpServlet {
private static final long serialVersionUID = 1L;


public ProcessServlet() {
super();

}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("receive Request message*******************:");
PrintWriter out = response.getWriter();
response.setContentType("text/html;charset=utf-8");
out.println("<html>");
out.println("<head><title>First servlet</title></head>");
out.println("<body>");
out.println("welcome use selevet");
out.println("</body>");
out.println("</html>");

BufferedReader reader = request.getReader();
String msg = null;
while ((msg = reader.readLine()) != null) {
System.out.println("receive Request message:" + msg);

String send = "HTTP/1.1 200 OK\r\n" + "Filename: " + "\r\n"
+ "Content_length: " + "\r\n";
out.println(send);
out.flush();
}
out.flush();
out.close();

}


protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}

}

...全文
623 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuyu10FG 2012-09-11
  • 打赏
  • 举报
回复
不用注明是哪个servlet,tomcat怎么知道跟哪个servlet通信呢??
zhangliang_88 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bao110908 的回复:]
玩玩的话,你可以这么做,如果是正式项目的话,用 HTTP 客户端 API 吧,强烈不建议自己用 Socket 实现!
[/Quote]
学习了
  • 打赏
  • 举报
回复
玩玩的话,你可以这么做,如果是正式项目的话,用 HTTP 客户端 API 吧,强烈不建议自己用 Socket 实现!
wudeaaa 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 madfatso 的回复:]
Socket socket;
try {
String data = URLEncoder.encode("k", "UTF-8") + "=" +
URLEncoder.encode("abc", "UTF-8");
InetAddress addr = InetAddress.getByName("10.20.64.203");
socket = new Socket(addr……
[/Quote]太感谢了,客户端可以接收到服务端的消息了,为啥我那样做不行?
还有,servlet端 while ((msg = reader.readLine()) != null) 这里msg一直都为null,为什么没有
接收到客户端发的消息?
madFatso 2010-11-02
  • 打赏
  • 举报
回复
Socket socket;
try {
String data = URLEncoder.encode("k", "UTF-8") + "=" +
URLEncoder.encode("abc", "UTF-8");
InetAddress addr = InetAddress.getByName("10.20.64.203");
socket = new Socket(addr,7001);
BufferedWriter wr = new BufferedWriter(new
OutputStreamWriter(socket.getOutputStream(), "UTF8"));
InputStream ins = socket.getInputStream();
StringBuffer sb = new StringBuffer();
sb.append("POST /service HTTP/1.1\r\n");// 注意\r\n为回车换行
sb.append("Accept-Language: zh-cn\r\n");
sb.append("Connection: Keep-Alive\r\n");
sb.append("Host:localhost\r\n");
sb.append("Content-Length:11\r\n");
sb.append("Content-Type: application/x-www-form-urlencoded\r\n");
sb.append("\r\n");
sb.append(data);
// 接收Web服务器返回HTTP响应包
wr.write(sb.toString());
wr.flush();
BufferedReader rd = new BufferedReader(new
InputStreamReader(socket.getInputStream()));
String line;
while ((line = rd.readLine()) != null) {
System.out.println(line);
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
wudeaaa 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 stl0 的回复:]
socket发送时,不需要指定通信地址么
比如http://192.168.2.213/项目名/servlet名
[/Quote]我试了一下,项目名是TestProject

sb.append("GET /TestProject/ProcessServlet HTTP/1.1\r\n ")
运行客户端的时候,服务端没有输出
System.out.println("receive Request message*******************:");
相当于没有触发DoGet
stl0 2010-11-02
  • 打赏
  • 举报
回复
socket发送时,不需要指定通信地址么
比如http://192.168.2.213/项目名/servlet名
wudeaaa 2010-11-02
  • 打赏
  • 举报
回复
大牛们帮帮忙
wudeaaa 2010-11-02
  • 打赏
  • 举报
回复
补充一下,servlet是部署在tomcat下的。
  • 打赏
  • 举报
回复
现在没有客户端是不支持 HTTP 的 API,而要用 Socket 来实现的!
Asdcer 2010-11-02
  • 打赏
  • 举报
回复
Content-Length:11设置的有问题,应该是参数的长度
wudeaaa 2010-11-02
  • 打赏
  • 举报
回复
大牛们帮忙啊
wudeaaa 2010-11-02
  • 打赏
  • 举报
回复
如果客户端发送的是

POST /counter.jsp HTTP/1.1
content-type: application/x-www-form-urlencoded
host: localhost:8080
content-length: 43

name=zhangsan&password=123
Servlet端如何获得name和password的值?
wudeaaa 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 mytel_789 的回复:]
是不是 需要用 URLConnection对象啊
[/Quote]不需要啊
ansensp 2010-11-02
  • 打赏
  • 举报
回复
是不是 需要用 URLConnection对象啊
wudeaaa 2010-11-02
  • 打赏
  • 举报
回复
比如客户端POST方式,传输参数
Data=abc&id=12324124
在servlet端如何获取得到Data和id的值?使用request.getParameter("Data");也不行。
wudeaaa 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bao110908 的回复:]
玩玩的话,你可以这么做,如果是正式项目的话,用 HTTP 客户端 API 吧,强烈不建议自己用 Socket 实现!
[/Quote]因为客户端多样化,不一定是java版的,所以统一使用socket实现。帮忙看一下
servlet端 while ((msg = reader.readLine()) != null) 这里msg一直都为null,为什么没有
接收到客户端发的消息?

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧