使用Java套接字发送经过身份验证的html连接请求?

使用Java套接字发送经过身份验证的html连接请求?,java,sockets,http,proxy,protocols,Java,Sockets,Http,Proxy,Protocols,我的目标是形成一个到服务器的Java套接字连接,但是有一个HTTP代理站在路上 经过多次测试,我得出结论 System.setProperty(http.proxyHost,"10.126.16.14"); System.setProperty(http.proxyPort,"8080"); System.setProperty(http.proxyUser,"username"); System.setProperty(http.proxyPass,"password"); 不会通过代理影响

我的目标是形成一个到服务器的Java套接字连接,但是有一个HTTP代理站在路上

经过多次测试,我得出结论

System.setProperty(http.proxyHost,"10.126.16.14");
System.setProperty(http.proxyPort,"8080");
System.setProperty(http.proxyUser,"username");
System.setProperty(http.proxyPass,"password");
不会通过代理影响套接字连接,也不会

Socket socket=new Socket(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("10.126.16.14",8080)));
socket.connect("minds1.no-ip.org",12345);
由于JVM中的错误。叹息

因此,我的任务是使用Java套接字实现HTTP连接方法请求。 在修改了一些从internet上下载的代码后(很抱歉,我找不到源代码!),我现在有了以下方法:

private static Socket createSocket(String address,int port,String proxHost,int proxPort, String proxUser,String proxPass) throws Exception
{
    Socket socket=null;
        socket = new Socket(proxHost, proxPort); //First step is to connect the socket to the proxy server itself.

        String proxRequest="CONNECT "+address+":"+port; //Next step is to send a formatted CONNECT request, including authentication if applicable
        if(proxUser!=null&&proxPass!=null)
            proxRequest=proxRequest+" HTTP/1.0\nProxy-Authorization: Basic "+toBase64String(proxUser+":"+proxPass)+"=";
        proxRequest=proxRequest+"\n\n";
        socket.getOutputStream().write(proxRequest.getBytes());

        byte[] tmpBuffer = new byte[512]; //Next we read the proxy server's response to see if the request got through.
        InputStream in = socket.getInputStream();
        int len = in.read(tmpBuffer, 0, tmpBuffer.length);
        if (len == 0) throw new SocketException("Invalid response from proxy");
        String proxResponse = new String(tmpBuffer, 0, len, "UTF-8");
        if (proxResponse.indexOf("200") != -1) //Proxy server has responded that the connection is successful!
        {
            if (in.available() > 0) in.skip(in.available()); //Cleanup input stream
            return socket; //Return the sucessfully-connected socket object
        }
        else throw new SocketException(proxResponse);
    return socket;
}
这是toBase64String方法:

public static char[] Base64CharSet="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();
public static String toBase64String(String original)
{
    byte[] buf=original.getBytes();
    int size = buf.length;
    char[] ar = new char[((size + 2) / 3) * 4];
    int a = 0;
    int i = 0;
    while (i < size)
    {
        byte b0 = buf[i++];
        byte b1 = (i < size) ? buf[i++] : 0;
        byte b2 = (i < size) ? buf[i++] : 0;
        int mask = 0x3F;
        ar[a++] = Base64CharSet[(b0 >> 2) & mask];
        ar[a++] = Base64CharSet[((b0 << 4) | ((b1 & 0xFF) >> 4)) & mask];
        ar[a++] = Base64CharSet[((b1 << 2) | ((b2 & 0xFF) >> 6)) & mask];
        ar[a++] = Base64CharSet[b2 & mask];
    }
    switch (size % 3)
    {
        case 1: ar[--a] = '=';
        case 2: ar[--a] = '=';
    }
    return new String(ar);
}

因此,我的问题是,这个错误是什么意思,是否可以通过更改代码来解决问题,如果可以,如何解决?

这似乎非常清楚。你不能使用那个端口。注意:HTTP中的行终止符定义为
\r\n
,而不是
\n.
谢谢,但8080是代理服务器设置为运行的唯一端口-我不明白为什么不能使用它,当代码中显然没有试图建立安全或加密的连接时,为什么响应会谈论SSL。“Forefront TMG”是代理吗?无论如何,“它未配置为允许来自此端口的SSL请求”。是的,Forefront TMG是代理软件。但我并没有试图发出SSL请求,只是一个普通的请求。我能做到吗?
java.net.SocketException: HTTP/1.1 502 Proxy Error ( The specified Secure Socket
s Layer (SSL) port is not allowed. Forefront TMG is not configured to allow SSL
requests from this port. Most Web browsers use port 443 for SSL requests.  )
Via: 1.1 E291TMG1
Connection: close
Proxy-Connection: close
Pragma: no-cache
Cache-Control: no-cache
Content-Type: text/html
Content-Length: 780