計算機網絡 (五) Socket

Socket簡介

在這裏插入圖片描述
Socket是兩臺主機之間的一個連接。它可以完成7個基本操作:

  • 連接遠程機器
    • 發送數據
    • 接收數據
    • 關閉連接
    • 綁定端口
    • 監聽入站數據
    • 在綁定端口上接受來自遠程機器的連接

Socket通信流程
在這裏插入圖片描述

實例
在這裏插入圖片描述

TCP實現

  • 服務端代碼
public class TcpServer {
    public static void main(String[] args) throws Exception {
        // 創建socket 並將端口綁定在7000端口
        ServerSocket serverSocket = new ServerSocket(7000);
        while (true){
            //監聽7000 端口,直至客戶端返回連接信息後才返回
            Socket socket = serverSocket.accept();
            new LengthCalculator(socket).start();
        }
    }
}
public class LengthCalculator extends Thread {

    private Socket socket;

    public LengthCalculator(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            //獲取socket輸出流
            OutputStream os = socket.getOutputStream();
            //獲取socket輸入流
            InputStream is = socket.getInputStream();
            int ch = 0;
            // 將接收流的byte數組轉換成字符串,這裏獲取的內容是客戶端發來的字符串,ch讀取字符串的長度
            byte[] buff = new byte[1024];
            ch = is.read(buff);

            String content = new String(buff, 0, ch);
            System.out.println(content);
            //輸出流寫入字符串的長度,發送給客戶端
            os.write(String.valueOf(content.length()).getBytes());

            //關閉輸入輸出流以及socket
            is.close();
            os.close();
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        super.run();
    }
}
  • 客戶端代碼
public class TcpClient {
    public static void main(String[] args) throws Exception {
        Socket socket = new Socket("127.0.0.1", 7000);
        OutputStream os = socket.getOutputStream();
        InputStream is = socket.getInputStream();

        os.write(new String("hello world").getBytes());
        int ch = 0;
        byte[] buff = new byte[1024];

        ch = is.read(buff);
        String content = new String(buff, 0, ch);
        System.out.println(content);

        is.close();
        os.close();
        socket.close();

    }
}

在這裏插入圖片描述
在這裏插入圖片描述
UDP實現效果

  • UDP服務端
public class UdpServer {
    public static void main(String[] args) throws Exception {
        // 服務端接收客戶端發送的數據報
        DatagramSocket socket = new DatagramSocket(7000);
        byte[] buff = new byte[1024];
        // 接收客戶端發送過來的內,並將其內容封裝進 DatagramPacket對象中
        DatagramPacket packet = new DatagramPacket(buff, buff.length);
        socket.receive(packet);

        byte[] data = packet.getData();
        // 將數據從二進制轉換成字符串形式
        String content = new String(data, 0, packet.getLength());

        System.out.println(content);
        // 將要發送給客戶端的數據轉換成二進制
        byte[] sendContent = String.valueOf(content.length()).getBytes();

        // 從DatagramPacket中獲取數據的來源地和端口號
        DatagramPacket packetToClient = new DatagramPacket(sendContent, sendContent.length,
                packet.getAddress(), packet.getPort());
        // 發送數據給客戶端
        socket.send(packetToClient);
    }

}

  • UDP客戶端
public class UdpClient {

    public static void main(String[] args) throws Exception {
        // 客戶端發送數據報給服務端
        DatagramSocket socket = new DatagramSocket();
        // 發送給服務器的數據
        byte[] buf = "Hello World".getBytes();
        // 將IP地址封裝成InetAddress對象
        InetAddress address = InetAddress.getByName("127.0.0.1");
        // 將要發送給服務端的數據封裝成DatagramPacket對象,填入Ip地址和端口號
        DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 7000);
        //發送數據給服務端
        socket.send(packet);

        // 客戶端接收服務端發送來的數據報
        byte[] data = new byte[100];
        //創建DatagramPacket 對象用來儲存服務端發送過來的數據
        DatagramPacket receivePacket = new DatagramPacket(data, data.length);

        socket.receive(receivePacket);
        String content = new String(receivePacket.getData(), 0, receivePacket.getLength());
        System.out.println(content);
    }
}
  • 效果圖
    在這裏插入圖片描述
    在這裏插入圖片描述

(轉)客戶端 Socket

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