我的理解:java
瞭解區分UDP與TCP的不一樣,正常狀況都是二者結合的使用模式!爲了更好的傳輸,常常會開多線程進行傳輸的!數組
1、網絡通訊協議:服務器
一、TCP/IP協議:網絡
四層:應用層、傳輸層、網絡層和鏈路層:多線程
鏈路層:鏈路層是用於定義物理傳輸通道,一般是對某些網絡鏈接設備的驅動協議,例如針對光纖、網線提供的驅動。oracle
網絡層:網絡層是整個TCP/IP協議的核心,它主要用於將傳輸的數據進行分組,將分組數據發送到目標計算機或者網絡。socket
傳輸層:主要使網絡程序進行通訊,在進行網絡通訊時,能夠採用TCP協議,也能夠採用UDP協議。this
應用層:主要負責應用程序的協議,例如HTTP協議、FTP協議等。spa
二、IP地址和端口號:.net
①、IP地址,它能夠惟一標識一臺計算機:
之前爲IPV4,如今是IPV6的16個字節表示地址。
②、端口號:兩個字節:0-65535。通常爲1024以上的端口號。
三、InetAddress類:
import java.net.InetAddress; import java.net.UnknownHostException; public class Demo01 { public static void main(String[] args) throws UnknownHostException { InetAddress inet=InetAddress.getByName("192.168.1.163");//裏面是本身的ip地址 //從對象中獲取IP地址 System.out.println(inet.getHostAddress()); //獲取主機名 System.out.println(inet.getHostName()); //獲取本地主機ip對象 InetAddress inet2=InetAddress.getLocalHost(); System.out.println(inet2.getHostAddress()); System.out.println(inet2.getHostName()); } }
2、UDP與TCP協議:
一、UDP協議:
User Datagram Protocol 用戶數據報協議--無鏈接的通訊協議:不能保證數據的完整性,隨緣!!!64K之內。
二、TCP協議:
Transmission Control Protocol 傳輸控制協議---面向鏈接的通訊協議:
在傳輸數據前先在發送端和接收端創建邏輯鏈接,而後再傳輸數據。
在TCP鏈接中必需要明確客戶端與服務器端,由客戶端向服務端發出鏈接請求,每次鏈接的建立都須要通過「三次握手」。第一次握手,客戶端向服務器端發出鏈接請求,等待服務器確認,第二次握手,服務器端向客戶端回送一個響應,通知客戶端收到了鏈接請求,第三次握手,客戶端再次向服務器端發送確認信息,確認鏈接。
3、UDP通信:
一、DatagramPacket:數據打包類:
用於封裝UDP通訊中發送或者接收的數據。
二、DatagramSocket:「碼頭」:能夠發送和接收DatagramPacket數據包
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 UDPSend { public static void main(String[] args) throws IOException { //封裝數據 byte[ ] bytes="你好UDP".getBytes(); //封裝ip地址 InetAddress inet=InetAddress.getByName("127.0.0.1"); //1。建立數據打包對象,封裝要發送的數據、長度、接收端的IP地址和端口號 DatagramPacket dp=new DatagramPacket(bytes,bytes.length,inet,6000); //2.建立DatagreamSocket對象(快遞公司) DatagramSocket ds=new DatagramSocket(); //3.發送數據包 ds.send(dp); //釋放資源 ds.close(); } }
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; //接收端 public class UDPReceive { public static void main(String[] args) throws IOException { //建立DatagramSocket對象,明確端口號 DatagramSocket ds=new DatagramSocket(6000); //2.建立字節數組負責接收發來的數據 byte [] bytes=new byte[1024]; //3.建立數據拆包對象 DatagramPacket dp=new DatagramPacket(bytes,bytes.length); //4.接收數據包 ds.receive(dp); //5.拆包 //獲取接收的數據長度 int length=dp.getLength(); //獲取發送端的IP地址 String ip=dp.getAddress().getHostAddress(); //獲取發送端的端口號 int port =dp.getPort(); System.out.println("ip地址爲:"+ip+"端口號爲:"+port+"發送的內容爲:"+new String(bytes,0,length)); } }
4、TCP通訊:
一、ServerSocket類:服務器端;Socket類:客戶端。
//服務器端 public class TCPServer { public static void main(String[] args) throws IOException { //1.建立服務器對象ServerSocket,明確端口號 ServerSocket server=new ServerSocket(8888); //2.調用accept方法,跟客戶端建立鏈接,並獲取鏈接的客戶端對象 Socket socket=server.accept(); //3.明確目的地 File file=new File("D:\\nihao"); //若是該目錄不存在則建立 if(!file.exists()){ file.mkdirs(); } String filename="oracle"+System.currentTimeMillis()+".txt"; //明確目的地 FileOutputStream fos=new FileOutputStream(file+File.separator+filename); //明確數據源 InputStream in=socket.getInputStream(); //開始複製 int len=0; byte[] bytes=new byte[1024]; while((len=in.read(bytes))!=-1){ fos.write(bytes,0,len); } //回覆客戶端 //獲取字節輸出流 ,回覆客戶端 OutputStream out =socket.getOutputStream(); out.write("上傳成功".getBytes()); //釋放資源 fos.close(); server.close(); } }
//客戶端 public class TCPClient { public static void main(String[] args) throws UnknownHostException, IOException { //1.建立Socket對象,明確要鏈接的服務器地址和端口號 Socket socket =new Socket("127.0.0.1",8888); //2.明確數據源 FileInputStream fis=new FileInputStream("D:\\java\\a.txt"); //3.從socke對象中獲取字節輸出流,準備把讀的文件字節寫給服務器 OutputStream out=socket.getOutputStream(); //4.開始複製 int len=0; byte[] bytes=new byte[1024]; while((len=fis.read(bytes))!=-1){ out.write(bytes,0,len); } //結束輸出流,告訴服務器結束了,不要讀了 socket.shutdownOutput(); //接收服務器的回覆 //1.從socket對象中獲取字節輸入流,接收服務器回覆的數據 InputStream in=socket.getInputStream(); len=in.read(bytes); System.out.println(new String(bytes,0,len)); //釋放資源 socket.close(); fis.close(); } }
二、多線程傳輸:
//線程任務對象 public class Upload implements Runnable { private Socket socket; public Upload() { }; public Upload(Socket socket) { this.socket = socket; }; public void run() { FileOutputStream fos = null; try { // 3.明確目的地 File file = new File("D:\\nihao"); // 若是該目錄不存在則建立 if (!file.exists()) { file.mkdirs(); } String filename = "oracle" + System.currentTimeMillis() + ".txt"; // 明確目的地 fos = new FileOutputStream(file + File.separator + filename); // 明確數據源 InputStream in = socket.getInputStream(); // 開始複製 int len = 0; byte[] bytes = new byte[1024]; while ((len = in.read(bytes)) != -1) { fos.write(bytes, 0, len); } // 回覆客戶端 // 獲取字節輸出流 ,回覆客戶端 OutputStream out = socket.getOutputStream(); out.write("上傳成功".getBytes()); } catch (IOException ex) { ex.printStackTrace(); } finally { // 釋放資源 try { fos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
public class Demo { public static void main(String[] args) throws IOException { //1.建立服務器對象 ServerSocket server=new ServerSocket(8888); while(true){ //建立鏈接獲取客戶端對象 Socket socket=server.accept(); /*//建立線程(建立線程任務) new Thread(new Upload(socket)).start();*/ //建立線程任務 Upload up=new Upload(socket); //建立線程對象 Thread thread=new Thread(up); //開啓線程 thread.start(); } } }