兩個java專案的服務端通訊之HttpURLConnection方式
阿新 • • 發佈:2019-01-26
如何你有兩個java專案的話,如何向他們之間進行資訊的通訊
前提:必須知道要通訊的java專案(接收請求方)的伺服器的IP地址和訪問路徑。
其實兩個java專案之間的通訊還是使用HTTP的請求。主要有兩種方式:
①使用apache的HttpClient方式。
②使用JDK自帶的java.net包下的HttpURLConnection方式。
主要講解HttpURLConnection方式:
HttpURLConnection傳遞請求常用的有兩種方式:POST和GET方式。使用setRequestMethod()方法設定傳遞的方式。
①、使用POST的方式傳遞請求:
第一個應用(傳送Http請求的服務端) :
在com.servlet下建立一個Servlet_test1.java檔案
在test1專案中的web.xml檔案中的配置servlet:package com.servlet; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.URL; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Servlet_test1 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //設定請求的編碼方式 request.setCharacterEncoding("utf-8"); //設定返回時的編碼方式 response.setContentType("text/html;charset=utf-8"); System.out.println("test1"); //設定HTTP連線的URL地址,就是第二個應用的URL。如果在同一個計算機上可以將192.168.1.134變成127.0.0.1或者localhost String http="http://192.168.1.134:8080/test2/Setvlet_test2"; URL url=new URL(http); //生成HttpURLConnection連線 HttpURLConnection httpurlconnection=(HttpURLConnection) url.openConnection(); //設定有輸出流,預設為false,就是不能傳遞引數。 httpurlconnection.setDoOutput(true); //設定傳送請求的方式。注意:一定要大寫 httpurlconnection.setRequestMethod("POST"); //設定連線超時的時間。不過不設定,在網路異常的情況下,可能會造成程式僵死而無法繼續向下執行,所以一般設定一個超時時間。單位為毫秒 httpurlconnection.setConnectTimeout(30000); //設定輸出流。 OutputStreamWriter writer=new OutputStreamWriter(httpurlconnection.getOutputStream(), "utf-8"); //傳遞的引數,中間使用&符號分割。 writer.write("username=123&password=456"); //用於重新整理緩衝流。因為預設她會寫入到記憶體的緩衝流中,到一定的資料量時,才會寫入,使用這個命令可以讓他立即寫入,不然下面就到關閉流了 writer.flush(); //用於關閉輸出流,關閉之後就不可以輸出資料了,所以要使用flush重新整理緩衝流 writer.close(); //獲得返回的請求嗎。 int responseCode=httpurlconnection.getResponseCode(); //表示請求成功 if(responseCode==HttpURLConnection.HTTP_OK){ System.out.println("OK"+responseCode); //獲得服務端的輸出流。得到返回的資料 InputStream urlstream=httpurlconnection.getInputStream(); BufferedReader reader=new BufferedReader(new InputStreamReader(urlstream)); String line; String tline=""; while((line=reader.readLine())!=null){ tline+=line; } //輸出所有的資料 System.out.println(tline); }else{ System.out.println("ERR"+responseCode); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
在服務端的程式碼(接收HTTP請求方)<servlet> <servlet-name>Servlet_test1</servlet-name> <servlet-class>com.servlet.Servlet_test1</servlet-class> </servlet> <servlet-mapping> <servlet-name>Servlet_test1</servlet-name> <url-pattern>/Servlet_test1</url-pattern> </servlet-mapping>
在test2專案下建立一個com.servlet包下的Servlet_test2.java檔案
package com.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Setvlet_test2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
System.out.println("test2");
System.out.println(request.getParameter("username"));
System.out.println(request.getParameter("password"));
//獲得傳送HTTP請求的引數
String username=request.getParameter("username");
String password=request.getParameter("password");
//向HTTP傳送方返回響應資料
if("123".equals(username)&&"456".equals(password)){
response.getWriter().write("{\"falg\":\"success\"}");
}else{
response.getWriter().write("{\"falg\":\"error\"}");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
在test2專案的web.xml檔案中的配置如下: <servlet>
<servlet-name>Setvlet_test2</servlet-name>
<servlet-class>com.servlet.Setvlet_test2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Setvlet_test2</servlet-name>
<url-pattern>/Setvlet_test2</url-pattern>
</servlet-mapping>
在位址列中輸入http://localhost:8080/test1/Servlet_test1。
就會輸出:
test1
test2
123
456
OK200
{"falg":"success"}
以下要注意幾點內容:
1.傳送請求預設是GET方式.
2.在傳送方中,outputStream必須在inptstream之前。否則就會丟擲異常
3.一個HTTP請求包括兩個部分:一個是報文頭資訊,一個是正文。