UDP和TCP通信機制(實現簡單的數據發送與接收)

UDPTCP通信機制

UDP

將數據源和目的封裝成數據包中,不需要建立連接;每個數據報的大小在限制在64k;因無連接,是不可靠協議;不需要建立連接,速度快。

 

UDP協議發送和接收數據圖解

接收端的代碼:

package UDP數據接收與發送;

 

import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

 

/*

 * UDP協議接收數據:

 * A:創建接收端Socket對象

 * B:創建一個數據包(接收容器)

 * C:調用Socket對象的接收方法接收數據

 * D:解析數據包,並顯示在控制檯

 * E:釋放資源

 */

public class ReceiveDemo {

public static void main(String[] argsthrows IOException {

// 創建接收端Socket對象

DatagramSocket ds = new DatagramSocket(10086);

// 創建一個數據包(接收容器)

byte[] bys = new byte[1024];

int length = bys.length;

DatagramPacket dp = new DatagramPacket(byslength);

// 調用Socket對象的接收方法接收數據

ds.receive(dp);// 阻塞方法

// 解析數據包,並顯示在控制檯

InetAddress ia = dp.getAddress();

String ip = ia.getHostAddress();

byte[] bys2 = dp.getData();

int len = dp.getLength();

String s = new String(bys2, 0, len);

System.out.println(ip + "發來數據:" + s);

// 釋放資源

ds.close();

}

}

發送端的代碼:

package UDP數據接收與發送;

 

import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

 

/*

 * UDP協議接收數據:

 * A:創建發送端Socket對象

 * B:創建一個數據包(發送容器)

 * C:調用Socket對象的發送方法接收數據

 * E:釋放資源

 */

public class SendDemo {

public static void main(String[] argsthrows IOException {

// 創建發送端Socket對象

DatagramSocket ds = new DatagramSocket();

// 創建一個數據包(發送容器)

byte[] bys = ("hello,DUP,我來了").getBytes();

int length = bys.length;

InetAddress address = InetAddress.getByName("59.71.66.152");

int port = 10086;

DatagramPacket dp = new DatagramPacket(byslengthaddressport);

// 調用Socket對象的發送方法接收數據

ds.send(dp);

// 釋放資源

// ds.close();

}

}

 

TCP

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

 

TCP協議發送和接收數據圖解

服務器端代碼:

package TCP數據發送與接收;

 

import java.io.IOException;

import java.io.InputStream;

import java.net.ServerSocket;

import java.net.Socket;

 

public class ServerDemo {

public static void main(String[] argsthrows IOException {

// 創建接收端的套接字對象

ServerSocket ss = new ServerSocket(8888);

// 監聽客戶端連接,返回相應的Socket對象

Socket s = ss.accept();

// 獲取輸入流對象,從輸入流中獲取數據

InputStream is = s.getInputStream();

byte[] bys = new byte[1024];

int len = is.read(bys);

String str = new String(bys, 0, len);

System.out.println("From Client" + "(" + s.getInetAddress().getHostAddress() + "):" + str);

// 釋放資源

s.close();

}

}

客戶端代碼:

package TCP數據發送與接收;

 

import java.io.IOException;

import java.io.OutputStream;

import java.net.Socket;

 

public class ClientDemo {

public static void main(String[] argsthrows IOException {

// 創建Socket套接字對象

Socket s = new Socket("59.71.66.152", 8888);

// 獲取輸出流對象,寫數據

OutputStream os = s.getOutputStream();

os.write("hello,世界".getBytes());

// 釋放資源

s.close();

}

}

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章