JAVA基礎之網絡通訊協議--TCP與UDP

 我的理解: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();
            
        }

    }

}
相關文章
相關標籤/搜索