1. 程式人生 > >兩個java專案的服務端通訊之HttpURLConnection方式

兩個java專案的服務端通訊之HttpURLConnection方式

如何你有兩個java專案的話,如何向他們之間進行資訊的通訊

前提:必須知道要通訊的java專案(接收請求方)的伺服器的IP地址和訪問路徑

其實兩個java專案之間的通訊還是使用HTTP的請求。主要有兩種方式:

①使用apache的HttpClient方式。

②使用JDK自帶的java.net包下的HttpURLConnection方式。

主要講解HttpURLConnection方式:

HttpURLConnection傳遞請求常用的有兩種方式:POST和GET方式。使用setRequestMethod()方法設定傳遞的方式。

①、使用POST的方式傳遞請求:

第一個應用(傳送Http請求的服務端)

在com.servlet下建立一個Servlet_test1.java檔案

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

}
在test1專案中的web.xml檔案中的配置servlet:
 <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>	
在服務端的程式碼(接收HTTP請求方)
在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請求包括兩個部分:一個是報文頭資訊,一個是正文。