Java Socket傳輸如何完成自己的網(wǎng)絡(luò)任務(wù)
Java Socket傳輸?shù)奈覀兪褂玫臅r(shí)候有許多都是在網(wǎng)上實(shí)現(xiàn)的,我們的目的實(shí)現(xiàn)了,并且birthday沒有被串行化;如果我們不講Address實(shí)現(xiàn)Serializable,會發(fā)生異常:java.io.WriteAbortedException: writing aborted
Java Socket傳輸IO流
我們都知道Java Socket傳輸?shù)腎O是一個(gè)極其龐大的類家族,也正是運(yùn)用了裝飾模式的經(jīng)典場景;可見,我們一部分管道是直接連接了數(shù)據(jù)源,或者直接輸出到數(shù)據(jù)源,他們能夠直接讀數(shù)據(jù)或者寫數(shù)據(jù),我們上一節(jié)中使用的FileoutputStream和FileInputStream就是這樣的管道,他們的數(shù)據(jù)源就是指存在文件系統(tǒng)中的文件;下一部分我們要求使用的ByteArrayInputStream和ByteArrayOutputStream也是這樣的管道,不過他的數(shù)據(jù)源是存在內(nèi)存中的數(shù)組;他能夠通過write把數(shù)據(jù),字符串等等寫進(jìn)這塊數(shù)組區(qū)域,并且能夠得到一個(gè)完整的字節(jié)數(shù)組。#t#
而另外的一部分則不能直接與數(shù)據(jù)源發(fā)生讀寫交互,他主要用于裝飾上一部分的管道,給這個(gè)管道賦予更加便捷的功能,諸如BufferedReader等等的,主要是提供了緩存,就好比給上一部分管道中間提供了一個(gè)“蓄水池”,這個(gè)“蓄水池”等到“水流”到了一定的程度的時(shí)候,才會一次性的流進(jìn)或者流出等等,諸如ObjectInputStream和ObjectOutputStream,他們能夠直接讀寫一個(gè)Object,但是這個(gè)Object被寫到了哪里,是內(nèi)存中的字節(jié)數(shù)組還是文件文件的文件中,而必須委托給其他管道實(shí)現(xiàn);
在網(wǎng)絡(luò)中傳輸對象
在網(wǎng)絡(luò)中的兩臺機(jī)器中傳輸對象,前提首先是基于同一個(gè)平臺,這是序列化的基礎(chǔ),所以這里主要有兩種做法:
采用Java Socket傳輸?shù)男蛄谢瘷C(jī)制,將對象“壓扁”成二進(jìn)制字節(jié),將二進(jìn)制字節(jié)在網(wǎng)絡(luò)中傳輸;
自定義協(xié)議,將對象用字符串描述出來,將字符串用二進(jìn)制表示,在網(wǎng)絡(luò)中傳輸,在另外一邊用相反的策略解析這個(gè)字符串,重新構(gòu)造業(yè)務(wù)對象,這個(gè)方法能夠在異構(gòu)平臺中進(jìn)行傳輸而不變形,但是需要額外的編寫“壓扁”和“充氣”的代碼。