HTTP 客户端无法正常工作



我正在尝试构建一个简单的HTTP客户端程序,该程序将请求发送到Web服务器并将响应打印给用户。

我在运行代码时遇到以下错误,但不确定是什么原因造成的:

-1线程"main"中的异常 java.lang.IllegalArgumentException: 端口超出范围:-1 at java.net.InetSocketAddress.(InetSocket地址.java:118) 在java.net.Socket。(插座.java:189) at com.example.bookstore.MyHttpClient.execute(MyHttpClient.java:18) at com.example.bookstore.MyHttpClientApp.main(MyHttpClientApp.java:29)Java 结果:1

下面是我的MyHttpClient.java类

public class MyHttpClient {
MyHttpRequest request;
public MyHttpResponse execute(MyHttpRequest request) throws IOException {
    this.request = request;
    int port = request.getPort();
    System.out.println(port);
    //Create a socket
    Socket s = new Socket(request.getHost(), request.getPort());
    //Create I/O streams
    BufferedReader inFromServer = new BufferedReader(new InputStreamReader(s.getInputStream()));
    PrintWriter outToServer = new PrintWriter(s.getOutputStream());
    //Get method (POST OR GET) from request
    String method = request.getMethod();
     //Create response
     MyHttpResponse response = new MyHttpResponse();
    //GET Request
    if(method.equalsIgnoreCase("GET")){
        //Construct request line
        String path = request.getPath();
        String queryString = request.getQueryString();
        //Send request line to server
        outToServer.println("GET " + path + " HTTP/1.0");
        //=================================================\
        //HTTP RESPONSE
        //RESPONSE LINE
        //Read response from server
        String line = inFromServer.readLine();
        //Get response code - should be 200.
        int status = Integer.parseInt(line.substring(9, 3));
        //Get text description of response code - if 200 should be OK.
        String desc = line.substring(13);
        //HEADER LINES
        //Loop through headers until get to blank line...
        //Header name: Header Value - structure
        do{
            line = inFromServer.readLine();
            if(line != null && line.length() == 0){
                //line is not blank
                //header name start of line to the colon.
                String name = line.substring(0, line.indexOf(": "));
                //header value after the colon to end of line.
                String value = String.valueOf(line.indexOf(": "));
                response.addHeader(name, value);
            }
        }while(line != null && line.length() == 0);

        //MESSAGE BODY
        StringBuilder sb = new StringBuilder();
        do{
            line = inFromServer.readLine();
            if(line != null){
                sb.append((line)+"n");
            }
        }while(line != null);
        String body = sb.toString();
        response.setBody(body);
        //return response
        return response;
    }
    //POST Request
    else if(method.equalsIgnoreCase("POST")){
        return response;
    }
    return response;
}

}

这是MyHttpClientApp.java类

public class MyHttpClientApp {
public static void main(String[] args) {
    String urlString = null;
    URI uri;
    MyHttpClient client;
    MyHttpRequest request;
    MyHttpResponse response;
    try {
        //==================================================================
        // send GET request and print response
        //==================================================================
        urlString = "http://127.0.0.1/bookstore/viewBooks.php";
        uri = new URI(urlString);
        client = new MyHttpClient();

        request = new MyHttpRequest(uri);
        request.setMethod("GET");
        response = client.execute(request);
        System.out.println("=============================================");
        System.out.println(request);
        System.out.println("=============================================");
        System.out.println(response);
        System.out.println("=============================================");
}
    catch (URISyntaxException e) {
        String errorMessage = "Error parsing uri (" + urlString + "): " + e.getMessage();
        System.out.println("MyHttpClientApp: " + errorMessage);
    }
    catch (IOException e) {
        String errorMessage = "Error downloading book list: " + e.getMessage();
        System.out.println("MyHttpClientApp: " + errorMessage);
    }
}

}

MyHttpRequest

