1. 程式人生 > 實用技巧 >Python基礎——Python

Python基礎——Python

1、InetAddress類

概念

  • 表示網際網路協議(IP)地址物件,封裝了與該IP地址相關的所有資訊,並提供獲取資訊的常用方法。

方法

// 獲得本地 主機地址物件
public static InetAddress getLoclHost()

// 根據主機名稱獲得地址物件
public static InetAddress getByName(String host)

// 獲得所有相關地址物件
public static InetAddress[] getAllByName(String host)

// 獲取IP地址字串
public String getHostAddress()

// 獲得IP地址主機名
public String getHostName()
package com.kingtl.NetCode;

import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * InetAddress類
 * 1、建立本機IP地址物件
 * 2、建立區域網IP地址物件
 * 3、建立外網IP地址物件
 */
public class Demo01 {
    public static void main(String[] args) throws Exception {
        // 1、建立本機IP地址物件
        //1.1 getLocalhost() 方法
        InetAddress ia1 = InetAddress.getLocalHost();
        System.out.println("ip地址:"+ia1.getHostAddress()+" 主機名:"+ia1.getHostName());
        // 1.2 getByName("ip地址")
        InetAddress ia2 = InetAddress.getByName("192.168.5.99");
        System.out.println("ip地址:"+ia2.getHostAddress()+" 主機名:"+ia2.getHostName());
        // 1.3 getByName("127.0.0.1")
        InetAddress ia3 = InetAddress.getByName("127.0.0.1");
        System.out.println("ip地址:"+ia3.getHostAddress()+" 主機名:"+ia3.getHostName());
        // 1.4 getByName("localhost)
        InetAddress ia4 = InetAddress.getByName("localhost");
        System.out.println("ip地址:"+ia4.getHostAddress()+" 主機名:"+ia4.getHostName());


        // 2、建立區域網的IP地址物件
        //InetAddress ia5 = InetAddress.getByName("192.168.5.10");
        //System.out.println("ip地址:"+ia5.getHostAddress()+" 主機名:"+ia5.getHostName());
        //System.out.println("2秒鐘是否可達:"+ia5.isReachable(2000));

        // 3、建立外網IP地址物件
        InetAddress ia6 = InetAddress.getByName("www.baidu.com");
        System.out.println("ip地址:"+ia6.getHostAddress()+" 主機名:"+ia6.getHostName());
        System.out.println("2秒鐘是否可達:"+ia6.isReachable(2000));

        InetAddress[] ias = InetAddress.getAllByName("www.baidu.com");
        for (InetAddress ia : ias) {
            System.out.println(ia.getHostAddress());
        }
    }
}

2、基於TCP的網路程式設計

Socket程式設計

  • Socket(套接字)是網路中的一個通訊節點。
  • 分為客戶端Socket與伺服器ServerSocket。
  • 通訊要求:IP地址 + 埠號。

開發步驟

伺服器端

  • 建立ServerSocket,指定埠號。
  • 呼叫accept等待客戶端接入。
  • 使用輸入流接收請求資料到伺服器(等待)
  • 使用輸出流傳送響應資料給客戶端
  • 釋放資源

客戶端:

  • 建立Socket,指定伺服器IP + 埠號
  • 使用輸出流傳送請求資料給伺服器。
  • 使用輸入流接收響應資料到客戶端(等待)

3、案例部分

4、單客戶端傳送資料給伺服器端

伺服器端程式碼:

package com.kingtl.NetCode;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 基於TCP協議的伺服器端開發
 * 1、建立ServerSocket ,並制定埠號
 * 2、呼叫accept() ,接收客戶端請求
 * 3、獲取輸入流,讀取客戶端傳送的資料
 * 4、獲取輸出流,傳送資料給客戶端
 * 5、釋放資源
 */
public class TcpServer {
    public static void main(String[] args) throws Exception {
        //1、建立ServerSocket ,並制定埠號
        ServerSocket listener = new ServerSocket(8899);
        //2、呼叫accept() ,接收客戶端請求,阻塞方法(如果沒有客戶端請求,則阻塞)
        System.out.println("伺服器已經啟動.....");
        Socket socket = listener.accept();
        //3、獲取輸入流,讀取客戶端傳送的資料
        InputStream is = socket.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf-8"));
        String data = br.readLine();
        System.out.println("客戶端傳送:" + data);
        //4、獲取輸出流,傳送資料給客戶端【可選】
        //5、釋放資源
        br.close();
        socket.close();
        listener.close();
    }
}

客戶端程式碼:

package com.kingtl.NetCode;

import java.io.*;
import java.net.Socket;

/**
 * 基於TCP的客戶端開發
 * 1、建立客戶端套接字,並指定伺服器的地址和埠號
 * 2、獲取輸出流,傳送資料給伺服器
 * 3、獲取輸入流,讀取伺服器的資料
 * 4、釋放資源
 */
