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型別的