public class MyHttpRequest {
private URI uri;
private String method;
private Map<String, String> params;
public MyHttpRequest(URI uri) {
    this.uri = uri;
    this.method = null;
    this.params = new HashMap<String, String>();
}
public String getHost() {
    return this.uri.getHost();
}
public int getPort() {
 return this.uri.getPort();
}
public String getPath() {
    return this.uri.getPath();
}
public void addParameter(String name, String value) {
    try {
        name = URLEncoder.encode(name, "UTF-8");
        value = URLEncoder.encode(value, "UTF-8");
        this.params.put(name, value);
    }
    catch (UnsupportedEncodingException ex) {
        System.out.println("URL encoding error: " + ex.getMessage());
    }
}
public Map<String, String> getParameters() {
    return this.params;
}
public String getQueryString() {
    Map<String, String> parameters = this.getParameters();
    // construct StringBuffer with name/value pairs
    Set<String> names = parameters.keySet();
    StringBuilder sbuf = new StringBuilder();
    int i = 0;
    for (String name : names) {
        String value = parameters.get(name);
        if (i != 0) {
            sbuf.append("&");
        }
        sbuf.append(name);
        sbuf.append("=");
        sbuf.append(value);
        i++;
    }
    return sbuf.toString();
}
public String getMethod() {
    return method;
}
public void setMethod(String method) {
    this.method = method;
}
@Override
public String toString() {
    StringBuilder sbuf = new StringBuilder();
    sbuf.append(this.getMethod());
    sbuf.append(" ");
    sbuf.append(this.getPath());
    if (this.getMethod().equals("GET")) {
        if (this.getQueryString().length() > 0) {
            sbuf.append("?");
            sbuf.append(this.getQueryString());
        }
        sbuf.append("n");
        sbuf.append("n");
    }
    else if (this.getMethod().equals("POST")) {
        sbuf.append("n");
        sbuf.append("n");
        sbuf.append(this.getQueryString());
        sbuf.append("n");
    }
    return sbuf.toString();
}

}

MyHttpResponse

public class MyHttpResponse {
private int status;
private String description;
private Map<String, String> headers;
private String body;
public MyHttpResponse() {
    this.headers = new HashMap<String, String>();
}
public int getStatus() {
    return this.status;
}
public void setStatus(int status) {
    this.status = status;
}
public String getDescription() {
    return this.description;
}
public void setDescription(String description) {
    this.description = description;
}
public Map<String, String> getHeaders() {
    return this.headers;
}
public void addHeader(String header, String value) {
    headers.put(header, value);
}
public String getBody() {
    return body;
}
public void setBody(String is) {
    this.body = is;
}
@Override
public String toString() {
    StringBuilder sbuf = new StringBuilder();
    sbuf.append("Http Response status line: ");
    sbuf.append("n");
    sbuf.append(this.getStatus());
    sbuf.append(" ");
    sbuf.append(this.getDescription());
    sbuf.append("n");
    sbuf.append("---------------------------------------------");
    sbuf.append("n");
    sbuf.append("Http Response headers: ");
    sbuf.append("n");
    for (String key: this.getHeaders().keySet()) {
        String value = this.getHeaders().get(key);
        sbuf.append(key);
        sbuf.append(": ");
        sbuf.append(value);
        sbuf.append("n");
    }
    sbuf.append("---------------------------------------------");
    sbuf.append("n");
    sbuf.append("Http Response body: ");
    sbuf.append("n");
    sbuf.append(this.getBody());
    sbuf.append("n");
    return sbuf.toString();
}

}

知道会发生什么吗?提前非常感谢。

我想您的请求没有明确指定端口,因此您的request.getPort()返回-1。然后您尝试连接到端口 -1。这是非法的。

取而代之的是,在使用端口之前:检查它是否为 <= 0,在这种情况下使用 80 作为默认值。

int port = request.getPort();
if(port<=0) port=80;

由于 URI 中没有设置端口,从 javadocs 开始,从 port 返回 -1:

http://docs.oracle.com/javase/6/docs/api/java/net/URI.html#getPort()

The port component of this URI, or -1 if the port is undefined

这里有很多重新创建轮子的地方。 为什么不使用Java的内置HTTP客户端(至少;也有许多第三方HTTP客户端做得非常好)。

URL url = new URL("http://stackoverflow.com");
final HttpURLConnection connection = url.openConnection();
connection.setDoInput(true);
connection.connect();
int responseCode = connection.getResponseCode();

等。

使用

    uri = URIUtil.encodeQuery(urlString)

相反

    uri = new URI(urlString); 

相关内容

  • 没有找到相关文章

最新更新