public class TcpClient {
    public static void main(String[] args) throws Exception {
        //1、建立客戶端套接字,並指定伺服器的地址和埠號
        Socket socket = new Socket("127.0.0.1", 8899);
        //2、獲取輸出流,傳送資料給伺服器
        OutputStream os = socket.getOutputStream();
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os, "utf-8"));
        bw.write("許久不見");
        //3、獲取輸入流,讀取伺服器的資料 【伺服器沒寫回復的程式碼】
        //4、釋放資源
        bw.close();
        socket.close();
    }
}

結果:

5、單客戶端上傳檔案給伺服器端

伺服器端程式碼:

package com.kingtl.NetCode2;

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * TCP伺服器端
 */
public class TcpFileServer {
    public static void main(String[] args) throws Exception {
        // 1、建立ServerSocket
        ServerSocket listener = new ServerSocket(9999);
        // 2、偵聽接收客戶端請求
        System.out.println("伺服器已啟動....");
        Socket socket = listener.accept();
        // 3、獲取輸入流
        InputStream is = socket.getInputStream();
        // 4、邊讀取邊儲存
        FileOutputStream fos = new FileOutputStream("d:\\002.jpg");
        byte[] buf = new byte[1024 * 4];
        int count = 0;
        while ((count=is.read(buf)) != -1) {
            fos.write(buf,0,count);
        }
        // 關閉
        fos.close();
        is.close();
        socket.close();
        listener.close();
        System.out.println("接收結束!");
    }
}

客戶端程式碼:

package com.kingtl.NetCode2;

import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.Socket;

/**
 * TCP的客戶端
 */
public class TcpFileClient {
    public static void main(String[] args) throws Exception {
        // 1、建立 Socket
        Socket socket = new Socket("127.0.0.1",9999);
        // 2、獲取輸出流
        OutputStream os = socket.getOutputStream();
        // 3、邊讀取邊傳送
        FileInputStream fis = new FileInputStream("E:\\photos\\bizhi\\fengjing1.jpg");
        byte[] buf = new byte[1024 * 4];
        int count = 0;
        while ((count=fis.read(buf)) != -1) {
            os.write(buf,0,count);
        }
        //關閉
        fis.close();
        os.close();
        socket.close();
        System.out.println("傳送完畢!");
    }
}

6、多客戶端傳送資料給伺服器端

伺服器端

package com.kingtl.NetCode3;

import java.net.ServerSocket;
import java.net.Socket;

/**
 * 使用TCP實現接收多個客戶端請求
 */
public class TcpServer {
    public static void main(String[] args) throws Exception {
        // 1、建立 ServerSocket
        ServerSocket listener = new ServerSocket(10086);
        // 2、呼叫 accept() ,接收客戶端請求
        System.out.println("伺服器已啟動.....");
        while (true){
            Socket socket = listener.accept();
            System.out.println(socket.getInetAddress()+"連線了伺服器!");
            // 建立執行緒物件,負責接收資料
            new SocketThread(socket).start();
        }

    }
}

執行緒類

package com.kingtl.NetCode3;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;

public class SocketThread extends Thread {
    private Socket socket;

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

    @Override
    public void run() {
        if (socket != null) {
            BufferedReader br = null;
            try {
                InputStream is = socket.getInputStream();
                br = new BufferedReader(new InputStreamReader(is,"utf-8"));

                while (true) {
                    String data = br.readLine();
                    if (data == null) {  // 客戶端已經關閉
                        break;
                    }
                    System.out.println(socket.getInetAddress()+"說:" +data);
                    if (data.equals("886") || data.equals("byebye")) {
                        break;
                    }
                }

            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    br.close();
                    socket.close();
                    System.out.println(socket.getInetAddress()+"退出了...");
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }

        }
    }
}

客戶端

package com.kingtl.NetCode3;

import java.io.BufferedWriter;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;

/**
 * TCP客戶端:一直往伺服器傳送資料
 */
public class TcpClient {
    public static void main(String[] args) throws Exception {
        // 1、建立 Socket
        Socket socket = new Socket("127.0.0.1", 10086);
        // 2、獲取輸出流
        OutputStream os = socket.getOutputStream();
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os,"utf-8"));
        // 3、控制檯輸入
        Scanner input = new Scanner(System.in);
        while (true) {
            String data = input.nextLine();
            bw.write(data);
            bw.newLine();   // 傳送換行符
            bw.flush();
            if (data.equals("886") || data.equals("byebye")) {
                break;
            }
        }
        // 4、關閉
        bw.close();
        socket.close();
    }
}

7、總結

  • 計算機網路:
    • 為實現資源共享和資訊傳遞,通過通訊線路連線起來的若干主機。
  • TCP協議:
    • 是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議。資料大小無限制。
  • IP:
    • 分配給網際網路裝置的數字標籤(唯一標識)。
  • Port:
    • 在通訊實體上進行網路通訊的程式的唯一標識。
  • Socket程式設計:
    • 建立連線、接收請求、傳送響應。