Java網絡編程——發送HTTP請求到伺服器

2020-12-13 米粒教育

當Java程序需要向伺服器發送請求或讀取伺服器數據時,使用URLConnection類是比較好的選擇。URLConnection類封裝了與伺服器互動操作的方法,通過它可以建立與伺服器的遠程連接,檢查伺服器資源的屬性,向伺服器發送請求並接收伺服器返回的數據。

URLConnection類是一個抽象類,它不能直接實例化為對象,但URL實例對象可以返回一個URLConnection類的子類對象。返回的子類對象與URL打開的網絡資源採用的協議有關。如果是HTTP協議,URL實例對象會返回HttpURLConnection對象。如果是FTP協議,URL實例對象會返回FtpURLConnection對象。

URLConnection類常用方法說明如下:

void connect()

該方法用於與遠程資源建立連接。如果尚未建立此連接,則打開指向此URL引用的資源連結。如果在連接已打開時調用connect方法(由值為true的connected欄位指示),則忽略該調用。

void setRequestProperty(String key, String value)

該方法用於設置網絡資源請求屬性。Key參數為已知請求的關鍵字(例如,「Accept」),value是與key關聯的值。

void setReadTimeout(int timeout)

該方法用於設置讀取網絡資源數據超時時間(以毫秒為單位)。

void setConnectTimeout(int timeout)

該方法用於設置連接網絡資源的超時時間(以毫秒為單位)

InputStream getInputStream()

該方法用於返回從這個打開的連接讀取的輸入流。

HttpURLConnection類常用方法說明如下:

int getResponseCode()

該方法從HTTP響應消息獲取狀態代碼。返回200表示請求響應成功,其它值表示請求響應失敗。

void setRequestMethod(String method)

該方法設置HTTP請求方法之一:GET/POST/HEAD/OPTIONS/PUT/DELETE/TRACE。默認是GET。

案例1:建立URLConnectionTest類,連接遠程伺服器,向伺服器發送服務請求,並接收伺服器的請求響應數據。

該遠程服務提供求兩數和服務,客戶端向該服務發送服務請求,並向該服務提交兩個待求和的整數,該服務返回求和結果。

在ip包下新建URLConnectionTest類。代碼如下:

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.net.HttpURLConnection;

import java.net.MalformedURLException;

import java.net.URL;

