A. java的TCP和HTTP有什麼區別
TCP協議對應於傳輸層,而HTTP協議對應於應用層,從本質上來說,二者沒有可比性。Http協議是建立在TCP協議基礎之上的,當瀏覽器需要從伺服器獲取網頁數據的時候,會發出一次Http請求。Http會通過TCP建立起一個到伺服器的連接通道,當本次請求需要的數據完畢後,Http會立即將TCP連接斷開,這個過程是很短的。所以Http連接是一種短連接,是一種無狀態的連接。所謂的無狀態,是指瀏覽器每次向伺服器發起請求的時候,不是通過一個連接,而是每次都建立一個新的連接。如果是一個連接的話,伺服器進程中就能保持住這個連接並且在內存中記住一些信息狀態。而每次請求結束後,連接就關閉,相關的內容就釋放了,所以記不住任何狀態,成為無狀態連接。
B. 客戶端(C#)通過HTTP協議怎麼向伺服器端(java)傳送文件(常用的是圖片) ,伺服器端又怎麼解析
private string PostWebRequest(string postUrl, string paramData, Encoding dataEncode)
{
string ret = string.Empty;
try
{
byte[] byteArray = dataEncode.GetBytes(paramData); //轉化
HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(postUrl));
webReq.Method = "POST";
webReq.ContentType = "application/x-www-form-urlencoded";
webReq.ContentLength = byteArray.Length;
Stream newStream = webReq.GetRequestStream();
newStream.Write(byteArray, 0, byteArray.Length);//寫入參數
newStream.Close();
HttpWebResponse response = (HttpWebResponse)webReq.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.Default);
ret = sr.ReadToEnd();
sr.Close();
response.Close();
newStream.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return ret;
}
C. Java客戶端通過Http發送POST請求上傳文件
要按http的multi-part上傳的。接收端,再按multi-part解析成文件流
D. Java Socket實現HTTP客戶端來理解Session和Cookie的區別和聯系
在面試中 經常碰到請闡述session與cookie的區別與聯系,以及如何修改兩者的有效時間。
大家都知道,session是存儲在伺服器端的,cookie是存儲在客戶端的,session依賴於cookie,但是讓你說詳細點,你會嗎?我是不太清楚的,特意在網上找了很多資料,發現一篇不錯的文章,特整理歸納在此,供有需要的朋友查看。
具體來說cookie機制採用的是在客戶端保持狀態的方案。它是在用戶端的會話狀態的存貯機制,他需要用戶打開客戶端的cookie支持。cookie的作用就是為了解決HTTP協議無狀態的缺陷所作的努力.
而session機制採用的是一種在客戶端與伺服器之間保持狀態的解決方案。同時我們也看到,由於採用伺服器端保持狀態的方案在客戶端也需要保存一個標識,所以session機制可能需要藉助於cookie機制來達到保存標識的目的。而session提供了方便管理全局變數的方式
session是針對每一個用戶的,變數的值保存在伺服器上,用一個sessionID來區分是哪個用戶session變數,這個值是通過用戶的瀏覽器在訪問的時候返回給伺服器,當客戶禁用cookie時,這個值也可能設置為由get來返回給伺服器。
就安全性來說:當你訪問一個使用session 的站點,同時在自己機子上建立一個cookie,建議在伺服器端的SESSION機制更安全些.因為它不會任意讀取客戶存儲的信息。
正統的cookie分發是通過擴展HTTP協議來實現的,伺服器通過在HTTP的響應頭中加上一行特殊的指示以提示瀏覽器按照指示生成相應的cookie
從網路伺服器觀點看所有HTTP請求都獨立於先前請求。就是說每一個HTTP響應完全依賴於相應請求中包含的信息
狀態管理機制克服了HTTP的一些限制並允許網路客戶端及伺服器端維護請求間的關系。在這種關系維持的期間叫做會話(session)。
Cookies是伺服器在本地機器上存儲的小段文本並隨每一個請求發送至同一個伺服器。
session機制是一種伺服器端的機制,伺服器使用一種類似於散列表的結構(也可能就是使用散列表)來保存信息。
當程序需要為某個客戶端的請求創建一個session的時候,伺服器首先檢查這個客戶端的請求里是否已包含了一個session標識 - 稱為 session id,如果已包含一個session id則說明以前已經為此客戶端創建過session,伺服器就按照session id把這個 session檢索出來使用(如果檢索不到,可能會新建一個),如果客戶端請求不包含session id,則為此客戶端創建一個session並且生成一個與此session相關聯的session id,session id的值應該是一個既不會重復,又不容易被找到規律以仿造的字元串,這個 session id將被在本次響應中返回給客戶端保存。
在談論session機制的時候,常常聽到這樣一種誤解「只要關閉瀏覽器,session就消失了」。其實可以想像一下會員卡的例子,除非顧客主動對店家提出銷卡,否則店家絕對不會輕易刪除顧客的資料。對session來說也是一樣的,除非程序通知伺服器刪除一個session,否則伺服器會一直保留,程序一般都是在用戶做log off的時候發個指令去刪除session。然而瀏覽器從來不會主動在關閉之前通知伺服器它將要關閉,因此伺服器根本不會有機會知道瀏覽器已經關閉,之所以會有這種錯覺,是大部分session機制都使用會話cookie來保存session id,而關閉瀏覽器後這個 session id就消失了,再次連接伺服器時也就無法找到原來的session。如果伺服器設置的cookie被保存到硬碟上,或者使用某種手段改寫瀏覽器發出的HTTP請求頭,把原來的session id發送給伺服器,則再次打開瀏覽器仍然能夠找到原來的session。
恰恰是由於關閉瀏覽器不會導致session被刪除,迫使伺服器為seesion設置了一個失效時間,當距離客戶端上一次使用session的時間超過這個失效時間時,伺服器就可以認為客戶端已經停止了活動,才會把session刪除以節省存儲空間。
大家都知道,http是無狀態的協議,客戶每次讀取web頁面時,伺服器都打開新的會話,而且伺服器也不會自動維護客戶的上下文信息,那麼要怎麼才能實現網上商店中的購物車呢,session就是一種保存上下文信息的機制,它是針對每一個用戶的,變數的值保存在伺服器端,通過SessionID來區分不同的客戶,session是以cookie或URL重寫為基礎的,默認使用cookie來實現,系統會創造一個名為JSESSIONID的輸出cookie,我們叫做session cookie,以區別persistent cookies,也就是我們通常所說的cookie,注意session cookie是存儲於瀏覽器內存中的,並不是寫到硬碟上的,這也就是我們剛才看到的JSESSIONID,我們通常情是看不到JSESSIONID的,但是當我們把瀏覽器的cookie禁止後,web伺服器會採用URL重寫的方式傳遞Sessionid,我們就可以在地址欄看到sessionid=KWJHUG6JJM65HS2K6之類的字元串。
明白了原理,我們就可以很容易的分辨出persistent cookies和session cookie的區別了,網上那些關於兩者安全性的討論也就一目瞭然了,session cookie針對某一次會話而言,會話結束session cookie也就隨著消失了,而persistent cookie只是存在於客戶端硬碟上的一段文本(通常是加密的),而且可能會遭到cookie欺騙以及針對cookie的跨站腳本攻擊,自然不如session cookie安全了。
通常session cookie是不能跨窗口使用的,當你新開了一個瀏覽器窗口進入相同頁面時,系統會賦予你一個新的sessionid,這樣我們信息共享的目的就達不到了,此時我們可以先把sessionid保存在persistent cookie中,然後在新窗口中讀出來,就可以得到上一個窗口SessionID了,這樣通過session cookie和persistent cookie的結合我們就實現了跨窗口的session tracking(會話跟蹤)。
在一些web開發的書中,往往只是簡單的把Session和cookie作為兩種並列的http傳送信息的方式,session cookies位於伺服器端,persistent cookie位於客戶端,可是session又是以cookie為基礎的,明白的兩者之間的聯系和區別,我們就不難選擇合適的技術來開發web service了。純屬復制
E. 怎樣編寫http請求的java程序
目前web上的消息通訊方式主要有以下幾種。輪詢,長連接,websocket輪詢:隔一段時間訪問伺服器,伺服器不管有沒有新消息都立刻返回。長連接:頁面向伺服器發出請求,由伺服器決定什麼時候返回。(如果有新消息則立刻返回,沒有的話就保持連接,直到有新消息才返回)websocket:類似JavaSocket,由Http請求模擬實現的socket。要實現長連接的關鍵就是:由伺服器端決定什麼時候返回數據。比如在servlet中。doGet(){Thread.sleep(30000);return}這就是一個長連接的例子,只是沒有任何意義而已。你要做的就是在doGet中阻塞住,while(!hasNewMsg){sleep(500)}returnnewMsg當然你的ajax超時時間要設置長一點。如果可以的話,最好可以使用websocket。
F. java Http服務端主動響應包給客戶端該怎麼玩
json轉換和解析可以使用工具包,fastjson比較好用,服務端處理後,使用fastjosn將返回數據轉換為json字元串返回給客戶端,客戶端在解析json字元串獲取參數
G. 如何使用java實現基於Http協議的大文件傳輸
雖然在JDK的java.net包中已經提供了訪問HTTP協議的基本功能,但是對於大部分應用程序來說,JDK庫本身提供的功能還不夠豐富和靈活。HttpClient是ApacheJakartaCommon下的子項目,用來提供高效的、最新的、功能豐富的支持HTTP協議的客戶端編程工具包,並且它支持HTTP協議最新的版本和建議。以下是簡單的post例子:Stringurl="bbslogin2.php";PostMethodpostMethod=newPostMethod(url);//填入各個表單域的值NameValuePair[]data={newNameValuePair("id","youUserName"),newNameValuePair("passwd","yourPwd")};//將表單的值放入postMethod中postMethod.setRequestBody(data);//執行postMethodintstatusCode=httpClient.executeMethod(postMethod);//HttpClient對於要求接受後繼服務的請求,象POST和PUT等不能自動處理轉發//301或者302if(statusCode==HttpStatus.SC_MOVED_PERMANENTLY||statusCode==HttpStatus.SC_MOVED_TEMPORARILY){//從頭中取出轉向的地址HeaderlocationHeader=postMethod.getResponseHeader("location");Stringlocation=null;if(locationHeader!=null){location=locationHeader.getValue();System.out.println("Thepagewasredirectedto:"+location);}else{System.err.println("Locationfieldvalueisnull.");}return;}詳情見:/developerworks/cn/opensource/os-httpclient/
H. 請教http摘要認證客戶端的Java實現
HttpURLConnection hc = null;
try
{
hc = (HttpURLConnection) new URL(url).openConnection();
hc.setConnectTimeout(10000);
hc.setReadTimeout(10000);
hc.setDoInput(true);
hc.setDoOutput(true);
hc.setUseCaches(false);
String content = param;
DataOutputStream out = new DataOutputStream(hc.getOutputStream());
out.writeBytes(content);
out.flush();
out.close();
//從hc中取出sessionId
for (int i = 1; (key = hc.getHeaderFieldKey(i)) != null; i++)
{
if (key.equalsIgnoreCase("Set-Cookie"))
{
sessionId = hc.getHeaderField(key);
sessionId = sessionId.substring(0, sessionId.indexOf(";"));
break;
}
}
BufferedReader reader = new BufferedReader(
new InputStreamReader(hc.getInputStream()));
String lines;
while ((lines = reader.readLine()) != null)
{
break;
}
reader.close();
catch (Exception e)
{
//
//e.printStackTrace();
return false;
}
finally
{
// 斷開連接
hc.disconnect();
}
I. 用java編寫的httpserver如何處理客戶端發來的表單數據
獲得客戶端發送的變數用request.getAttribute("變數名")就可以獲得,想交給另一個頁面處理就轉發到(dispatch)另一個頁面
J. java http 客戶端有哪些
1、Apache httpcomponents-client
2、Apache commons-httpclient
3、Apache HttpAsyncClient