如何通过 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 服务器的主要内容,如果未能解决你的问题,请参考以下文章

java中的socket编程是作啥的

Java网络编程:TCP的socket编程

Java网络编程:TCP的socket编程

套接字编程/通过无线发送二进制图像数据

如何使用套接字编程定义客户端服务器并将数据库传递给 C# 中的客户端

linux 中 C++ 中的 UDP Socket 编程