大哥呀,我還沒用學到那麼多,你有時間可以教教我嗎?+Q
[email protected]
㈡ java網路編程的目錄
第一章 Java網路編程的原因
網路程序的功能
安全性
等等!還有更多!
第二章 基本網路概念
網路
網路的分層
IP、TCP和UDP
Internet
客戶/伺服器模型
Internet標准
第三章 基本Web概念
URI
HTML、SGML和XML
HTTP
MIME媒體類型
伺服器端程序
第四章 流
輸出流
輸人流
過濾器流
閱讀器和書寫器
第五章 線程
運行線程
返回線程中的信息
同步
死鎖
線程調度
線程池
第六章 查找Internet地址
InetAddress類
Inet4Address和Inet6Address
NetworkInterface類
一些有用的程序
第七章 U R L和U R I
URL類
URLEncoder和URLDecoder類
URI類
代理
通過GET方法與伺服器端程序通信
訪問受口令保護的網站
第八章 Swing中的HTM L
組件上的HTML
JEditorPane
解析HTML
coOkie一
第九章 客戶端Socket
socket基礎
用Telnet研究協議
Socket類
Socket異常
Socket地址
示例
第十章 伺服器socket
ServerSocket類
一些有用的伺服器
第十一章安全Socket
保護通信
創建安全客戶端socket
SsLSocket類的方法
創建安全的伺服器socket
SSLSerVerSocket類的方法
第十二章 非阻塞I/O。
一個示例客戶端
一個示例伺服器
緩沖區
通道
就緒選擇
第十三章 UDP數據報和Socket
UDP協議
DatagramPacket類
DatagramSocket類
一些有用的應用程序
DatagramChannel
第十四章 組播socket
何為組播socket?
使用組播socket
兩個簡單示例
第十五章 URLConnection
打開URLConnection
讀取伺服器的數據
讀取首部
配置連接
配置客戶端的請求HTTP首部
向伺服器寫入數據
內容處理器
0bject方法
URLConnection的安全考慮
猜測MIME內容類型
HttpURLCOnnectiOn
緩存
JarURLCOnnectiOn
第十六章 協議處理器
何為協議處理器7
URLStreamHandler類
編寫協議處理器
更多協議處理器示例和技術
URLStreamHandlerFactory介面
第十七章 內容處理器
何為內容處理器7
ContentHandler類
ContentHandlerFactory介面
FITS圖片格式的內容處理器
第十八 章遠程方法調用
何為遠程方法調用7
實現
在運行時載入類
java rmi包
jaVarmiregistry包
javarmiserver包
第十九章 JavaMailAPI
何為JavaMail API?
發送電子郵件一
接收郵件
口令認證
地址一
URLName類
Message類
Part介面
多部分消息和附件
MIME消息
文件夾
……
㈢ JAVA 學習方法或捷徑--求教
JAVA同其它任何一門編程語言一樣,都是要從淺到深的過程,如果你想愉快的學習這門語言的話,給你看篇文章,記住JAVA學習要有耐心!下面的文章也許對你有幫助
1. Java語言基礎
談到Java語言基礎學習的書籍,大家肯定會推薦Bruce Eckel的《Thinking in Java》。它是一本寫的相當深刻的技術書籍,Java語言基礎部分基本沒有其它任何一本書可以超越它。該書的作者Bruce Eckel在網路上被稱為天才的投機者,作者的《Thinking in C++》在1995年曾獲SoftwareDevelopment Jolt Award最佳書籍大獎,《Thinking in Java》被評為1999年Java World「最愛讀者歡迎圖書」,並且贏得了編輯首選圖書獎。作者從1986年至今,已經發表了超過150篇計算機技術文章,出版了6本書(其中4本是關於C++的),並且在全世界做了數百次演講。他是《Thinking in Java》、《Thinking in C++》、《C++ Inside & Out》《Using C++》和《Thinking in Patterns》的作者,同時還是《Black Belt C++》文集的編輯。他的書被讀者稱為「最好的Java參考書……絕對讓人震驚」;「購買Java參考書最明智的選擇」;「我見過的最棒的編程指南」。作者的非凡才華,極其跨越語言的能力,使作者被選為Java發展10年間與Java關系最密切的10個人物之一。
《Thinking in Java》講述了Java語言的方方面面,很多Java語言的老手都評價「這是一本將Java語言講得相當醜陋的書」。該書談及了java語言的很多細節,每一個方面都是相當深刻的。通過本書你可以看到「醜陋的」java語言。
網路上關於java語言講解的視頻很多很多,其中不凡有垃圾。《翁愷—JAVA語言》可能是你學習java語言基礎的唯一選擇,該講座基本按照《Thinking in Java》這本書講解,其中不凡有翁老師的很多有意思的笑話。我很幸運學習就是從此視頻開始的。內容包括30講,我總共看了3遍。
不過,對於初學者我不太推薦使用《Thinking in Java》,我比較推薦Prentice Hall PTR 的《Core Java 2》國內稱為《Java 2 核心技術》,目前是第七版。網路上大家都可以下載到電子版。Oreilly的《Java in a nutshell》也是一個不錯的選擇。讀完以上兩本後,你可以看看翁愷老師的視頻,接著可以研究《Thinking in Java》了。
2. Java數據結構
市面上關於Java數據結構的書本身就很少很少。大致有APress 的《Java Collections》,Jones 和Bartlett 的《Data Structures in Java》、《Object-oriented Data Structures Using Java》以及Prentice Hall 出版的《Data Structures and Algorithms in Java》 (Dec 19, 2005)還有一本就是《Data Structures And Algorithms With Object-oriented Design Patterns In Java》。很幸運我的第一本英文書就是APress 的《Java Collections》(本書在國內可能根本就沒有中文版――只能下載英文版了),很不錯,講得很有條例、很簡單,是一本完完全全Java Collections API介紹的書籍,其中不凡有擴展API的例子。這是我推薦你學習java數據結構的唯一一本好書。其它的Jones 和Bartlett的那兩本國內好像有一本中文版,想看你也可以看看。
在學習完API後,你可以看看java.util包中對應的類了。不過只有在學習過設計模式後你才有可能完全理解整個Java Collections Framework。Java Collections Framework使用了很多著名的設計模式如:迭代器(Iterator)模式,工廠方法模式、裝飾器模式、適配器模式等等。通過研究java.util包中數據結構的源代碼,你可以知道臭名昭著的Properties類的設計了,同時可能基本具備設計簡單的數據結構的能力了。
所謂學習無止境,學習完Sun提供了Java Collections Framework後,你可以研究Apche的另一個Java Collections Framework,很有意思哦。互為補充的兩個Framework。
在大家學習、研究Java Collections之前,我提示一下Java Collections主要包括以下三部分:介面(Interface)、實現(Implemention)和演算法(Algorithm)。
1. 介面主要有List、Set、Queue和 Map。List 、Se t和Queue是 Collection介面的子介面。
2. 實現主要是實現這些介面的具體類。如實現List介面的ArrayList、LinkedList、Stack和Vector;實現Set介面的HashSet、TreeSet 和LinkedHashSet;實現Queue介面的PriorityQueue、SynchronousQueue等等;實現Map介面的HashMap、TreeMap、Hashtable、Properties、WeakHashMap等等。
3. 演算法主要是由Arrays類和Collections類提供的,它是整個Java Collection Framework演算法的核心。支持各種類型的排序,查找等常用操作。
Java Collections中包含兩個版本的數據結構,主要是原先的支持同步的數據結構和後來不支持同步的數據結構。
Java Collection Framework在使用Comparator和Comparable介面支持排序。同時提供新舊兩個版本的迭代器Iterator和Enumeraton,以及它們如何轉換等等。
在java.util包中的Obserable介面和Observer類是考察者模式的核心。
……
3. Java IO
市面上關於IO的書籍也僅僅只有Oreilly出版社的兩本,都是Elliotte Rusty Harold的著作。兩本書的風格基本一致,推薦閱讀是第一版的《Jvava I/O》,講得比較淺顯,內容相對比較集中,實例也很多。第二版今年5月國外才出版,很有幸我在網路上下載了第二版,講得極其詳細――726頁的大塊頭(我化了兩個星期),這次將NIO和IO和在一起,還包括J2ME部分的,不過串口、並口通信部分好像類庫支持不夠,自己不能實際操作。
與第一版的《Jvava I/O》一起的Oreilly還有一本《Jvava NIO》,也是很不錯的哦。
大家在依次閱讀完《Jvava I/O》以及《Jvava NIO》後,可以研究java.io包中的源代碼了。在大家研究源代碼前我給點提示:
Java的io包主要包括:
1. 兩種流:位元組流(byte Stream)和字元流(character stream),這兩種流不存在所謂的誰代替誰、誰比誰高級之說,它們互為補充,只是側重點不同而已。
2. 兩種對稱:1.位元組流、字元流的對稱;2.輸入、輸出的對稱。
3. 一個橋梁:將位元組流轉變為字元流的InputStreamReader和OutputStreamWriter。
其中必須注意:
1. PipedInputStream和PipedOutputStrem是兩個比較有趣的類。
2. 支持Buffered的流是我們經常使用的類。
3. 裝飾器(Decorator)模式在java最著名的應用就是用於io的設計。仔細研究各個Filter流與具體流的關系,多看設計模式的書籍。相信你會有所所獲。
4. 學習好io包,是研究net包,rmi包……的基礎哦!
4 . Java資料庫
資料庫的書籍太多太多了,也是太爛太爛了!這方面的書我基本都研究過,推薦的你就看看Apress的《JDBC Recipes A Problem Solution Approach 》很不錯,國外2005年底才出版,(國內好像沒有中文版,不過出了中文版也不一定值得看――國內經常將國外的書翻譯得一塌糊塗、不堪入目)不過我們真的很幸運,網路上有電子版的。值得一看。推薦我看的第一本比較滿意的――Wiley出版的《Java Database Bible》,講得很不錯!Sun公司自己的關於JDBC API介紹的那一本《JDBC API Tutorial andRefernece》也不錯。我第二本JDBC的就是研究的這套API。
不過目前這些書都是一些相對比較浮淺的API應用的書籍。有機會我會給大家帶來介紹JDBC API以及JDBC實現內部細節的書!我盡快努力,同時希望得到大家的支持!
順便給學習JDBC的朋友一點提示:
JDBC的學習和使用主要是這套API,其使用過程也是極其簡單,下面是使用JDBC的一般流程:
1. 載入某個資料庫的驅動(Driver類),通常使用Class.forName(「驅動的類名「);
2. 連接資料庫――
Connection con = DriverManager.getConnection(url,username,password);
3. 得到會話――Statement stmt = con.createStatement();
4. 執行操作――Result rs = stmt.executeQuery(「SQL查詢語句」);
5. 處理結果――
while(rs.next()){
String col1 = rs.getString(1);
……
}
簡單吧!整個JDBC中可以變化的一般是:
1. 可以由Connection對象創建Statement、PreparedStatement和CallableStatement創建三種類型的Statement。
2. 可以創建多種類型的ResultSet:支持單向移動和個自由移動;可更新的和不可更新的;支持不同等級的交易的…..
3. 數據輸入的批處理。
4. 結果集中特殊類型(Blob、Clob、Arrary和Ref、Struct)列的操作。
5. 這些特殊類型的錄入資料庫。
6. javax.sql包中特殊結果集(CachedRowSet、JdbcRowSet、WebRowSet)的操作。
7. 其它的就是一個DataSource了,也很簡單!一個J2EE中的被管理對象
簡單吧!相信大家很快就會征服JDBC。
5. Java 網路編程
網路編程――一個神秘的、充滿挑戰的方向。不過在談Java網路編程之前首先感謝Sun公司的開發人員,因為它們天才的設想,充滿智慧的架構,使廣大java程序員學習java網路編程變得異常簡單。
Java網路編程方面的書,我推薦O'Reilly的《Java Network Programming》,目前已經第三版了,以前的版本市面上肯定有!網路上早有第三版的電子版,國外2004年出版,706頁哦!講得很全,比較深入,太深入的可能由於Sun有些東西沒有完全公開,所以也就不好講了,有興趣的可以下載看看!第二本還是O'Reilly 1998年出版的《Java distributed computing 》,基礎部分寫得比較詳細,後面的實例還是值得研究的。
在大家閱讀這些書之前,給大家一點提示:
java網路編程其實相對比較簡單,入門也很快很快。java網路編程主要包括兩個部分:1.Socket;2.URL部分。不過第二部分也完全建立在第一部分的基礎上。
1. Socket包括客戶端的Socket和伺服器端的ServerSocket。還有就是DatagramSocket和DatagramPacket,它對應於UDP通信協議。 總之,Socket部分是建立其它高級協議的基礎。
2. URL類是一個網路資源定位器,通常和具體的網路協議如HTTP,FTP,Telnet……相關。通過該類可以連接網路上的資源,通過其openStream可以以io包中的流(InputStream)的形式讀取網路資源;通過其OpenConnection方法,可以打開一個連接,在此連接上可以不僅可以完成讀的操作,還可以完成寫的操作。
Java的網路編程大體包括以上兩部分。網路編程和IO以及多線程部分非常密切,在學習此部分前大家一定對這兩部分了解比較透徹。
學習了以上部分你可以研究java.net包中的與此相關的源代碼了!研究所有的源代碼還為時尚早。在整個net包中包含:ContentHandlerFactory、URLStreamHandlerFactory、URLStreamHandler、URLClassLoader等輔助類,它們構成了java.net網路編程的框架,通過研究其源代碼,你不僅可以快速理解java.net包,還可以為以後擴展該包打下基礎,甚至可以將此思維方式運用到自己的項目中。
到此為止你對java.net包應該才了解60%,還有一部分你可以使用JDecompiler之類的反編譯軟體打開你JDK安裝目錄下\jdkxxx\jre\lib目錄中的rt.jar,用WinRAR之類的軟體打開它的sun.net包,反編譯所有的文件,它是URL類工作的細節。當研究完該sun.net包,你就會對整個網路編程很熟悉很熟悉了。
一切看起來我們已經對網路編程很精通了。其實不然,剛剛開始而已,要想深入,請繼續吧!網路上很多優秀的網路編程庫甚至軟體可以為我們「添加功力」。如Apache的HttpCore和HTTPConnection 是兩個和HTTP協議相關庫;JGroups是研究分布式通信、群組通信的必讀庫;接著我們可以研究P2P的軟體包,如Sun公司的JXTA,它可能是java平台點對點通信未來的標准哦!接著你可以研究成熟得不得了,使用極其廣泛得P2P軟體Azureus!www.sourceforge.net可以下載到!
千里之行始於足下!Just do it !(目前我也只研究了net包,其它的會在不久的將來繼續深入。Sun公司因為某些原因沒有公開net的其它實現細節,在其允許將其源代碼以文字的形式加以研究,以及允許將其沒有公開的實現寫入書中時,我很希望能出一本java網路編程的書籍,以飧廣大讀者!!)
6. Servlet和JSP
Servlet、JSP的書也是滿地都是!值得推薦的也僅僅兩三本。實推Addison Wiley的《Servlets and JavaServer pages :The J2EE Technology Web Tier》,又是一本很厚的哦!國外2003年出版、784頁,講得比較全,例子也很多,特別是第八章Filter,舉了幾個不錯的例子。其它所有我看到的關於Servlet和JSP的書都沒有如此深入的!(可能有我沒有看到而已)。O』reilly的《Java Servlet Programming》和《Java Server Pages》相對比較好懂一些,可以讀讀!
在大家學習Servlet和Jsp之前我還是要提醒一下:
本質上說Servlet就是一個實現Servlet介面的、部署於伺服器端的伺服器端的程序罷了!它可以象寫其它任何java應用程序一樣編寫,它可以操作資料庫、可以操作本地文件、可以連接本地EJB……編寫Servlet程序的一般流程為:
1. 繼承一個HttpServlet類;
2. 覆蓋其doGet、doPost方法;
3. 在覆蓋方法的內部操作方法參數HttpServletRequest和HttpServletResponse。
4. 讀取請求利用HttpServletRequest。利用HttpServletRequest你可以操作Http協議的協議頭、可以得到請求的操作方法、可以得到請求的路徑、可以得到請求的字元串、以及和請求客戶相關的信息,更主要的你可以得到Cookie和HttpSession這兩個對象。
5. 利用Cookie你可以操作「甜心」對象或者將其寫入HttpServletResponse中。
6. 向客戶輸出信息可以使用HttpServletResponse。使用HttpServletResponse可以寫入各種類型的協議頭、可以增加Cookie、可以重定向其它URL、可以向客戶發送Http協議的狀態碼。
7. 利用HttpSession在會話內完成你想實現的任何功能。
同時Servlet還提供了一些事件和事件監聽器(簡單的觀察者模式而已)。還有就是過濾器(Filter)和包裝器(ServletRequestWrapper、ServletResponseWrapper)――簡單的流的使用和裝飾器模式的使用。
學習Sevlet、JSP必然要部署到伺服器中,記住通常文件部署的步驟和參數的設置以及在程序中如何使用就可以了。
完全理解Servlet後,學習jsp相對比較容易了!Jsp完全建立在Servlet的基礎上,它是為了迎合那些喜歡在Html文檔中嵌入腳本(如:PHP之類的網頁編程語言)的程序員的需要罷了!學起來也相當的容易!
一切看起來似乎那麼的風平浪靜,簡單好學!簡單的表象背後有其復雜的機理。要想對Servlet和Jsp徹底研究,你得研究Tomcat等開源軟體的具體實現。它無非就是一個伺服器,在客戶利用網頁通過HTTP協議向伺服器發送請求後,伺服器將此HTTP請求轉化為相應的HttpServletRequest對象,調用你編寫的Servlet罷了,在你的Servlet中你肯定操作了此HttpServletRequest了吧,同時操作了HttpServletResponse了吧,伺服器就將此HttpServletResponse按照HTTP協議的要求利用HTTP協議發送給你的瀏覽器了!在伺服器端的Jsp網頁在被客戶請求後,Tomcat會利用編譯軟體,使用javax.servlet.jsp包中的模板,編譯此jsp文件,編譯後就是一個Servlet!以後的操作和Servlet完全一樣哦!
在Servlet和Jsp的基礎上出現了,所謂的高級技術:JSTL,Struts……無非就是一些標簽和MVC模式的使用。
繼續前進吧!勝利就在前方!!
7. 多線程
一個看起來很神秘,卻很容易上手、很難精通的方向!
我推薦兩本我感覺很好的書籍。首先是我第一本能上手看的這方面的書,Sams 1998年出版的《Java Thread Programming》,寫得暴好,很容易讀懂,我有空還時常看當時的筆記!要知道怎麼好你自己看吧!第二本OReilly三次出版的《Java Threads》,最新是2004版,國內好像有中文版,推薦你還是看英文版的吧!書中談到了與多線程相關的N個方向,如IO、Swing、Collection等等。
給大家一點提示吧!java類庫中與多線程相關的類不是很多,主要有:Thread、ThreadGroup以及ThreadLocal和InheritableThreadLocal四個類和一個Runnable介面;關鍵字synchronize、volatile ;以及Object對象的wait、notify、notifyAll方法!
1 Thread是多線程的核心類,提供了一系列創建和操作多線程的方法。
2 ThreadGroup是一個管理Thread的工具類。
3 ThreadLocal和InheritableThreadLocal為Thread提供了一個類似保險箱功能的存儲線程對象的類!
4 Runnable不用說了吧!
5 synchronize是同步方法和同步塊的核心哦!多個線程調用此方法時,只有一個線程可以使用此方法,其它方法阻塞,從而保證被操作對象內部狀態完整性。某個線程調用帶有synchronize的方法或塊時會得到該對象的對象鎖,完成塊中的操作後釋放此對象鎖,從而其它對象可以繼續操作。
6 wait、notify、notifyAll提供了有效的等待/通知機制。Java語言中每一個對象都有一個休息室,任何線程在其操作的對象的狀態不滿足的情況下,在該對象的休息室中休息,釋放對象鎖;當其它線程操作該對象後,喚醒休息室中的線程,它們再檢查條件,當條件滿足後,執行相應的操作。
多線程大致就這么多基礎的!簡單嗎!這對於一個真正的程序員應該是不夠的,真正對多線程要有所掌握,請您研究java.util.concurrent包吧!大師Doug Lea的作品,原先是一個開源的一致性編程的庫,後來被Sun公司並入java類庫。作者的網站上也有另外一個版本的該類庫!值得研究的好東西!Hibernation、OpenJMS等開源軟體都使用了此包!
8. 設計模式
談到設計模式很多人多會推薦GOF的那本,該書在Amzon上是五星級的推薦書籍。不過對於學習java沒多久的、特別是java初學者,我很不推薦這本書。主要是該書的例子基本都是C++的,很多細節沒有講述得足夠清楚。
我給大家推薦的第一本是閻宏博士的《Java 與模式》,它是第一本中國人自己寫的關於設計模式的書籍,寫的比較有趣,融合了很多中華民族的文化和觀念,例子、類圖都比較多,且相對簡單!非常不錯的入門書籍――又是大塊頭哦!
其次我推薦Wiley出版社出版的《Pattern In Java》一套三本,我才看了第一本,好像第二本不怎麼樣,第三本還不錯!
第三本是中文翻譯版的關於多線程模式的(很難得的中文翻譯版)中國鐵道出版社2003年出版的《Java多線程設計模式》,將多線程模式講得非常淺顯,配有大量的圖例,每章都有習題,最後有答案!我研究多線程模式就是由它開始的!
第四本,今年出版的Head First系列的《Head First Design Pattern》,秉承Head First系列圖書的優點,大量的類圖、豐富的實例、有趣的註解,值得購買!
其次在J2EE方向你可以研究閱讀Addison Wesley 2002年出版的《Patterns of Enterprise Application Architecture》,眾多大腕的作品,講企業消息集成的!Sun提供的《J2EE PATTERNS SL500》也很好!晚了推薦那一本Amzon 4星半的《Holub on patterns》,大師的作品,提供了,很值得研究的例子,不過對上面四本不是很熟悉的讀者,最好不要讀它!可能會讓你比較累!
我學習設計模式經過一段很曲折的路線,前前後後大約看了20本,閻宏博士的《Java 與模式》我看了4遍,還排除我第一次基本沒看懂的看!記得研一時老師給我們講了GOF的那本,作為選修課,我和它們計算機系的碩士、博士們一起,到最後一個班40-50個人,不超過3個人明白,我也沒有明白任何一點(基礎差吧――主要我對C++語言一點都不了解),憑我不伏輸的性格,我認為我對java語言理解還可以,我就借了《Java 與模式》,結果還是基本沒看懂。很有幸的是讀研三時,聽過了上交大饒若楠老師關於Java OOP語言的講座,我懂了組合書籍模式等三種設計模式後,對其它模式有了強烈的興趣和要征服它的願望!工作後我買的第一本就是《Java 與模式》,第一遍花了2個月研究了這個1000多頁的大塊頭,後來第三遍15天左右就可以搞定,筆記記了一大本!從此一發不可收拾。
選對書、埋頭研究。相信很快就會入門的!
學習Java語言8個簡單的部分,這只是我們研究Java語言的開始!這些都懂了充其量一個java程序員而已,後面的路很長很長!我們可以繼續研究資料庫實現的源代碼、Servlet伺服器的源代碼、RMI、EJB、JNDI、面向方面編程、重構、ANT工具、Eclipse工具、Spring工具、JBoss、JOnAS、Apache Geronimo等J2EE伺服器!研究了這些你可能會成為一個出色的J2EE Architecture!你可以繼續研究剖析器、編譯器、JNODE(java寫的操作系統)……
感謝大家有此耐心,聽我羅羅嗦嗦大半天!感謝大家的閱讀,感謝群里的朋友!這篇文章主要應群里朋友的呼聲――不知道如何選書、不知道從何看起!大半天的功夫完成趕此文章,字句上難免有失誤,同時由於能力有限不凡有錯誤!請閱讀後批評指正!
上面基本是我研究java語言的順序,以上書籍都是我閱讀過的,不存在替任何出版社宣傳的成分!有的方法可能不適合你,假如你能收獲一點,兩點甚至更多,請你不要吝嗇推薦給你的朋友――共同學習!
感謝大家的閱讀;感謝互聯網的設計者;感謝java的設計師;感謝www.open-open.com和www.sourceforge.net網站!
㈣ Java程序設計之網路編程的內容簡介
本書內容共分為3部分。第1部分講解Java程序設計的基礎知識,包括Java的簡單數據及程序流程式控制制、面向對象設計思想、類、對象、介面、異常處理以及標准類庫等內容;第2部分講解Java程序設計的一般知識,包括GUl編程、輸入輸出設計、資料庫訪問以及多線程編程等內容;第3部分講解Java網路程序設計的高級知識,包括Java安全、JavaBean組件、套接字編程、Java網路編程(涉及Servlet/JSP技術)以及Java EE和Java ME等內容。在本書的第2版中,圖形編程和Web編程(JavaEE流行框架)部分得到了補充和完善。
本書重點放在Java程序設計語言基礎以及Java網路編程技術上,同時力求重點突出,覆蓋面廣。各章均提供了豐富的實例和練習,並將在網上提供相應內容的多媒體課件(PPT格式)。全書由淺入深、實例生動、易學易用,可以滿足不同層次讀者的需求。本書可作為普通高等院校應用型本科(含部分高職高專)相關專業的程序設計教材,也可作為軟體開發人員的參考書。
㈤ Java網路編程從入門到精通(4):DNS緩存
在通過DNS查找域名的過程中 可能會經過多台中間DNS伺服器才能找到指定的域名 因此 在DNS伺服器上查找域名是非常昂貴的操作 在Java中為了緩解這個問題 提供了DNS緩存 當InetAddress類第一次使用某個域名(如)創建InetAddress對象後 JVM就會將這個域名和它從DNS上獲得的信息(如IP地址)都保存在DNS緩存中 當下一次InetAddress類再使用這個域名時 就直接從DNS緩存里獲得所需的信息 而無需再訪問DNS伺服器
DNS緩存在默認時將永遠保留曾經訪問過的域名信息 但我們可以修改這個默認值 一般有兩種方法可以修改這個默認值
在程序中通過java security Security setProperty方法設置安全屬性nel的值(單位 秒) 如下面的代碼將緩存超時設為 秒
java security Security setProperty( nel );
設置java security文件中的neorkaddresl屬性 假設JDK的安裝目錄是C jdk 那麼java security文件位於c jdk jrelibsecurity目錄中 打開這個文件 找到nel屬性 並將這個屬性值設為相應的緩存超時(單位 秒)
如果將nel屬性值設為 那麼DNS緩存數據將永遠不會釋放 下面的代碼演示了使用和不使用DNS緩存所產生效果
package mynet;import *;publicclass MyDNS{publicstaticvoidmain(String[]args)throwsException{//args[ ]:本機名args[ ] 緩沖時間if(args length< )return;java security Security setProperty( nel args[ ]);longtime=System currentTimeMillis();InetAddressaddresses []=InetAddress getAllByName(args[ ]);System out println( addresses : +String valueOf(System currentTimeMillis() time)+ 毫秒 );for(InetAddressaddress:addresses )System out println(address);System out print( 按任意鍵繼續 );System in read();time=System currentTimeMillis();InetAddressaddresses []=InetAddress getAllByName(args[ ]);System out println( addresses : +String valueOf(System currentTimeMillis() time)+ 毫秒 );for(InetAddressaddress:addresses )System out println(address);}}
在上面的代碼中設置了DNS緩存超時(通過args[ ]參數) 用戶可以通過命令行參數將這個值傳入MyDNS中 這個程序首先使用getAllByName建立一個InetAddress數組 然後通過System in read使程序暫停 當用戶等待一段時間後 可以按任意鍵繼續 並使用同一個域名(args[ ])再建立一個InetAddress數組 如果用戶等待的這段時間比DNS緩存超時小 那麼無論情況如何變化 addresses 和addresses 數組中的元素是一樣的 並且創建addresses 數組所花費的時間一般為 毫秒(小於 毫秒後 Java無法獲得更精確的時間)
測試
執行如下命令(將DNS緩存超時設為 秒)
java mynet MyDNS
運行結果 (在 秒之內按任意鍵)
addresses : 毫秒/ 按任意鍵繼續addresses : 毫秒/
運行結果 (在 秒後按任意鍵)
addresses : 毫秒/ 按任意鍵繼續addresses : 毫秒/
在上面的測試中可能出現兩個運行結果 如果在出現 按任意鍵繼續… 後 在 秒之內按任意鍵繼續後 就會得到運行結果 從這個結果可以看出 addresses 所用的時間為 毫秒 也就是說 addresses 並未真正訪問DNS伺服器 而是直接從內存中的DNS緩存得到的數據 當在 秒後按任意鍵繼續後 就會得到運行結果 這時 內存中的DNS緩存中的數據已經釋放 所以addresses 還得再訪問DNS伺服器 因此 addresses 的時間是 毫秒(addresses 和addresses 後面的毫秒數可能在不同的環境下的值不一樣 但一般情況下 運行結果 的addresses 的值為 或是一個接近 的數 如 運行結果 的addresses 的值一般會和addresses 的值很接近 或是一個遠比 大的數 如 )
測試
執行如下命令(ComputerName為本機的計算機名 DNS緩存超時設為永不過期[ ])
java mynet MyDNS ComputerName
運行結果(按任意鍵繼續之前 將 刪除)
addresses : 毫秒myuniverse/ myuniverse/ 按任意鍵繼續addresses : 毫秒myuniverse/ myuniverse/
從上面的測試可以看出 將DNS緩存設為永不過期後 無論過多少時間 按任意鍵後 addresses 任然得到了兩個IP地址( 和 ) 而且addresses 的時間是 毫秒 但在這時 已經被刪除 因此可以判斷 addresses 是從DNS緩存中得到的數據 如果運行如下的命令 並在 秒後按任意鍵繼續後 addresses 就會只剩下一個IP地址( )
java mynet MyDNS ComputerName
如果域名在DNS伺服器上不存在 那麼客戶端在進行一段時間的嘗試後(平均為 秒) 就會拋出一個UnknownHostException異常 為了讓下一次訪問這個域名時不再等待 DNS緩存將這個錯誤信息也保存了起來 也就是說 只有第一次訪問錯誤域名時才進行 稱左右的嘗試 以後再訪問這個域名時將直接拋出UnknownHostException異常 而無需再等待 秒鍾
訪問域名失敗的原因可能是這個域名真的不存在 也可能是因為DNS伺服器或是其他的硬體或軟體的臨時故障 因此 一般不能將這個域名錯誤信息一直保留 在Java中可以通過neorkaddresl屬性設置保留這些信息的時間 這個屬性的默認值是 秒 它也可以通過java security Security setProperty方法或java security文件來設置 下面的代碼演示了neorkaddresl屬性的用法
package mynet;import *;publicclass MyDNS {publicstaticvoidmain(String[]args)throwsException{java security Security setProperty( neorkaddresl );longtime= ;try{time=System currentTimeMillis();InetAddress getByName( );}catch(Exceptione){System out println( 不存在!address : +String valueOf(System currentTimeMillis() time)+ 毫秒 );}//Thread sleep( );//延遲 秒try{time=System currentTimeMillis();InetAddress getByName( );}catch(Exceptione){System out println( 不存在!address : +String valueOf(System currentTimeMillis() time)+ 毫秒 );}}}
在上面的代碼中將neorkaddresl屬性值設為 秒 這個程序分別測試了address 和address 訪問(這是個不存在的域名 讀者可以將其換成任何不存在的域名)後 用了多長時間拋出UnknownHostException異常
運行結果
不存在!address : 毫秒不存在!address : 毫秒
我們從上面的運行結果可以看出 address 使用了 毫秒就拋出了異常 因此 可以斷定address 是從DNS緩存里獲得了域名不可訪問的信息 所以就直接拋出了UnknowHostException異常 如果將上面代碼中的延遲代碼的注釋去掉 那麼可能得到如下的運行結果
不存在!address : 毫秒不存在!address : 毫秒
從上面的運行結果可以看出 在第 秒時 DNS緩存中的數據已經被釋放 因此 address 仍需要訪問DNS伺服器才能知道是不可訪問的域名
在使用DNS緩存時有兩點需要注意
可以根據實際情況來設置nel屬性的值 一般將這個屬性的值設為 但如果訪問的是動態映射的域名(如使用動態域名服務將域名映射成ADSL的動態IP) 就可能產生IP地址變化後 客戶端得到的還是原來的IP地址的情況
lishixin/Article/program/Java/hx/201311/11147
㈥ 有過java socket網路編程經驗的人進來指導下
這兩個問題都可以通過消息機制來解決,
消息機制就是雙方約定的通信語言。
首先:你需要自定義一份雙方約定的通信機制,
其次: 對每個連進來的客戶按用戶ID或IP進行編號存入哈希表,以方便索引用戶的Socket通道。 每進來一個客戶就 hashtable.put(user.name, socket);
最後:雙方都還要有兩個緩沖數組(可以是數組Object[],也可以是Vector,Arraylist,Hashtable都可以);
一個叫發送緩沖區,一個叫接收緩沖區。每一個都附帶一個管理線程。
向客戶端發送消息時,並不是馬上就發送,而是將消息推入到發送緩沖區排隊,
發送緩沖區的線程會每隔一小片時間後就掃描並 pop出一個可發送的消息。
分析這個消息的源發送者和目的發送者,然後hashtable的索引找到目的發送者的socket通道。並發送.
另一個叫接收緩沖區。 Socket的網路線程不斷接收到客戶的消息,但不是馬上就處理,也不會自己親自處理,而是壓入接收緩沖隊列等待緩沖隊列來處理,自己休息片段又立馬再去接收別的客戶發過來的消息。 接收緩沖區有自己的線程,它每sleep一小片刻時間後就掃描隊列中有無消息到達,如果有(網路線程剛壓進一的),則可以採用監聽器模式讓監聽器處理,如果不想那麼復雜也可以自己處理, 會分析消息來源和去向,從去向中分析出將要發送給某人,但自己並不發送,而是直接壓入到發送緩沖區(這里就接到前面的發送緩沖區介紹中去了)
最後是消息機制的設計。
我公司的游戲都是由我來設計通信機制,實現三網合一,即手機,PC,電視機頂盒三種客戶端同玩一桌麻將游戲
一般java設計的游戲中設計如下:
一. 消息頭 二.消息體
消息頭設計格式如下: 1. 本消息包長度,以方便解析位元組;2. 本消息類型TYPE:如一般消息,游戲消息,大廳消息,聊天消息;3.本消息命令類型COMMAND: 如登陸、個人資料修改、登出、聊天。。。。
消息體設計格式一般根據Type和command不同而有不同。 如聊天消息包含四個欄位,String 聊天內容、 User 發送者、 User 接收者、Text文字排版信息
服務端SeverSocket收到這個消息後,壓入接收緩沖區, 接收緩沖線程分析其中結構,根據Type和Command的類型實例化出相應消息類, 該消息類能自動將後面的位元組流實例化自身的欄位。從而得到接收方和發送方, 得到接收方後再將消息封裝好壓入到發送隊列
這個結構除完全適合聊天系統以外,以後要加入新內容將會非常容易!
如果有什麼疑問歡迎call我, 我不負責寫代碼,但可以指點你。 另外,我的回答記錄中有用nio設計的聊天室BBS代碼。也是幫一個學生做的。你可以看看
㈦ java網路編程的介紹
《Java網路編程》第三版會為你介紹Java網路API的最新特性。本書討論了JDK1.4和1.5(現在已命名為J2SE5)中所做的所有修改和增補。本書內容全面,涵蓋了從網路基礎知識到遠程方法調用(RMI)等各方面的內容,書中章節涉及到TCP和UDPsocket、伺服器socket、URL和URI、組播以及特殊用途的API(如JavaMail)等等。本書展示了如何使用JSSE編寫安全的網路應用程序,解釋了如何使用NIOAPI編寫超高性能的伺服器。它還涵蓋了Java對網路代理、Webcookie和URL緩存的支持。
㈧ java 網路編程傳輸對象問題 求大神指導 謝謝
傳數據一般建議用json,像你這種之間吧對象傳過去的話不用再客戶端建user,你服務端需要用ObjectOutputStream對象去把你有數據的user序列話成流傳輸過去,客戶端直接用ObjectInputStream讀取這個流,對象就是Object,但是這個object就是你user的數據了,如果非要弄成user需要用反射把裡面的數據set到你客戶端的user中,這個沒法直接轉過去,不是一種class,所以只能反射再set
㈨ 高手指導:用java 網路編程編寫兩台計算機的即時通訊軟體。要看什麼內容
1.實現兩台計算機聊天和發接文本文檔,主要涉及Socket和多線程編程
2 需要安裝JDK1.6,配置環境變數,再安裝Jcreator。Jcreator的操作截面超級簡單。
3 如果你有C/C++的基礎,你可參考《Java程序設計實用教程》和《Java程序設計實用教程實驗指導,實訓和習題解答》(趙歡主編,中國水利電力出版社 2009年)。書的第8章就有一個即時通訊的小項目,應該能解決你的困惑。
㈩ java網路編程
我也才寫了一個,我不想看代碼
你可以把發送和接受信息都寫在一個死循環里
客戶端:1.發送 2.接受
服務端:1.接受 2.發送
這個接收我第一個代碼用的BufferedRedaer br = new BufferedReader(new InputStreamReader(in))
br.readline();//這個是阻塞式的,不接受到消息它是不會往後執行的,更ServerSocket里的accept方法一樣的
客戶端發送了就會卡在接受那,而伺服器這邊就會收到,伺服器就會執行回復的輸入,回復輸入後,客戶端這邊就能接收到,就這樣循環
第一次寫的時候用的是PrintWriter進行發送,用inputstream的read方法讀出來會不對
printwriter的write方法就是寫入緩存,要用到String的getbytes方法,注意要使用flush方法清空緩存
讀取用的是BufferedReader