『壹』 使用java網路編程編寫SIP消息的收發,TCP和UDP有什麼區別
TCP---傳輸控制協議,提供的是面向連接、可靠的位元組流服務。當客戶和伺服器彼此交換數據前,必須先在雙方之間建立一個TCP連接,之後才能傳輸數據。TCP提供超時重發,丟棄重復數據,檢驗數據,流量控制等功能,保證數據能從一端傳到另一端。
UDP---用戶數據報協議,是一個簡單的面向數據報的運輸層協議。UDP不提供可靠性,它只是把應用程序傳給IP層的數據報發送出去,但是並不能保證它們能到達目的地。由於UDP在傳輸數據報前不用在客戶和伺服器之間建立一個連接,且沒有超時重發等機制,故而傳輸速度很快
UDP
UDP 與 TCP 的主要區別在於 UDP 不一定提供可靠的數據傳輸。事實上,該協議不能保證數據准確無誤地到達目的地。UDP 在許多方面非常有效。當某個程序的目標是盡快地傳輸盡可能多的信息時(其中任意給定數據的重要性相對較低),可使用 UDP。ICQ 短消息使用 UDP 協議發送消息。
許多程序將使用單獨的TCP連接和單獨的UDP連接。重要的狀態信息隨可靠的TCP連接發送,而主數據流通過UDP發送。
TCP
TCP的目的是提供可靠的數據傳輸,並在相互進行通信的設備或服務之間保持一個虛擬連接。TCP在數據包接收無序、丟失或在交付期間被破壞時,負責數據恢復。它通過為其發送的每個數據包提供一個序號來完成此恢復。記住,較低的網路層會將每個數據包視為一個獨立的單元,因此,數據包可以沿完全不同的路徑發送,即使它們都是同一消息的組成部分。這種路由與網路層處理分段和重新組裝數據包的方式非常相似,只是級別更高而已。
為確保正確地接收數據,TCP要求在目標計算機成功收到數據時發回一個確認(即 ACK)。如果在某個時限內未收到相應的 ACK,將重新傳送數據包。如果網路擁塞,這種重新傳送將導致發送的數據包重復。但是,接收計算機可使用數據包的序號來確定它是否為重復數據包,並在必要時丟棄它。
TCP與UDP的選擇
如果比較UDP包和TCP包的結構,很明顯UDP包不具備TCP包復雜的可靠性與控制機制。與TCP協議相同,UDP的源埠數和目的埠數也都支持一台主機上的多個應用。一個16位的UDP包包含了一個位元組長的頭部和數據的長度,校驗碼域使其可以進行整體校驗。(許多應用只支持UDP,如:多媒體數據流,不產生任何額外的數據,即使知道有破壞的包也不進行重發。)
很明顯,當數據傳輸的性能必須讓位於數據傳輸的完整性、可控制性和可靠性時,TCP協議是當然的選擇。當強調傳輸性能而不是傳輸的完整性時,如:音頻和多媒體應用,UDP是最好的選擇。在數據傳輸時間很短,以至於此前的連接過程成為整個流量主體的情況下,UDP也是一個好的選擇,如:DNS交換。把SNMP建立在UDP上的部分原因是設計者認為當發生網路阻塞時,UDP較低的開銷使其有更好的機會去傳送管理數據。TCP豐富的功能有時會導致不可預料的性能低下,但是我們相信在不遠的將來,TCP可靠的點對點連接將會用於絕大多數的網路應用。
『貳』 使用java語言實現tcp和udp文件傳輸,不使用socket類。
你這種說法本身就有待商榷。Java是一種商用開發語言,封裝了很多上層的類完成企專業開發需要屬。目的就是在企業開發中可以快速精準的完成企業開發要求。例如,ServerSocket/Socket幫助你完成tcp協議,DatagramPacket幫助你完成UDP協議。你卻需要自己實現協議。而Java語言本身對於這些底層操作系統相關的調用都比較麻煩。所以,如果你真要了解通信本身的底層協議,建議你用C語言來完成,而不是Java。
建議你的老師也好好了解一下各種語言的使用范圍。在國外Java是不建議在大學的計算機課程中講的,因為這會讓你很難了解操作系統及其整個計算機系統,只能快速完成某些具體開發任務。建議對於計算機科學和計算機體系機構方面的科研教學,使用比較底層的語言,例如C語言。
『叄』 TCP和UDP通信有什麼區別 如何分別用java實現
TCP是面向連接,UDP面向非連接,資料不復制,在這里簡單說下:
TCP建立連接時需要傳說回的三次握手,服務端與客答戶端需要確認對方身份而已,建立好連接後,就開始傳遞消息,直到有一方斷開連接位置。 就好比兩個人打電話,要先通了才能說話。
UDP只是數據報發送,它的優點速度快,並非要向TCP那樣麻煩建立,它只負責將信息發出,但是並不確保信息的准確完整性等,就好比發簡訊,簡訊是出去了,但是中間是否有問題,是否對方手機能收到就不管了。
在java中想要實現上述兩種協議通信,可採用socket建立連接,socket可以理解為碼頭,其實是套接字,這里簡單說下,就好比兩個城市運輸貨物,通過碼頭走貨一樣。至於如何通過socket建立兩個連接,網上資料多的是,在這里不復制例子了。
『肆』 學習java需要學習udp跟tcp嗎
不需要的。
udp和tcp是屬於網路協議,如果能懂點當然是好的,但是就學校java來說,一般是用不到的。
『伍』 關於java寫的TCP,UDP
三個問題一個答案,什麼都不會發生
原因:tcp、udp server程序無非是綁定了一個特定的埠,但是client端使用的埠都是隨機產生的,沒人說client 和server 的tcp和udp埠必須一致哦
建議你去了解下tcp ip的運作機制,就比較容易理解了
『陸』 Java的多線程和網路UDP和TCP怎麼理解它們有什麼聯系
線程是計算機任務執行的最小單位,多線程也就是說一台計算機同時可以干好幾件事,例如同時打字和聽音樂,而單線程就是打字時只能打字,其他的幹不了。
udp和tcp是兩種協議,網路協議是分層的,他們都是傳輸層協議。所以協議就是一組約定的規則,沒有規矩不成方圓嘛。
『柒』 在javasocket網路編程中,開發基於udp協議的程序使用的套接字有哪些
Socket套接字,是由系統提供用於網路通信的技術(操作系統給應用程序提供的一組API叫做Socket API),是基於TCP/IP協議的網路通信的基本操作單元。基於Socket套接字的網路程序開發就是網路編程。
socket可以視為是應用層和傳輸層之間的通信橋梁;
傳輸層的核心協議有兩種:TCP,UDP;socket API也有對應的兩組,由於TCP和UDP協議差別很大,因此,這兩組API差別也挺大。
分類:
Socket套接字主要針對傳輸層協議劃分為如下三類:
流套接字:使用傳輸層TCP協議
TCP,即Transmission Control Protocol(傳輸控制協議),傳輸層協議;
TCP的特點:
有連接:像打電話,得先接通,才能交互數據;
可靠傳輸:傳輸過程中,發送方知道接收方有沒有收到數據.(打電話就是可靠傳輸);
面向位元組流:以位元組為單位進行傳輸.(非常類似於文件操作中的位元組流);
全雙工:一條鏈路,雙向通信;
有接收緩沖區,也有發送緩沖區。
大小不限
對於位元組流來說,可以簡單的理解為,傳輸數據是基於IO流,流式數據的特徵就是在IO流沒有關閉的情況下,是無邊界的數據,可以多次發送,也可以分開多次接收。
數據報套接字:使用傳輸層UDP協議
UDP,即User Datagram Protocol(用戶數據報協議),傳輸層協議。
UDP的特點:
無連接:像發微信,不需要接通,直接就能發數據;
不可靠傳輸:傳輸過程中,發送方不知道接收方有沒有收到數據.(發微信就是不可靠傳輸);
面向數據報:以數據報為單位進行傳輸(一個數據報都會明確大小)一次發送/接收必須是一個完整的數據報,不能是半個,也不能是一個半;
全雙工:一條鏈路,雙向通信;
有接收緩沖區,無發送緩沖區;
大小受限:一次最多傳輸64k;
對於數據報來說,可以簡單的理解為,傳輸數據是一塊一塊的,發送一塊數據假如100個位元組,必須一次發送,接收也必須一次接收100個位元組,而不能分100次,每次接收1個位元組。
原始套接字
原始套接字用於自定義傳輸層協議,用於讀寫內核沒有處理的IP協議數據。
二、UDP數據報套接字編程
UDPSocket中,主要涉及到兩類:DatagramSocket、DatagramPacket;
DatagramSocket API
DatagramSocket 創建了一個UDP版本的Socket對象,用於發送和接收UDP數據報,代表著操作系統中的一個socket文件,(操作系統實現的功能–>)代表著網卡硬體設備的抽象體現。
DatagramSocket 構造方法:
方法簽名 方法說明
DatagramSocket() 創建一個UDP數據報套接字的Socket,綁定到本機任意一個隨機埠(一般用於客戶端)
DatagramSocket(int port) 創建一個UDP數據報套接字的Socket,綁定到本機指定的埠(一般用於服務端)
DatagramSocket 方法:
方法簽名 方法說明
void receive(DatagramPacket p) 從此套接字接收數據報(如果沒有接收到數據報,該方法會阻塞等待)
void send(DatagramPacket p) 從此套接字發送數據報包(不會阻塞等待,直接發送)
void close() 關閉此數據報套接字
DatagramPacket API
代表了一個UDP數據報,是UDP Socket發送和接收的數據報,每次發送/接收數據報,都是在傳輸一個DatagramPacket對象。
DatagramPacket 構造方法:
方法簽名 方法說明
DatagramPacket(byte[] buf, int length) 構造一個DatagramPacket以用來接收數據報,接收的數據保存在位元組數組(第一個參數buf)中,接收指定長度(第二個參數length)
DatagramPacket(byte[] buf, int offset, int length,SocketAddress address) 構造一個DatagramPacket以用來發送數據報,發送的數據為位元組數組(第一個參數buf)中,從0到指定長度(第二個參數length)。address指定目的主機的IP和埠號
DatagramPacket 方法:
方法簽名 方法說明
InetAddress getAddress() 從接收的數據報中,獲取發送端主機IP地址;或從發送的數據報中,獲取接收端主機IP地址
int getPort() 從接收的數據報中,獲取發送端主機的埠號;或從發送的數據報中,獲取接收端主機埠號
byte[] getData() 獲取數據報中的數據
構造UDP發送的數據報時,需要傳入 SocketAddress ,該對象可以使用 InetSocketAddress 來創建。
InetSocketAddress API
InetSocketAddress ( SocketAddress 的子類 )構造方法:
方法簽名 方法說明
InetSocketAddress(InetAddress addr, int port) 創建一個Socket地址,包含IP地址和埠號
示例1:寫一個簡單的客戶端服務程序,回顯服務(EchoSever)
在這里插入圖片描述
構建Socket對象有很多失敗的可能:
埠號已經被佔用,同一個主機的兩個程序不能有相同的埠號(這就好比兩個人不能擁有相同的電話號碼);
此處,多個進程不能綁定同一個埠號,但是一個進程可以綁定多個埠,(這就好比一個人可以擁有多個手機號),一個進程可以創建多個Socket對象,每個Socket都綁定自己的埠。
每個進程能夠打開的文件個數是有上限的,如果進程之間已經打開了很多文件,就可能導致此時的Socket文件不能順利打開;
在這里插入圖片描述
這個長度不一定是1024,假設這里的UDP數據最長是1024,實際的數據可能不夠1024.
在這里插入圖片描述
這里的參數不再是一個空的位元組數組了,response是剛才根據請求計算的得到的響應,是非空的,DatagramPacket 裡面的數據就是String response的數據。
response.getBytes().length:這里拿到的是位元組數組的長度(位元組的個數),而response.length得到的是字元的長度。
五元組
一次通信是由5個核心信息描述的:源IP、 源埠、 目的IP、 目的埠、 協議類型。
站在客戶端角度:
源IP:本機IP;
源埠:系統分配的埠;
目的IP:伺服器的IP;
目的埠:伺服器的埠;
協議類型:TCP;
站在伺服器的角度:
源IP:伺服器程序本機的IP;
源埠:伺服器綁定的埠(此處手動指定了9090);
目的IP:包含在收到的數據報中(客戶端的IP);
目的埠:包含在收到的數據報中(客戶端的埠);
協議類型:UDP;
『捌』 如何用JAVA來編寫TCP&UDP測試工具
用 Socket java專門負責UDP/TCP傳輸的。用法和IO流有點相似,畢竟 這個也是流。
在不明白的可以HI我和我交流。
『玖』 java中UDP,DCP TCP與IP的區別是什麼
不知道樓主是什麼意思,UDP,DCP TCP與IP都是傳輸協議吧,那和Java有什麼關系呢?
1. IP
是網路層中最重要的協議。
IP層接收由更低層(網路介面層例如乙太網設備驅動程序)發來的數據包,並把該數據包發送到更高層---TCP或UDP層;相反,IP層也把從TCP或UDP層接收來的數據包傳送到更低層。IP數據包是不可靠的,因為IP並沒有做任何事情來確認數據包是按順序發送的或者沒有被破壞。IP數據包中含有發送它的主機的地址(源地址)和接收它的主機的地址(目的地址)。
高層的TCP和UDP服務在接收數據包時,通常假設包中的源地址是有效的。也可以這樣說,IP地址形成了許多服務的認證基礎,這些服務相信數據包是從一個有效的主機發送來的。IP確認包含一個選項,叫作IP source routing,可以用來指定一條源地址和目的地址之間的直接路徑。對於一些TCP和UDP的服務來說,使用了該選項的IP包好象是從路徑上的最後一個系統傳遞過來的,而不是來自於它的真實地點。這個選項是為了測試而存在的,說明了它可以被用來欺騙系統來進行平常是被禁止的連接。那麼,許多依靠IP源地址做確認的服務將產生問題並且會被非法入侵。
2. TCP
如果IP數據包中有已經封好的TCP數據包,那麼IP將把它們向『上』傳送到TCP層。TCP將包排序並進行錯誤檢查,同時實現虛電路間的連接。TCP數據包中包括序號和確認,所以未按照順序收到的包可以被排序,而損壞的包可以被重傳。
TCP將它的信息送到更高層的應用程序,例如Telnet的服務程序和客戶程序。應用程序輪流將信息送回TCP層,TCP層便將它們向下傳送到IP層,設備驅動程序和物理介質,最後到接收方。
面向連接的服務(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它們使用了TCP。DNS在某些情況下使用TCP(發送和接收域名資料庫),但使用UDP傳送有關單個主機的信息。
3.UDP
UDP與TCP位於同一層,但對於數據包的順序錯誤或重發。因此,UDP不被應用於那些使用虛電路的面向連接的服務,UDP主要用於那些面向查詢---應答的服務,例如NFS。相對於FTP或Telnet,這些服務需要交換的信息量較小。使用UDP的服務包括NTP(網落時間協議)和DNS(DNS也使用TCP)。
欺騙UDP包比欺騙TCP包更容易,因為UDP沒有建立初始化連接(也可以稱為握手)(因為在兩個系統間沒有虛電路),也就是說,與UDP相關的服務面臨著更大的危險。
4.DCP?是不是寫錯了,應該是CDP吧!~
思科發現協議(CDP:Cisco Discovery Protocol) 思科發現協議 CDP 基本上是用來獲取相鄰設備的協議地址以及發現這些設備的平台。CDP 也可為路由器的使用提供相關介面信息。CDP 是一種獨立媒體協議,運行在所有思科本身製造的設備上,包括路由器、網橋、接入伺服器和交換機。需要注意的是,CDP是工作在 Layer 2 的協議,默認情況下,每60秒以 01-00-0c-cc-cc-cc 為目的地址發送一次組播通告,當達到180秒的holdtime上限後仍未獲得鄰居設備的通告時,將清除鄰居設備信息。
『拾』 java 實現QQ 用UDP 還是TCP
QQ採用的通信協議復以UDP為主,輔制以TCP協議。由於QQ的伺服器設計容量是海量級的應用,一台伺服器要同時容納十幾萬的並發連接,因此伺服器端只有採用UDP協議與客戶端進行通訊才能保證這種超大規模的服務。
看你想怎麼做了,其實做成TCP也是可以的,因為像你做的這種對伺服器的容量要求不會很大所以可以用TCP.但是傳文件的話好像是TCP吧,是在兩個客戶端之間建立的,而不是伺服器和客戶端之間.