導航:首頁 > 編程語言 > tcpip協議java

tcpip協議java

發布時間:2023-06-04 06:19:29

㈠ TCP/IP協議 怎麼用java發送和接收二進制數據 要具體實例

1.TCP/IP協議要求信息必須在塊(chunk)中發送和接收,而塊的長度必須是8位的倍數,因此,我們可以認為TCP/IP協議中傳輸的信息是位元組序列。如何發送和解析信息需要一定的應用程序協議。

2.信息編碼:

首先是Java里對基本整型的處理,發送時,要注意:1)每種數據類型的位元組個數;2)這些位元組的發送順序是怎樣的?(little-endian還是
big-endian);3)所傳輸的數值是有符號的(signed)還是無符號的(unsigned)。具體編碼時採用位操作(移位和屏蔽)就可以了。
具體在Java里,可以採用DataOutputStream類和ByteArrayOutputStream來實現。恢復時可以採用
DataInputStream類和ByteArrayInputStream類。

其次,字元串和文本,在一組符號與一組整數之間的映射稱為編碼字元集(coded character
set)。發送者與接收者必須在符號與整數的映射方式上達成共識,才能使用文本信息進行通信,最簡單的方法就是定義一個標准字元集。具體編碼時採用
String的getBytes()方法。

最後,位操作。如果設置一個特定的設為1,先設置好掩碼(mask),之後用或操作;要清空特定一位,用與操作。

3.成幀與解析

成幀(framing)技術解決了接收端如何定位消息的首位位置的問題。

如果接收者試圖從套接字中讀取比消息本身更多的位元組,將可能發生以下兩種情況之一:如果信道中沒有其他消息,接收者將阻塞等待,同時無法處理接收
到的消息;如果發送者也在等待接收端的響應消息,則會形成死鎖(dealock);另一方面,如果信道中還有其他消息,則接收者會將後面消息的一部分甚至
全部讀到第一條消息中去,這將產生一些協議錯誤。因此,在使用TCP套接字時,成幀就是一個非常重要的考慮因素。

有兩個技術:

1.基於定界符(Delimiter-based):消息的結束由一個唯一的標記(unique
marker)指出,即發送者在傳輸完數據後顯式添加的一個特殊位元組序列。這個特殊標記不能在傳輸的數據中出現。幸運的是,填充(stuffing)技術
能夠對消息中出現的定界符進行修改,從而使接收者不將其識別為定界符。在接收者掃描定界符時,還能識別出修改過的數據,並在輸出消息中對其進行還原,從而
使其與原始消息一致。

2.顯式長度(Explicit length):在變長欄位或消息前附加一個固定大小的欄位,用來指示該欄位或消息中包含了多少位元組。這種方法要確定消息長度的上限,以確定保存這個長度需要的位元組數。

介面:

Java代碼 import java.io.IOException; import java.io.OutputStream; public interface Framer { void frameMsg(byte [] message,OutputStream out) throws IOException; byte [] nextMsg() throws IOException; }
定界符的方式:

