1. 程式人生 > >JAVA網絡編程--UDP通信

JAVA網絡編程--UDP通信

-- ack 取出 3次握手 main 否則 隨機 單點 con

首先網絡傳輸數據需了解例如以下三點

1、找到對方IP

2、數據要發送到對方指定的應用程序上,為了標識這些應用程序,所以給這些網絡應用程序用數字進行了標識。為了方便稱呼這個數字,叫做port,邏輯port

3、 定義通信規則。這個通信規則稱為協議。


國際組織定義了通用協議TCP/IP。

127.0.0.1本機回環地址 不易記憶,可用主機名 主機名:localhost

0-65535port範圍 0-1024系統使用或保留port 。當中mysql的port號為 3306

一、UDP

UDP相對於TCP來說是不可信任的

TCP在建立連接之前有3次握手,連接建立之後還有數據重傳機制來保證數據的穩定傳輸

UDP

並沒有握手機制和重傳機制

簡單點說就是UDP通信時僅僅管發,而無論對方收不收的到。


而TCP在每次通信完畢後都要有一個包來確認是否收到。校驗是否完善,否則就會重傳。

UDP

將數據及源和目的封裝成數據包中,不須要建立連接。每一個數據報的限制大小在64內,因無連接。是不可靠協議。

不須要建立連接,速度快。

TCP

建立連接,形成數據傳輸的通道,在連接中進行大數據量傳輸,通過三次握手完畢連接。是可靠協議。必須建立連接。效率會稍低。

三次握手,(張三你在嗎?)(我在。)(好,我知道你在了。


以下是採用UDP發送方式的樣例

(一)UDP發送端

需求:通過UDP傳輸方式,將一段文字數據發送出去。

思路:

1、 建立udpsocket服務

2、 提供數據,並將數據封裝到數據包中

3、 通過socket服務的發送功能。將數據包發送出去。

4、 關閉資源。

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;



public class Work {
	public static void main(String[] args) throws IOException {
		//創建UDp服務,通過DatagramSocket對象,隨機選擇數據端口進行發送
		DatagramSocket ds=new DatagramSocket();
		//確定數據。並封裝成數據包
		byte[] buf="dadfdadsfsafasdf".getBytes();
		DatagramPacket dp=
				new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.0.100"),1000);
		//通過socket服務。將已有的數據包發送出去,通過send方法
		ds.send(dp);
		//關閉資源
		ds.close();
		
	}
}


(二)UDP接收端

定義udp的接收端

需求:

定義一個應用程序。用於接收UDP協議傳輸的數據並處理。

1、 定義udpSocket服務,一般會監聽一個port。

事實上就是給這個接收網絡應用程序定義數字標識。方便於明白哪些數據過來應用程序能夠處理。

2、 定義一個數據包。由於要存儲接收到的字節數據。

由於數據包對象中有很多其它功能能夠提前字節數據中的不同數據信息。

3、 通過socket服務的receive方法將收到的數據存入已定義好的數據包中

4、 通過數據包對象的特有功能。將這些不同的數據取出,打印在控制臺上。

5、關閉資源

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class ReData {
	public static void main(String[] args) throws IOException {
		DatagramSocket ds = new DatagramSocket(10000);
		byte[] arr = new byte[1024];
		DatagramPacket dp = new DatagramPacket(arr, arr.length);
		ds.receive(dp);/
		String ip = dp.getAddress().getHostAddress();
		String data = new String(dp.getData(), 0, dp.getLength());
		int port = dp.getPort();
		System.out.println(ip + ":" + data + ":" + port);
		ds.close();
	}
}

DatagramSocket ds = new DatagramSocket(10000);
在while(true)循環運行該語句,就會出現端口已使用異常。

JAVA網絡編程--UDP通信