我的程序在下面,用户输入目标网址然后模拟HTTP格式进行发送,但老是收不到数据,不知道是怎么回事,哪位指点一下,谢谢:import java.net.URL;
import java.net.MalformedURLException;
import java.net.Socket;
import java.net.InetAddress;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.DataOutputStream;public class GetWeb {

private URL target; //目标网址
private String inputurl;
private String sendMessage;
private String receiveMessage;
private Socket client;
private DataOutputStream dos;
private BufferedReader read;

public GetWeb (String inputurl) {
this.inputurl = inputurl;
try {
setURL();
} catch (MalformedURLException e) {
System.out.println(e.getMessage());
}
}

//将用户输入的字符串网址转化成URL对象
private void setURL () throws MalformedURLException {

if (inputurl.startsWith("www.")) {
inputurl = "http://" + inputurl;
}
if (inputurl.substring(5, inputurl.length()).indexOf(":") == -1) {
inputurl += ":80";
}
int i = inputurl.indexOf(":");
target = new URL(inputurl);

}

//得到访问协议
public String getProtocol () {
return target.getProtocol();
}

//得到目标网址的主机名
public String getHost () {
return target.getHost();
}

//得到目标网址端口
public int getPort () {
return target.getPort();
}

//得到目标网址文件路径
public String getPath () {
return target.getPath();
}

//与目标网址建立Socket通信及输入输出流
public void getConnect () throws Exception {
try {
client = new Socket(InetAddress.getByName(getHost()), getPort());
dos = new DataOutputStream(client.getOutputStream());
read = new BufferedReader(new InputStreamReader(client.getInputStream()));
} catch (Exception e) {
System.out.println(e.getMessage());
System.out.println("Good Luck");
}
}

//发送HTTP请求
public void sendMessage () {
try {
sendMessage = "GET :" + getProtocol() + getHost() + getPort() + " HTTP/1.1\r\n";
sendMessage += "HOST: " + getHost() + "\r\n";
sendMessage += "Connection: close\r\n";
sendMessage += "User-agent: IE6.0\r\n Accept-language: zh-cn\r\n";
sendMessage += "Accept: www/source; text/html; image/gif; */*\r\n";
dos.writeBytes(sendMessage);
dos.flush();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}

//接收HTTP响应
public void receiveMessage () {
try {
receiveMessage = read.readLine();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}

//主函数
public static void main(String[] args) {

String inputurl = null;

try {

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
inputurl = br.readLine();
GetWeb gw = new GetWeb(inputurl);
gw.getConnect();
gw.sendMessage();
gw.receiveMessage();


} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
}

解决方案 »

  1.   

    不是,是模拟客户端用socket发出http请求,不知道为什么收不到响应
      

  2.   

    (1)最后一个 header 之后要 2 个换行(\r\n\r\n),表示 http 请求的结束。否则服务器不知道后边还有没有数据。(2)并且,GET 之后没有冒号(3)你写的 GET 之后的内容是不对的,应该是 getPath()sendMessage  = "GET " + getPath() + " HTTP/1.1\r\n";
    sendMessage += "HOST: " + getHost() + "\r\n";
    sendMessage += "Connection: close\r\n";
    sendMessage += "User-agent: IE6.0\r\n Accept-language: zh-cn\r\n";
    sendMessage += "Accept: www/source; text/html; image/gif; */*\r\n";// 最后再换一次行,表示结束
    sendMessage += "\r\n"
      

  3.   

    sswater(光杆兵) 我照你说的那样改了,现在倒是能收到数据,不过提示400错误,说是我HTTP请求中的一些信息不对,我检查了一下,没发觉有哪些不对,能否帮忙看一下,谢谢我输入的网址是www.sohu.com , www.scu.edu.cn  是一样的错误
      

  4.   

    下载安装ieHTTPHeaders,可以在ie里面抓包。
      

  5.   

    我用 telnet 工具:C:>telnet www.sohu.com 80然后输入:(或者在记事本中输入,复制到剪贴板再在 telnet 中粘贴)
    GET / HTTP/1.1
    Host: www.sohu.com(两次回车 - 表示结束)
    就可以得到 www.sohu.com 首页的内容。
      

  6.   

    搞定了,原因是我在GET方法后把'/' 写成了‘\’谢谢大家