Java代碼 import java.io.ByteArrayOutputStream; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class DelimFramer implements Framer { private InputStream in;//data source; private static final byte DELIMTER=(byte)'\n';//message delimiter public DelimFramer(InputStream in){ this.in=in; } @Override public void frameMsg(byte[] message, OutputStream out) throws IOException { //ensure that the message dose not contain the delimiter for(byte b:message){ if(b==DELIMTER) throw new IOException("Message contains delimiter"); } out.write(message); out.write(DELIMTER); out.flush(); } @Override public byte[] nextMsg() throws IOException { ByteArrayOutputStream messageBuffer=new ByteArrayOutputStream(); int nextByte; while((nextByte=in.read())!=DELIMTER){ if(nextByte==-1){//end of stream? if(messageBuffer.size()==0){ return null; }else{ throw new EOFException("Non-empty message without delimiter"); } } messageBuffer.write(nextByte); } return messageBuffer.toByteArray(); } }
顯式長度方法:

Java代碼 import java.io.DataInputStream; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class LengthFramer implements Framer { public static final int MAXMESSAGELENGTH=65535; public static final int BYTEMASK=0xff; public static final int SHOTMASK=0xffff; public static final int BYTESHIFT=8; private DataInputStream in;// wrapper for data I/O public LengthFramer(InputStream in) throws IOException{ this.in=new DataInputStream(in); } @Override public void frameMsg(byte[] message, OutputStream out) throws IOException { if(message.length>MAXMESSAGELENGTH){ throw new IOException("message too long"); } //write length prefix out.write((message.length>>BYTEMASK)&BYTEMASK); out.write(message.length&BYTEMASK); //write message out.write(message); out.flush(); } @Override public byte[] nextMsg() throws IOException { int length; try{ length=in.readUnsignedShort(); }catch(EOFException e){ //no (or 1 byte) message; return null; } //0<=length<=65535; byte [] msg=new byte[length]; in.readFully(msg);//if exception,it's a framing error; return msg; } }

㈡ Java程序語言有哪些技術優勢呢

IT行業迅速發展,各種編程語言、裝飾設計、平面設計、網站設計等各有各的優點,但是在如此眾多的科目中,Java開發為何能夠20年屹立不倒,仍然成為就業率高,行業發展前景最被看好的一門呢!


Java的最大一個優點就是它的跨平台性。只需要你一次物行編寫好,就能夠運行在各種平台上,這樣系統的移植、平台的遷移變就更容易,更改成本降到最低。下面電腦培訓就具體、全方位的淺談下Java語言的優勢,為什麼現在Java市場需求量供不應求,就業率高,發展前景好!

1.簡單

Java語言是面向對象中的一種,通過提供最基本的方法去完成指定任務,你理解了一些基本概念後,就可以編寫出適合於各種情況的應用程序。

2.面向對象

Java語言的設計集中於對象及其介面,它提供了簡單的類機制以及動態的介面模型。對象中封裝了它的狀態變數以及相應的方法,實現了模塊化和信息隱藏;而類是提供了一類對象的原型,通過繼承的機制,子類能使用父類提供的方法,實現代碼重復使用。

3.分布性

Java是面向網路的語言。通過它提供的類庫可以處理TCP/IP協議,用戶可以通過URL地址在網路上很方便地訪問其他對象。

4.魯棒性

Java在編譯和運行程序時,都要對可能出現的問題進行檢查,以消除錯誤的產生。Java在使用時,通過集成的面向對象的異常處理機制,Java提示出可能出現但未被處理的異常,幫助程序員正確地進行選擇以防止系統的崩潰。同時,Java還可捕獲類型聲明中的許多常見錯誤,防止出現動態運行時不匹配問題。

5.安全性

用於網路、分布環境下的Java必須防止病毒的入侵。Java不支持指針,一切對內存的訪問都必須通過對象的實例變數來實現,這樣就防止了程序員使雹螞擾用「特洛伊」木馬等欺騙手段訪問對象的私有成員,同時也避免了指針操作中容易產生的錯誤。

6.可移植性

與平台無關的特性使Java程序可以方便地移植到網路上的不同機器。同時,Java的類庫中也實現了與不同平台的介面,使這些類庫可以移植。另外,Java編譯器是由Java語言實現的,Java運行源旦時系統由標准C語言實現,這使得Java系統本身也具有可移植性。

7.解釋執行

Java解釋器直接對Java位元組碼進行解釋執行。位元組碼本身攜帶了許多編譯時信息,使得連接過程更加簡單。

8.高性能

和其他解釋執行的語言不同,Java位元組碼的設計很容易地直接轉換成對應於特定CPU的機器碼,可以提交性能。

9.動態性

Java的設計使它適合於一個不斷發展的環境。在類庫中可以自由地加入新的方法和實例變數而不會影響用戶程序的執行。Java通過介面來支持多重繼承,更具有靈活性和擴展性。


㈢ JAVA Socket 底層是怎樣基於TCP/IP 實現的

首先必須明確:TCP/IP模型中有四層結構: 應用層(Application Layer)、傳輸層(Transport Layer)、網路層(Internet Layer
)、鏈路層(LinkLayer)
其中Ip協議(Internet Protocol)是位於網路層的,TCP協議時位於傳輸層的。通過Ip協議可以使可以使兩台計算機使用同一種語言,從而允許Internet上連接不同類型的計算機和不同操作系統的網路。Ip協議只保證計算機能夠接收和發送分組數據。當計算機要和遠程的計算機建立連接時,TCP協議會讓他們建立連接:用於發送和接收數據的虛擬電路。

套接字或插座(socket)是一種軟體形式的抽象,用於表達兩台機器間一個連接的「終端」。針對一個特定的連接,每台機器上都有一個「套接字」,可以想像它們之間有一條虛擬的「線纜」。JAVA
有兩個基於數據流的套接字類:ServerSocket,伺服器用它「偵聽」進入的連接;Socket,客戶端用它初始一次連接。偵聽套接字只能接收新的連接請求,不能接收實際的數據包,即ServerSocket不能接收實際的數據包。
套接字是基於TCP/IP實現的,它是用來提供一個訪問TCP的服務介面,或者說套接字socket是TCP的應用編程介面API,通過它應用層就可以訪問TCP提供的服務。
在JAVA中,我們用 ServerSocket、Socket類創建一個套接字連接,從套接字得到的結果是一個InputStream以及OutputStream對象,以便將連接作為一個IO流對象對待。通過IO流可以從流中讀取數據或者寫數據到流中,讀寫IO流會有異常IOException產生。

㈣ Java怎麼實現對IP/TCP協議數據包的攔截

眾所周知,JAVA語言雖然在TCP/UDP傳輸方面給予了良好的定義,但對於網路層以下的控制,卻是無能為力的。JPCAP擴展包彌補了這一點。

JPCAP實際上並非一個真正去實現對數據鏈路層的控制,而是一個中間件,JPCAP調用wincap/libpcap,而給JAVA語言提供一個公共的介面,從而實現了平台無關性。在官方網站上聲明,JPCAP支持FreeBSD 3.x, Linux RedHat 6.1, Fedora Core 4, Solaris, and Microsoft Windows 2000/XP等系統。

二.JPCAP機制

JPCAP的整個結構大體上跟wincap/libpcap是很相像的,例如NetworkInterface類對應wincap的typedef struct _ADAPTERADAPTER,getDeviceList()對應pcap_findalldevs()等等。 JPCAP有16個類,下面就其中最重要的4個類做說明。

1.NetworkInterface

該類的每一個實例代表一個網路設備,一般就是網卡。這個類只有一些數據成員,除了繼承自java.lang.Object的基本方法以外,沒有定義其它方法。

㈤ java語言有哪些特點

java語言有哪些特點?java語言的主要特點是什麼,相信學習java的朋友都想要深入的了解。

1、easy:java的語法比c++的相對簡單,另一個方面就是java能使軟體在很小的機器上運行,基礎解釋其和類庫的支持的大小約為40kb,增加基本的標准庫和線程支持的內存需要增加125kb。

2、分布式:java帶有很強大的tcp/ip協議族的常式庫,java應用程序能夠通過url來穿過網路來訪問遠程對象,由於servlet機制的出現,使java編程非常的高效,現在許多的大的webserver都支持servlet。

3、oo:面向對象設計是把重點放在對象及對象的介面上的一個編程技術。其面向對象和c++有很多不同,在與多重繼承的處理及java的原類模型。

4、健壯特性:java採取了一個安全指針模型,能減小重寫內存和數據崩潰的可能型。

5、安全:java用來設計網路和分布系統,這帶來了新的安全問題,java可以用來構建防核首備病毒和防攻擊的system。事實證明java在防毒這一方面做的比較好。

6、中立體系結構:java編譯其芹友生成體系結構中立的目標文件格改毀式可以在很多處理器上執行,編譯器產生的指令位元組碼(javabytecode)實現此特性,此位元組碼可以在任何機器上解釋執行。

7、可移植性:java中對基本數據結構類型的大小和演算法都有嚴格的規定所以可移植性很好。

8、多線程:java處理多線程的過程很簡單,java把多線程實現交給底下操作系統或線程程序完成.所以多線程是java作為伺服器端開發語言的流行原因之一。

9、applet和servlet:能夠在網頁上執行的程序叫applet,需要支持java的瀏覽器很多,而applet支持動態的網頁,這是很多其他語言所不能做到的。

java語言有哪些特點?要學習精湛的Java技術,來南邵java培訓南邵北大青鳥學校,助你早日成才。


㈥ Java TCP/IP協議的Socket如何設置埠復用

你的其中一端的連接沒有被及時釋放掉的原因是:你沒有順利地進行TCP連接關閉的流程。最近我就因為這個問題頭疼了好久,現在終於找到真正的原因和解決辦法了!關鍵點是:在調用close之前先發送一次數據(例如,out.write(0);)。接下來我用通俗的語言來闡述原因。

如果你兩端的程序都是在傳送完數據後直接調用Socket的close方法斷開連接的話,這就會有一個調用close方法誰先誰後的問題,先調用者是主動關閉TCP連接的那一方,而後調用者就是被動關閉TCP連接的那一方。

關閉TCP連接的過程中,雙方總共有3個報文需要發送,主動關閉方只需發送1個報文,就是斷開請求的報文,被動關閉方要發送2個報文,分別是 回應主動關閉方發來的斷開請求報文的第一次確認報文和 第二次確認報文,第二次的確認報文用來確認已經沒有數據需要發送了。

主動關閉方發送了斷開請求報文後,就進入了等待被動關閉方發送確認報文的狀態,一般情況下,被動關閉方馬上就會發送第一次確認報文。主動關閉方收到第一次確認報文後,就會等被動關閉方的第二次確認報文,直到超時,套接字資源被操作系統回收(P.S. 雖然書上不是這么說的,但是實際的OS就是這么處理的,原因下面再說)。此時如果被動關閉方發送了第二次確認報文,整個TCP連接關閉流程就順利結束了,所有資源就會被OS回收。

重點來了,問題在於,作為被動關閉方的程序中,在主動關閉方等待被動關閉方發送第二次確認報文時,就算執行了Socket的close也不會發送第二次確認報文,只有向主動關閉方發送數據(任意)後,被動關閉方才會發送第二次確認報文,整個流程才能順利進行,TCP連接的資源才會被釋放,下次才能重復使用同個套接字。

我自己實驗出來的結果是:在兩端的代碼中(只有一端發送一端接收),都只使用

out.write(0);
me.close();

進行TCP連接的斷開,out是Socket的OutputStream,me是已連接的Socket對象。結果,無論重復多少次運行,都能不間斷地順利運行,每次運行結束後,用資源監視器看TCP連接情況,都看到所使用的連接資源都已經被釋放,並沒有等待2MSL時間後才被釋放,所以實際的OS的處理跟理論上的不一樣。所以你的程序要等一段時間後才能再次使用同個埠並不是因為存在2MSL的等待時間,而是因為TCP連接關閉流程沒有順利進行,但是所使用的進程已經退出,OS就會自動幫你回收資源,不過需要等超時後才處理。(P.S. 我測試的OS是Windows)

如果兩端的程序斷開TCP連接時都是直接開始斷開的過程而沒有延時的話,誰是主動關閉方就不確定,兩端的程序中的斷開TCP連接的代碼就得有發送數據的部分,如果其中有一方延時了,那延時的一方就有很大的概率是被動關閉方,另一方在調用close前就不需要發送數據了。

還有,就算TCP連接關閉的流程順利進行,但是,下次使用同個套接字(兩端套接字跟之前的相同)前得延時一下,幾百毫秒就夠了(具體自己調整),因為OS回收套接字資源是需要時間的,關閉TCP連接後就立馬創建兩端套接字跟所關閉的連接的兩端套接字相同的連接也有可能因為仍然被佔用而報錯。

閱讀全文

與tcpip協議java相關的資料

熱點內容
使用過的蘋果手機怎麼同步app 瀏覽:344
phpcookie無效 瀏覽:954
python可以搜數學答案 瀏覽:706
均線衍生指標源碼設置 瀏覽:496
做精一張圖pdf 瀏覽:851
編程培訓小朋友 瀏覽:787
巴克球製作解壓 瀏覽:851
測量參數時接單片機的 瀏覽:116
手機音樂添加文件夾 瀏覽:546
百度智能雲b18怎麼刪除app 瀏覽:968
單片機中為什麼顯示找不到頭文件 瀏覽:151
iisweb伺服器如何重啟 瀏覽:838
微信沒有適配方舟編譯器 瀏覽:81
箍筋加密區梁的凈高 瀏覽:889
samp如何加入外國伺服器 瀏覽:895
保鮮膜解壓教學視頻 瀏覽:983
台達plc編程通訊管理軟體 瀏覽:405
優優pdf 瀏覽:801
程序員職業穿搭 瀏覽:257
程序員軟考大綱 瀏覽:19