1. 程式人生 > >Java使用UDP協議傳輸資訊

Java使用UDP協議傳輸資訊

在網路程式設計當中,存在兩大傳輸層協議,TCP和UDP。

那麼傳輸協議有什麼作用呢,我們都知道,計算機當中的訊號只用0和1,傳輸資訊也往往只用這兩種訊號傳輸。那麼就需要用某種格式,來規範我們發出的資訊。用送信來舉例子的話,我們送一個郵件,除了信裡面的內容以外,信還需要表明,這是要送給哪個小區的,這個小區的哪個人家的。對於計算機網路通訊來說,這個資料包當中除了儲存需要傳送的資訊以外,還要標註這個資訊是要發給哪個小區,小區就好比是我們的計算機,我們使用IP地址來表明我們要傳送到哪個計算機,然後呢,我們還需要表明這個信是哪個人的,是QQ的還是微信的啊,這個就是埠號。

TCP和UDP的區別

TCP是面向連線的服務,也就是說,在進行正式通訊之前,必須確定已經和對方建立聯絡了,(TCP的三次通訊嘛)特點是保證了資料的傳送和接收同步,資訊一定到了對方的手中,保證資訊無差錯,但是因為反覆確認的原因,速度相對較慢。

UDP是面向非連線的協議服務,和TCP相比,UDP也不管接收方方不方便接收檔案,反正我就按照資料包上寫的地址把資訊發過去了,最後資訊是收到了還是丟了,還是資訊阻塞卡掉了,傳送方不知道,也不會管。這種傳輸方式特點是快速,適合用在網路遊戲方面。

簡單的使用UDP傳輸檔案的程式碼:

Server.java

package udp;
import java.net.*;
public class Server
{
	public static void main(String [] args)throws Exception
	{
		byte[] container=new byte[1024*60]
; DatagramSocket server = new DatagramSocket(9999); DatagramPacket packet=new DatagramPacket(container,0,container.length); while (true) { server.receive(packet); byte[] datas=packet.getData(); String message=new String(datas,0,packet.getLength()); System.out.println(message); if
(message.equals("bye")) break; } server.close(); } }

Client.java

package udp;
import java.net.*;
import java.io.*;
public class Client
{
	public static void main(String [] args)throws Exception
	{
		System.out.println("傳送端啟動");
		DatagramSocket client = new DatagramSocket(8888);
		BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
		while (true)
		{
			String data;
			data=in.readLine();
			byte[] datas = data.getBytes();
			DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",9999));
			client.send(packet);
			if (data.equals("bye")) break;
		}
		client.close();
	}
}

Java中的套接字傳輸型別為DatagramSocket,對於接收方的使用方法為:DatagramSocket client=new DatagramSocket(在本機開的埠);(無論是傳送還是接收方都不會用到這個埠,這個埠有什麼用,如果有大佬知道的話,希望能告訴我一下Orz)

DatagramPacket packet=new DatagramPacket(byte型別的陣列,起始位置,終止位置,InetSocketAddress物件(存放著目的地的IP和介面號);

包裹裡面封裝的“資訊”一定要轉化成byte陣列型別,在接收方我們可以使用String的建構函式轉化回來,InetSocketAddress型別引數表明我們要傳送的資訊是送給哪個電腦的哪個埠號的,就類似信件上的地址,快遞員不必大腦裡面記住資訊是傳送給誰的,只要看一眼地址,按照地址往目的地跑就可以了。

Send傳送方法

Receive接收方法,引數都是Datagrampacket型別的