Java基礎---------網絡編程

網絡編程:
(由於基礎太差很多東西不懂,博客比較簡單,後面會補充)

在這裏插入圖片描述

  1. 一.應用層:
    常見協議:(1).訪問互聯網上的網頁(http協議)
    (2).遠程登錄(Telnet協議)
    (3).遠程登錄且保證安全(ssh協議)
    傳輸層:
    tcp協議和udp協議
    互聯網層:
    IP協議
    網絡訪問層
  2. 二.使用socket進行通信
    InputStream getInputStream():返回該socket對象對應的輸入流,讓程序通過該輸入流從socket中取出數據
    OutputStream getOutputStream():返回該socket對應的輸出流,讓程序通過該輸出流流向socket中輸出數據
    代碼:
 import java.io.IOException;
 import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;
  public class Server{   
    // 第一個服務器,阻塞io
    public static void main(String[] args) throws IOException {
        // 1. 創建serverSocket
        
        ServerSocket serverSocket = new ServerSocket(5000);
        System.out.println("服務已啓動,等待連接");
        
        ExecutorService service = new ThreadPoolExecutor(10, 10, 0, TimeUnit.SECONDS,
                new LinkedBlockingQueue<>());

        while(true) {
            // 2. 調用accept 等待客戶端連接
            Socket socket = serverSocket.accept();
            System.out.println("客戶端已連接....");
            
            service.submit(() -> {
                // 把io相關的操作放在線程內執行,讓每個線程處理一個io操作,避免io阻塞
                try {
                    handle(socket);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
        }
    }

    private static void handle(Socket socket) throws IOException {
        // 3. 接收客戶的輸入
        InputStream in = socket.getInputStream();
        // 4. 拿到輸出流向客戶寫入
        OutputStream out = socket.getOutputStream();
        while (true) {
            byte[] buf = new byte[1024];
            int len = in.read(buf);
            if (len == -1) {
                break;
            }
            String echo = new String(buf, 0, len, "utf-8");
            System.out.println(echo);
            out.write(("服務器回答:" + echo).getBytes("utf-8"));
        }
    }
}

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

public class Client {

    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("localhost", 5000);

        OutputStream out = socket.getOutputStream();
        
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Scanner scanner = new Scanner(System.in);
                    while (scanner.hasNextLine()) {
                        String line = scanner.nextLine();
                        out.write(line.getBytes());
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

        InputStream in = socket.getInputStream();
        while(true) {
            byte[] buf = new byte[1024];
            int len = in.read(buf);
            if(len == -1) {
                break;
            }
            String result = new String(buf, 0, len, "utf-8");
            System.out.println(result);
        }
    }
}

注:先運行程序中的Server類,將看到服務器一直處於等待狀態,因爲在服務器中使用了死循環來接收來自客戶端的請求,再運行Client類,看到輸出“客戶端已連接…”,這表明客戶端與服務器端通信成功。
三.枚舉類
適用於當對象已知並且有限,ex:性別,星期等
例:性別
代碼:

 public enum Sex {
    MALE("男"),
    FEMALE("女");
    public String test() {
        return "ok";
    }
    private String cnName;
    public String cnName() {
        return this.cnName;
    }
    // 構造方法不能是公共的
    Sex(String cnName) {
        this.cnName = cnName;
    }
}
public class TestEnum {
	public static void main(String[] args) {
        // 獲取枚舉對象的序號,序號從0開始
        System.out.println(Sex.MALE.ordinal());
        System.out.println(Sex.FEMALE.ordinal());
        // 把枚舉對象轉爲字符串
        System.out.println(Sex.MALE.name());
        // 把字符串轉爲枚舉對象, 虛擬機中的枚舉對象只會有一份
        // 可以用== 來比較System.out.println(Sex.valueOf("MALE") == Sex.MALE);
        // 打印所有的枚舉對象
        for (Sex value : Sex.values()) {
            System.out.println(value);
        }
        System.out.println(Sex.MALE.test());
        System.out.println(Sex.MALE.cnName());
        System.out.println(Sex.FEMALE.cnName());
    }
}
結果:
true
MALE
FEMALE
ok
男
女

 


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