如何通过 Java 中的套接字编程将发布数据(包含 2 个参数)发送到 https 服务器
Posted
技术标签:
【中文标题】如何通过 Java 中的套接字编程将发布数据(包含 2 个参数)发送到 https 服务器【英文标题】:How to send post data (that contains 2 parameters) to https server via Socket Programming in Java 【发布时间】:2014-07-10 04:19:09 【问题描述】:我在网上看到一个表格,如果我给出代码(R),车号,它会给出一些信息,现在我想通过套接字编程获取该信息。我已经编写了代码但是它挂了
网址:https://aptransport.in/CFSTONLINE/Reports/VehicleRegistrationSearch.aspx
import java.net.*;
import java.io.*;
import java.security.*;
import javax.net.ssl.*;
public class TestAP
public static void main(String[] args)
int port = 443; // default https port
try
URL url = new URL("https://aptransport.in/CFSTONLINE/Reports/VehicleRegistrationSearch.aspx");
String path=url.getFile();
// int port = url.getPort();
String host = url.getHost();
System.out.println("Step 0 : Connecting to Server");
Socket cliSocket = new Socket(host,port);
System.out.println("Step 1 : Connection Established ");
System.out.println("Step 2 : Creating Request");
String data1 = URLEncoder.encode("ctl00$OnlineContent$ddlInput", "UTF-8") + "=" + URLEncoder.encode("R", "UTF-8") +"&"+URLEncoder.encode("ctl00$OnlineContent$txtInput", "UTF-8") + "=" + URLEncoder.encode("AP31BF2942", "UTF-8");
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(cliSocket.getOutputStream()));
bw.write("POST " + path + " HTTPS/1.0\r\n");
bw.write("Host: " + host + "\r\n");
bw.write("Content-Length: " + data1.length() + "\r\n");
bw.write("Pragma: cache\r\n");
bw.write("Cache-Control: private, must-revalidate\r\n");
bw.write("Content-Type: application/x-www-form-urlencoded\r\n");
bw.write("\r\n");
bw.write(data1);
bw.flush();
System.out.println("Step 3 : Request Sent ");
BufferedReader rd = new BufferedReader(new InputStreamReader(cliSocket.getInputStream()));
String line;
System.out.println("Step 4 : Getting Input Stream");
StringBuffer serverData = new StringBuffer("");
while ((line = rd.readLine()) != null)
serverData.append(line);
System.out.println(" \r\n \r\n ******* Data From Server Start : ******* \r\n \r\n \r\n"+serverData+" \r\n \r\n ******* Data From Server End ********* \r\n \r\n ");
String data = serverData.toString();
bw.close();
rd.close();
catch(java.net.UnknownHostException uh)
System.out.println("UH : Host Not Found ");
catch(IOException ioe)
System.out.println("IO Exp "+ioe.getMessage());
catch(Exception e)
System.out.println("Exp "+e.getMessage());
IO Exp Connection reset java.net.SocketException: Connection reset at java.net.SocketInputStream.read(SocketInputStream.java:189) at java.net.SocketInputStream.read(SocketInputStream.java:121) 在 sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283) 在 sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325) 在 sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177) 在 java.io.InputStreamReader.read(InputStreamReader.java:184) 在 java.io.BufferedReader.fill(BufferedReader.java:154) 在 java.io.BufferedReader.readLine(BufferedReader.java:317) 在 java.io.BufferedReader.readLine(BufferedReader.java:382) 在 TestAP.main(TestAP.java:59)
【问题讨论】:
它会抛出异常吗?如果是这样的话;你得到什么信息?你说,“它挂了” 如果你通过 Fiddler 检查请求,你会看到什么? 直到 System.out.println("第 4 步:获取输入流");它被执行了,然后我得到了 IOException 告诉我们更多。取出catch(IOException ioe)
行和catch(Exception e)
行,让该异常被抛出,然后向我们展示它的堆栈跟踪。您需要我们的帮助,但您提供的信息不足以让我们帮助您。
在发送任何 HTTP 消息之前,您应该处理 SSL 握手,因为您正在连接到安全端口并且服务器期望该协商。
您是否有充分的理由需要套接字 API 而不是 HttpsUrlConnection?使用套接字,您几乎需要实现整个 HTTPS 协议(握手等),这比普通的 HTTP 复杂得多。
【参考方案1】:
这里最好的办法是使用HttpsURLConnection
,它将为您处理大部分协议细节。如果你真的想使用套接字,使用SSLSocket
而不是普通的Socket
至少可以处理协议的 SSL/TLS 部分。
这里是这两个类的 Javadoc 的链接。您还需要了解一些相关的类,但这将帮助您入门。
用于 HttpURLConnection 的 Javadoc:http://docs.oracle.com/javase/7/docs/api/javax/net/ssl/HttpsURLConnection.html
SSLSocket 的 Javadoc:http://docs.oracle.com/javase/7/docs/api/javax/net/ssl/SSLSocket.html
【讨论】:
以上是关于如何通过 Java 中的套接字编程将发布数据(包含 2 个参数)发送到 https 服务器的主要内容,如果未能解决你的问题,请参考以下文章