導航:首頁 > IDC知識 > 伺服器請求

伺服器請求

發布時間:2020-09-18 12:25:20

1、java伺服器接收客戶端請求怎樣實現的

伺服器端代碼:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
* Socket通訊伺服器端
* @author 米強
*
*/
public class ServerMain {

public ServerMain() {
try {
// 構造伺服器ServerSocket對象,參數為伺服器端開放的埠號
ServerSocket ss = new ServerSocket(30102);
System.out.println("伺服器准備就緒!");
// 死循環可以使伺服器持續處於接收客戶端狀態
while(true){
// 該方法使程序阻塞,等待客戶端的鏈接,當監聽到客戶端的鏈接,創建一個Socket對象與客戶端單獨會話
Socket s = ss.accept();
// 為了不影響伺服器監聽其它客戶端,這里開啟了一個線程,由線程處理與這個客戶端的會話
new ServerThread(s).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
new ServerMain();
}

}

/**
* 伺服器端與客戶端會話的線程
*/
class ServerThread extends Thread {
private Socket s = null;
private BufferedReader read = null;
private PrintStream print = null;

public ServerThread(Socket s) {
this.s = s;
try {
// 從Socket中獲取輸入流和輸出流,由於我們只做一個簡單的字元串通訊,所以採用BufferedRead和PrintStream來封裝輸入、輸出流
read = new BufferedReader(new InputStreamReader(s.getInputStream()));
print = new PrintStream(s.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 線程的運行run方法
*/
public void run() {
try {
String message = null;
// 這里循環可以使伺服器持續的接收客戶端信息。read.readLine()通過輸入流讀取一段字元串,賦值給message變數,如果message字元串不為「exit」則循環,否則結束循環
while (!(message = read.readLine()).equals("exit")){
// 將字元串前面添加「返回:」,再發回客戶端
print.println("返回:" + message);
}
} catch (IOException e) {
} finally {
// 在 finally 代碼塊中無論如何都會執行下面代碼:
try {
// 如果沒有關閉Socket
if(!s.isClosed()){
// 關閉Socket鏈接
s.close();
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
}

}

客戶端代碼:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

/**
* Socket通訊客戶端
* @author 米強
*
*/
public class ClientMain {

public ClientMain() {
try {
// 構造與伺服器通訊的Socket對象,參數為伺服器IP地址(String)和埠號(int),埠號需要和伺服器端開放的埠號對應
Socket s = new Socket("192.168.1.100", 30102);
// 啟動一個線程與伺服器通訊,並把鏈接伺服器的Socket對象傳遞過去
new LinkThread(s).start();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
new ClientMain();
}

}

/**
* 與伺服器通訊的線程
*/
class LinkThread extends Thread {
private Socket s = null;
// 輸出流
private PrintStream out = null;
// 緩沖輸入流
private BufferedReader in = null;
// 錄入文字的Scanner對象
private Scanner scanner = null;

public LinkThread(Socket s) {
// 將Socket對象實例保存在全局變數中,因為run方法中我們還要用它斷開鏈接
this.s = s;
try {
// 從Socket中獲取輸入流和輸出流,由於我們只做一個簡單的字元串通訊,所以採用BufferedRead和PrintStream來封裝輸入、輸出流
out = new PrintStream(s.getOutputStream());
in = new BufferedReader(new InputStreamReader(s.getInputStream()));
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 線程的運行run方法
*/
public void run() {
// 構造Scanner對象
scanner = new Scanner(System.in);
System.out.println("提示:如果要結束本次會話,請輸入「exit」指令!");
try {
// 死循環可以使客戶端不斷的向伺服器發送信息,不用擔心循環無法結束,後面的return語句可以結束整個線程。
while(true){
// 提示用戶輸入文字
System.out.print("請輸入:");
// 將用戶輸入的字元串保存在message變數中
String message = scanner.nextLine();
// 通過輸出流發送字元串
out.println(message);
// 清空緩沖,強制輸出
out.flush();
// 獲取伺服器返回的字元串
String str = in.readLine();
// 如果返回的字元串存在
if(str != null){
// 顯示在控制台
System.out.println(str);
}else{
// 提示會話結束,並結束線程
System.out.println("本次會話結束!");
return;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 在 finally 代碼塊中無論如何都會執行下面代碼:
try {
// 如果沒有關閉Socket
if(!s.isClosed()){
// 關閉Socket鏈接
s.close();
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
}

}

2、頁面載入完成發起請求到伺服器代碼怎麼寫

用js唄
window.onload = funtion(){
這里寫請求到伺服器的代碼,ajax,頁面載入完成,離開等都有對應的事件,你只要查一下對應的事件是什麼,業務邏輯寫在對應的事件的方法就可以調到了
}

3、請求伺服器超時?

您好,您要看具體報錯信息哦。如果是租用的伺服器可以聯系供應商重啟,最簡單直接。

4、http協議中關於"請求"概念的一句話。不太理解,請指點。"瀏覽器根據網址向對應的伺服器發送請求"

你要訪問京東,你的瀏覽器就會向京東的伺服器發送「請求」,京東的伺服器收到你瀏覽器的「請求」後,會給你的瀏覽器一個反饋是否同意你的「請求」,如果同意,京東的伺服器就會把「請求」的數據發送給你的瀏覽器,你的瀏覽器就會把它顯示出來。

HTTP不發送請求,HTTP是網路協議。HTTP是一個客戶端和伺服器端請求和應答的標准。網頁鏈接。想要深入了解的話,可以看看《HTTP權威指南》等HTTP方面的書籍。

5、如何給http伺服器發送post請求

1、HTTP請求概述

在前面有一篇文章對HTTP協議有詳細的描述,這里就不再過多的做說明,只是簡單的作為這篇文章的引子。

HTTP協議又被稱為超文本傳輸協議,它的的設計目的是保證客戶機與伺服器之間的通信。HTTP 的工作方式是客戶端與伺服器之間的請求-應答協議。在客戶端和伺服器之間進行請求-響應時,有兩個最基本的請求方式:GET 和 POST。

其中,GET請求表示從指定的資源請求數據,POST請求表示向指定的資源提交要被處理的數據。

2、HTTP請求格式

在HTTP請求中,首先是請求行,注意這里的請求行一定要放在最前面;其次,是請求頭,英文表示為header;然後會空一行,緊接著就可以是請求的具體內容了,一般稱之為請求體,request-body。給出一個圖示如下:

3、GET請求與POST請求對比

GET請求與POST請求有一些異同點,主要有以下幾點問題:

(1)、GET請求和POST請求都是客戶端與伺服器之間交互,請求--應答模式的協議

(2)、GET請求是通過URL直接請求數據,數據信息可以在URL中直接看到,比如瀏覽器訪問;而POST請求是放在請求頭中的,我們是無法直接看到的;

(3)、GET提交有數據大小的限制,一般是不超過1024個位元組,而這種說法也不完全准確,HTTP協議並沒有設定URL位元組長度的上限,而是瀏
覽器做了些處理,所以長度依據瀏覽器的不同有所不同;POST請求在HTTP協議中也沒有做說明,一般來說是沒有設置限制的,但是實際上瀏覽器也有默認
值。總體來說,少量的數據使用GET,大量的數據使用POST。

(4)、GET請求因為數據參數是暴露在URL中的,所以安全性比較低,比如密碼是不能暴露的,就不能使用GET請求;POST請求中,請求參數信息是放在請求頭的,所以安全性較高,可以使用。在實際中,涉及到登錄操作的時候,盡量使用HTTPS請求,安全性更好。

下面給出一副圖示,說明一下HTTP中GET與POST請求的差異:

4、使用步驟:

在Android中使用HTTP請求,主要步驟如下:

(1)、實例化一個HttpGet(或HttpPost)對象,將請求的URL地址通過構造方法傳給HttpGet(或HttpPost)對象;
(2)、使用DefaultHttpClient類的execute方法發送GET或POST 請求,並返回HttpResponse對象;
(3)、通過HttpResponse介面的getEntity方法返回響應信息。

5、實例代碼

給出一個在實際應用中的一個POST請求的代碼片段:

[java] view plain copy print?
params = new LinkedList();
params.add(new BasicNameValuePair("param1", "Post方法"));
params.add(new BasicNameValuePair("param2", "第二個參數"));

try {
HttpPost post = new HttpPost(baseUrl);
post.setEntity(new UrlEncodedFormEntity(params, "utf-8")); //將參數填入POST Entity中

HttpResponse response = httpClient.execute(post); //執行POST方法
resCode = response.getStatusLine().getStatusCode()); //獲取響應碼
result = EntityUtils.toString(response.getEntity(), "utf-8")); //獲取響應內容

} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

6、HTTP請求狀態碼意義

HTTP請求中,主要有這樣幾個類型:1XX:表示信息提示,2XX:表示成功,3XX:表示重定向,4XX:表示客戶端請求錯誤,5XX:表示伺服器錯誤。常見的幾個HTTP請求狀態碼意義如下:

200 OK: 找到了該資源,並且一切正常。
304 NOT MODIFIED: 該資源在上次請求之後沒有任何修改。這通常用於瀏覽器的緩存機制。
401 UNAUTHORIZED: 客戶端無權訪問該資源。這通常會使得瀏覽器要求用戶輸入用戶名和密碼,以登錄到伺服器。
403 FORBIDDEN: 客戶端未能獲得授權。這通常是在401之後輸入了不正確的用戶名或密碼。
404 NOT FOUND: 在指定的位置不存在所申請的資源。
505 NOT SUPPORTED:伺服器不支持請求中所指明的HTTP版本

6、伺服器如何處理http請求

1.需求

了解服務端如何處理http請求,了解基本的處理流程

2.實戰

處理http請求分為7個步驟

2.1 Tcp連接

建立一條tcp鏈接,(若之前不存在持久鏈接keep-alive),把客戶端的ip和port,服務端的ip和port數據放到web伺服器連接表中。伺服器隨時監聽鏈接表中的鏈接,看有沒有數據變化

2.2 接收http請求

一旦我們發送http請求了,這條tcp鏈接就開始工作了。因為web伺服器鏈接表中有許多鏈接需要被處理,處理的方式有單線程,多線程這些(這些涉及操作系統的知識)。

2.3 處理http請求

處理的過程大致是把請求的信息解析出來,如下圖

 

2.4 訪問資源

訪問資源可以是訪問靜態資源,這個就直接根據url地址去伺服器里找就好了。

訪問動態資源的話要經過一個叫cgi的東西,再用服務端腳本處理,再返回給前端。如下圖所示

2.5 構建響應

要是找到資源,則構建響應信息,包括響應的對象類型,長度,狀態碼。

另一個情況是重定向響應,就是直接返回一個重定向,客戶端看到之後,立刻再向重定向的地址發起請求。重定向的響應的狀態碼一般是3xx。

2.6 發送響應

把構建的響應發送給客戶端

2.7 記錄日誌

服務端對這個請求響應過程進行記錄。(另外專門再講)

 

3.總結

以上是服務端處理http請求的大致過程。能讓大家有個大致輪廓,當然裡面有很多細節的知識沒講到,要另外查詢資料並學習

7、伺服器請求錯誤是啥意思

 (1).請檢查自己的網路是否正常連接。
(2).請關閉您的網路防火牆,防火牆有時會影響正常連接到伺服器。
(3).如果您是通過區域網上網,無法連接伺服器,那有可能是區域網伺服器屏蔽了游戲所佔用的埠,請與您的網
管聯系。
(4).提供您上網服務的網路服務營運商的伺服器不能連接到官方的伺服器,請與您的網路服務營運商聯系。
(5).伺服器可能在關閉維護狀態,請注意官方網站的公告以及官方論壇的消息。

8、向伺服器發送請求有幾種方式

你好。

用vs表單提交有兩種方式

method = "post" || method = "get"

您也可以向我們團隊發出請求,

會有更專業的人來為您解答。

如果我的回答沒能幫助您,請繼續追問。

9、伺服器設置請求時間一般為多長,過長會有什麼影響

設置60秒即可
在客戶端訪問瀏覽器的時候,有時候可能會因為某種原因導致訪問堵塞,如果不設置超時的話就會變成資源浪費甚至伺服器掛起,
比如說我要看我的資料庫內有多少條記錄,在你訪問伺服器 有伺服器再去訪問資料庫,當訪問資料庫的時候要是卡住了,如果不設置超時,伺服器就會一直將線程保持,然後一條條線程堆積下來,對應的資源也一直被這些卡住的線程持有,不得釋放。最後的結果可想而知

與伺服器請求相關的知識