天天看點

面向網絡程式設計:TCP協定和UDP協定

UDP協定:  無連接配接通信協定,當一台計算機向另一台計算機發送資料時,發送端不會确定接收端是否存在,接收端是否收到資料也不會向發送端回報。

例:QQ留言,視訊廣播(UDP協定内容大小限制在64kb以内)

TCP協定:  面向連接配接的通信協定,必須由用戶端去連接配接伺服器端才能實作通信,伺服器端一般不會主動聯系用戶端,并且伺服器需要先啟動去等待用戶端連接配接。

三次握手:

1.用戶端向服務端發出連接配接請求,等待伺服器确定

2.服務端向用戶端回送一個響應,通知其收到請求

3.用戶端再次向服務端發送确認資訊,确認連接配接。

如:下載下傳電影

用戶端與伺服器的了解:都是電腦,

伺服器:提供資料服務,在java中用ServerSocket表示伺服器端,伺服器需要事先啟動,去等待用戶端的連接配接。

用戶端:在Java中用Socket類表示。

比如:當我們下載下傳電影的時候,我們的電腦就是用戶端,電影的資料源就是伺服器,老師上課時的螢幕廣播,老師的電腦就是伺服器,我們用的就是用戶端。
面向網絡程式設計:TCP協定和UDP協定

實作UDP協定的發送端:

package UDP協定;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

public class UDPsend {

    public static void main(String[] args) throws Exception{

    byte[] data = "你好UDP".getBytes();

    InetAddress inet = InetAddress.getByName("127.0.0.1");

    DatagramPacket dp = new DatagramPacket(data, data.length,inet,6000);

    DatagramSocket ds = new DatagramSocket();

    ds.send(dp);

    ds.close();

    }

}

實作UDP協定的接收端:

package UDP協定;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

public class UDPrecieve {

    public static void main(String[] args) throws Exception{

        //建立資料包,傳輸對象DatagramSocket,綁定端口号

        DatagramSocket ds = new DatagramSocket(6000);

        //建立位元組數組,用于接收發來的資料

        byte[] data = new byte[1024];

        //建立資料包對象,傳遞位元組數組

        DatagramPacket dp = new DatagramPacket(data,data.length);

        //調用ds對象方法receive傳遞資料包

        ds.receive(dp);

        //擷取發送端的IP位址對象

        String ip = dp.getAddress().getHostAddress();

        //擷取發送端的端口号

        int port = dp.getPort();

        //擷取發送端的位元組數組個數

        int length = dp.getLength();

        System.out.println(new String(data,0,length)+"   "+ip+"   "+port);

    }

}

實作TCP協定中用戶端和伺服器端之間的資訊傳遞:

TCP用戶端發送資訊給伺服器并接收伺服器發來的消息:

package TCP協定;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.Socket;

public class TCPClient {

    public static void main(String[] args) throws IOException{

        //建立連接配接

        Socket socket = new Socket("127.0.0.1",8888);

        //寫入需要傳輸的資料

        OutputStream out = socket.getOutputStream();

        out.write("伺服器OK".getBytes());

        //接受伺服器的資訊

        InputStream in = socket.getInputStream();

        byte[] data = new byte[1024];

        int len = in.read(data);

        System.out.println(new String(data,0,len));

        //關閉資源

        socket.close();

    }

}

伺服器端:接收用戶端資訊并回給用戶端一個消息

package TCP協定;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.ServerSocket;

import java.net.Socket;

public class TCPserver {

    public static void main(String[] args) throws IOException{

ServerSocket server = new ServerSocket(8888);

Socket socket = server.accept();

InputStream in = socket.getInputStream();

byte[] data = new byte[1024];

int len = in.read(data);

System.out.println(new String(data,0,len));

OutputStream  out = socket.getOutputStream();

out.write("收到,謝謝".getBytes());

socket.close();

server.close();

    }

}