0

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

运行代码时出现以下错误,但不确定是什么原因造成的:

-1 线程“main”中的异常 java.lang.IllegalArgumentException:端口超出范围:-1 at java.net.InetSocketAddress.(InetSocketAddress.java:118) at java.net.Socket.(Socket.java:189) at com.example.bookstore.MyHttpClient.execute(MyHttpClient.java:18) 在 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);
    }
}

}

我的HttpRequest

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

}

我的HttpResponse

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

}

任何想法可能会发生什么?提前谢谢了。

4

4 回答 4

4

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

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

int port = request.getPort();
if(port<=0) port=80;
于 2013-01-28T13:25:35.123 回答
1

由于 URI 中没有设置端口,因此从端口返回 javadocs -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
于 2013-01-28T13:27:26.430 回答
0

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

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

等等

于 2013-01-28T13:26:01.093 回答
-1

采用

    uri = URIUtil.encodeQuery(urlString)

反而

    uri = new URI(urlString); 
于 2013-01-28T13:26:40.350 回答