public class URLConnectionTest {

public static void main(String[] args) {

HttpURLConnection connection = null;

InputStream stream = null;

BufferedReader reader = null;

String server = "url&opone=30&optwo=60";

try {

// 實例化URL對象

URL url = new URL(server);

// 通過URL對象打開一個連接,顯示轉換為httpURLConnection類

connection = (HttpURLConnection) url.openConnection();

// 設置連接方式:get

connection.setRequestMethod("GET");

// 設置連接遠程服務的超時時間:15000毫秒

connection.setConnectTimeout(15000);

// 設置讀取遠程服務返回的數據時間:60000毫秒

connection.setReadTimeout(60000);

// 建立連接,發送請求

connection.connect();

// 通過connection連接,獲取輸入流

if (connection.getResponseCode() == 200) {

// 從打開的連接獲取輸入流,接收返回數據

stream = connection.getInputStream();

// 實例化BufferedReader對象,並指定字符集

reader = new BufferedReader(new InputStreamReader(stream, "UTF-8"));

// 實例化字符串生成器

StringBuffer sbf = new StringBuffer();

String temp = null;

// 從輸入流讀取數據

while ((temp = reader.readLine()) != null) {

sbf.append(temp);

sbf.append("\r\n");

}

// 返回內容輸出到控制臺

System.out.println("遠程服務返回的數據:" + sbf.toString());

}

} catch (MalformedURLException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

// 關閉資源

if (null != reader) {

try {

reader.close();

} catch (IOException e) {

e.printStackTrace();

}

}

if (null != stream) {

try {

stream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

// 關閉遠程連接

connection.disconnect();

}

}

}

URLConnectionTest程序的主要功能是請求一個求兩數和的遠程服務,並向遠程服務提交待求和的兩個整數,遠程服務計算兩數的和,並將計算結果返回給程序,程序將計算結果輸出到控制臺。

程序使首先用URL對象定位和打開遠程服務,並應用URL對象的openConnection()方法獲取HttpURLConnection實例對象。然後應用HttpURLConnection實例對象分別設置遠程服務的連接超時時間、服務響應超時時間、讀取數據超時時間。再調用HttpURLConnection實例對象的connect()方法向遠程服務發送請求,並調用HttpURLConnection實例對象的getResponseCode()方法判斷遠程服務是否響應成功,如果返回值是200,說明伺服器響應成功。最後讀取遠程服務返回的數據,並將讀取的數據輸出到控制臺。

程序執行結果如下圖所示:

相關焦點

  • 詳解Java網絡編程
    與客戶端建立連接後,它會返回一個已連接的Socket對象,並通過輸入流讀取客戶端發送的請求信息,然後通過輸出流向客戶端發送響應信息,最後關閉socket及相關資源。在客戶端創建Socket對象,需要指定連接伺服器的地址和埠號,和伺服器建立連接後,通過輸出流向服務端發送請求信息,然後通過輸入流獲取伺服器的響應信息,最後關閉socket及相關資源。
  • Java socket編程
    一,網絡編程中兩個主要的問題一個是如何準確的定位網絡上一臺或多臺主機,另一個就是找到主機後如何可靠高效的進行數據傳輸。在TCP/IP協議中IP層主要負責網絡主機的定位,數據傳輸的路由,由IP位址可以唯一地確定Internet上的一臺主機。
  • java網絡編程之基礎知識點總結
    概述本文是網絡編程系列的第一篇文章,所以不講代碼,主要是網絡編程的一些基礎知識,下面的這些知識點主要是對java網絡編程這本書的歸納與整理。有興趣的同學可以看看。我們知道計算機之間的通信要經過一系列複雜的過程,計算機之間通過傳輸介質、通信設施和網絡通信協議互聯,實現資源共享和數據傳輸。
  • 【java網絡】編程基礎
    Java 網絡編程
  • Linux使用epoll異步發送http請求
    http是基於tcp的協議,在發送http請求之前,要先與伺服器建立tcp連接,然後才可以發送HTTP請求。HTTP請求的頭部,就是一些以\r\n分割的字符串。第一行為GET、POST方法,之後的每一行為冒號分割的鍵值對,表示http請求的一些信息。
  • jmeter(五)HTTP請求
    HTTP Cookie Manager可以自動儲存伺服器發送給客戶端的所有Cookie,並在發送請求時附加上合適的Cookie    同時,用戶也可以在HTTP Cookie Manager中手工添加一些Cookie,這些被手工添加的Cookie會在發送請求時被自動附加到請求(5)HTTP Header Manager(信息頭管理器)    用於定製Sampler
  • Java郵件發送詳解
    電子郵件要在網絡上實現郵件功能,必須要有專門的郵件伺服器。這些郵件伺服器類似於現實生活中的郵局,它主要負責接收用戶投遞過來的郵件,並把郵件投遞到郵件接收者的電子郵箱中。電子郵箱(E-Mail地址)的獲得需要在郵件伺服器上進行申請。
  • Linux使用epoll控制多個socket發送http請求
    在客戶端使用epoll控制多個socket發送數據,與在伺服器上是類似的,也是把一個連續的同步過程拆成多個非阻塞的階段,在一個線程內實現高並發,而不是開多個線程。客戶端使用多個socket異步高並發,一般是對伺服器做壓力測試的代碼。
  • 程式設計師的術與道:術——編程基本功之網絡編程
    一、常用網絡服務服務軟體——DHCP伺服器——dhcpd郵件發送伺服器——sendmail郵件列表伺服器——mailman接收郵件的伺服器——pop3web站點——apache/nginx防火牆服務——iptables工具配置 ——netfilter二、 網路診斷逐步檢查網絡的各個層次:物理連結、鏈路層、網絡層直到應用層,熟悉使用各種如下的工具
  • socket編程基礎,從了解到實現
    java生下來一開始就是為了計算機之間的通信,因此這篇文章也將開始介紹一下java使用socket進行計算機之間的通信,在上一篇文章中已經對網絡通信方面的基礎知識進行了總結,這篇文章將通過代碼案例來解釋說明。
  • JAVA伺服器推送功能設計,消息方法總結|java|伺服器|客戶端|推送...
    (一)設計和思路介紹客戶端可能通過自定義的協議,或者是app應用,需要跟推送伺服器建立一個連接,推和拉的區別是推是伺服器主動像客戶端發起請求,往往這個技術很難實現的,主動推數據需要建立一條網絡通道,伺服器才可以完成推送,不說它也不知道是哪個客戶端,一定是客戶端主動和推送伺服器建立了連接socket,一般的情況是通過拉的模式來完成推送,涉及到一些socket的技術點
  • 黑馬程式設計師:Java相關網絡編程習題
    習題總結:本文習題內容主要圍繞網絡編程的相關知識。簡要圍繞TCP協議和UDP協議的區別,以及IP位址、埠號和InetAddress類。著重圍繞著UDP網絡編程相關的DatagramSocket、DatagramPacket類,與TCP網絡編程相關的ServerSocket、Socket類。需要習題答案的同學,分享文章並留言即可獲得。一、填空題TCP協議的特點是_________,即在傳輸數據前先在_________和__________簡歷邏輯連結。
  • Java Socket應用——通信是這樣煉成的
    http:80、ftp:21、telnet:23。1.4、Java提供網絡功能四大類(1)InetAddress:用語標識網絡上硬體資源。(2)URL:統一資源定位符,直接讀取或寫入網絡上數據。(3)Sockets: 使用TCP協議實現網絡通信的Socket相關類。
  • 基於Socket的java通信編程詳解
    Java最初是作為網絡程式語言出現的,其對網絡提供了高度的支持,使得客戶端和伺服器的溝通變成了現實,而在網絡編程中,使用最多的就是Socket。像大家熟悉的QQ、MSN都使用了Socket相關的技術。下面就讓我們一起揭開Socket的神秘面紗。
  • 動力節點Java學院2021年Java學習路線圖最新出爐啦
    Java在程式語言排行榜中一直牢牢佔據榜首位置,幾乎所有的大中型網際網路的應用系統在伺服器端開發首選都是Java編程,正因如何吸引這不少年輕人投入該行業,Java雖不想其它程式語言那麼複雜,但是知識體系還是很龐大的,因此想要學好並非容易之事,不少想要跨入Java編程行業的同學們通過網絡搜索各式各樣的學習資料
  • 一次完整的HTTP請求與響應涉及哪些知識?
    它所做的工作包括把應用程式交給它的數據分成合適的小塊交給下面的網絡層,確認接收到的分組,設置發送最後確認分組的超時時鐘等。由於運輸層提供了高可靠性的端到端的通信,因此應用層可以忽略所有這些細節。為了提供可靠的服務,TCP採用了超時重傳、發送和接收端到端的確認分組等機制。UDP則為應用層提供一種非常簡單的服務。
  • Linux伺服器編程簡介
    Linux伺服器編程的特點是異步高並發,代碼不能阻塞、不能休眠,以提高伺服器的並發效率。給nginx寫自定義的模塊,就是典型的Linux伺服器編程。nginx-rtmp-module就是一個開源的nginx模塊,它為nginx添加了rtmp協議的支持。
  • 用JavaScript發出HTTP請求的不同方法
    現在開始吧~XMLHttpRequestXMLHttpRequest對象可用於從Web伺服器請求數據。它是這次比較中最早的方法,儘管其他選擇都優於它,但由於其向後兼容性和成熟度,它仍然有效且有用。)//Do some stuff}};req.open("GET", "http://dataserver/users", true);req.send();發送:
  • 網絡編程基礎學習筆記2:socket接口及網絡編程三要素
    對於網絡編程而言,由於其底層語言是通過C語言來實現的,所以建議在學習的時候使用C語言來進行學習!網絡編程中常用的socket接口如下:socket()接口,用於創建socket;bind():用於綁定socket到本地地址和埠,通常由服務端調用(客戶端一般直接由connect直接主動去連結服務端);listen():用於開啟監聽模式,TCP專用;accept():用於伺服器等待客戶端連接,該情況一般在阻塞狀態下產生
  • 漏洞經驗分享丨Java審計之XXE(下)
    有回顯的情況可以直接在頁面中看到Payload的執行結果或現象(帶內XML外部實體(XXE),即攻擊者可以發送帶有XXE有效負載的請求並從包含某些數據的Web應用程式獲取響應),無回顯的情況又稱為Blind XXE,可以使用外帶數據通道提取數據即帶外XML外部實體(OOB-XXE)。以下是攻擊者如何利用參數實體使用帶外(OOB)技術竊取數據的示例。