如何不生成XML文件通過Socket傳XML文件內容

    最近做項目碰到一個問題,想在客戶端生成XML文件內容,但不在硬盤上創建文件(沒這個需求),可以減少I/O操作,提高效率,改爲直接發送XML內容。發現Jdom還是挺好用的,直接用下面一點代碼就可以完成這項任務,生成XML字符串

//省略生成XML的代碼
Document doc = new Document(root);
XMLOutputter XMLOut = new XMLOutputter(format);
//生成XML字符串,即XML文件的內容,包含很多換行符
String xmlString = XMLOut.outputString(doc);
//發送XML字符串
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println(xmlString);
out.flush();


    但是遇到一個問題,因爲要保持長連接,在服務器端怎麼知道文件內容傳完了呢?服務器端一開始的代碼如下,一直髮生超時異常

BufferedReader in = new BufferedReader(new InputStreamReader(processSocket.getInputStream()));
String msg = "";
String temp = "";
///////////////////////////////////////////////////////////////////////
//這裏讀完後就阻塞了,拋出異常,該怎麼樣才能知道XML文件內容傳完了呢?//
///////////////////////////////////////////////////////////////////////
while ((temp = in.readLine()) != null) {
    msg += temp;
}


    爲了解決這個問題,搜了好久,始終沒有找到答案,後來特意在論壇發了個帖子問了一下,終於明白了,帖子地址:http://topic.csdn.net/u/20111018/10/6843bbbe-7307-4523-bc39-699224b5efbf.html

    原來如果是短連接,客戶端發完數據後會直接關掉套接字,服務器端的readline()會接受到null,那麼我的程序可以正常運行。但因爲是長連接,所以客戶端的套接字等待服務器端的數據處於阻塞狀態,客戶端發完數據後,服務器端readline() 因爲等待對方的數據,對方已經阻塞,互相等待,形成死鎖,所以才發生超時。

    解決辦法有兩個:

一、規定客戶端每次發數據前先發數據的長度再發數據,服務器端先接收數據大小,再根據這個大小創建相應長度的數組接收數據;

二、根據XML的格式,當讀到XML結束的標誌是表示數據接收完畢。

    因爲項目合作原因,最終採用第二種方法,把問題解決了。

    PS:之前在搜這個問題時也遇到一些類似不保存XML文件直接發數據內容的東西,有提到用web service 的,什麼SOAP之類的也是用來這種應用,有空可以研究一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章