Day27-C:\Users\Lenovo\Desktop\note\code\JavaSE\Basic\src\com\Threadcase\ThreadPool+C:\Users\Lenovo\Desktop\note\code\JavaSE\Basic\src\com\IPDemo\UDPDemo-線程池和網絡編程UDP
自定義線程池
臨時線程創建時機:當核心線程全都占用且等待隊列中的數量已經超過設定的閾值的時候,才會觸發創建臨時線程
package Basic.src.com.Threadcase.ThreadPool;
import java.util.concurrent.*;
public class MyThreadPoolDemo1 {
public static void main(String[] args) {
/*
* (核心線程數量,最大線程數量,空閑線程最大存活時間,任務隊列,創建線程工廠,任務的拒絕策略)
*
* 參數一:核心線程數量 不能小于0
* 參數二:最大線程數 不能小于等于0,最大數量>=核心線程數量
* 參數三:空閑線程最大存活時間 不能小于0
* 參數四:時間單位 用 TimeUnit指定
* 參數五:任務隊列 (排隊的客戶) 不能為null
* 參數六:創建線程工廠 不能為null
* 參數七:任務的拒絕策略 不能為null
*
* */
ThreadPoolExecutor pool = new ThreadPoolExecutor(
3,
6,//最大線程數
60,//空閑線程最大空閑時間
TimeUnit.SECONDS,//時間單位
new ArrayBlockingQueue<>(3),//任務隊列,阻塞隊列
Executors.defaultThreadFactory(),//創建線程工廠
new ThreadPoolExecutor.AbortPolicy()//任務的拒絕策略
);
pool.submit(new MyRunnable());
}
}
網絡編程
java.net.
通信架構
CS架構(客戶端服務端)
BS架構(瀏覽器服務端)
網絡編程三要素
- IP地址:設備在網絡中的地址
- 端口號:應用程序在設備中唯一的標識
- 協議:連接和數據在網絡中傳輸的規則
IP地址
互聯網協議地址Internet Prototol
兩種形式:IPv4(32位) IPv6
IPv4 地址 . . . . . . . . . . . . : 192.168.137.1
windows+R調出cmd,輸入ipconfig回車
IPv6地址 fe80::96de:391e:5aa7:6696%15
IP域名
- 重置網絡協議:以管理員身份運行命令提示符,依次執行
ipconfig /release、ipconfig /renew、ipconfig /flushdns,再重新測試ping 127.0.0.1。
InetAddress
代表IP地址
package Basic.src.com.IPDemo;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class InetAddressTest {
public static void main(String[] args) throws IOException {
//1.獲取本機IP地址對象
InetAddress ip1 = InetAddress.getLocalHost();
System.out.println(ip1.getHostName());
System.out.println(ip1.getHostAddress());//192.168.137.1
InetAddress ip2 = InetAddress.getByName("www.baidu.com");
System.out.println(ip2.getHostName());//www.baidu.com
System.out.println(ip2.getHostAddress());//180.101.49.44 36.152.44.132
//ping www.baidu.com
System.out.println(ip2.isReachable(6000));
}
}
端口號
標記在計算機設備上運行的應用程序,被規定為一個16位的二進制,范圍是0~65535
協議
網絡上通信的協議,事先規定的連接規則,以及傳輸數據的規則被稱為網絡協議。
開放式網絡互聯標準:OSI網絡參考模型
UDP用戶數據報協議
特點:無連接、不可靠通信
TCP傳輸控制協議
特點:面向連接、可靠通信
最終目標:要保證在不可靠的信道上實現可靠的傳輸
TCP的三步驟:三次握手建立連接、傳輸數據進行確認、四次揮手斷開連接。
三次握手
四次揮手斷開連接
UDP通Data信
java.net.DatagremSocket類
package Basic.src.com.IPDemo.UDPDemo.Demo01;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Client {
public static void main(String[] args) throws IOException {
//1.創建客戶端對象(發韭菜出去的人)
DatagramSocket socket = new DatagramSocket(7777);
//2.創建數據包對象封裝要發出去的數據(創建一個韭菜盒子)
/*
* public DatagramPacket(byte buf[], int length,
InetAddress address, int port)
* 參數一:封裝要發出去的數據
* 參數二:發生出去的數據大?。ㄗ止潅€數)
* 參數三:服務端的IP地址(找到服務端主機)InetAddress.getByName(****)
* 參數四:服務器程序的端口
* */
//"我是快樂的客戶端,我愛你abc"
byte[] bytes = "我是快樂的客戶端,我愛你abc".getBytes();
DatagramPacket packet = new DatagramPacket(bytes, bytes.length, InetAddress.getLocalHost(),6666);
//開始正式發送這個數據包的數據出去了
socket.send(packet);
System.out.println("客戶端數據發生完畢");
socket.close();//釋放資源
}
}
package Basic.src.com.IPDemo.UDPDemo.Demo01;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Server {
public static void main(String[] args) throws Exception {
System.out.println("-----------------------服務端啟動-------------------------");
//1.創建一個服務端對象(創建一個接韭菜的人)注冊端口
DatagramSocket socket = new DatagramSocket(6666);
//2.創建一個數據包對象,用于接收數據(創建一個韭菜盤子)
byte[] buffer = new byte[1024*64];//64KB,一包數據不會超過64Kb
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
//正式使用數據包來接收客戶端發來的數據
socket.receive(packet);
//4.從字符數組中,把接收到的數據直接打印出來
//獲取本次數據包接收了多少數據
String rs = new String(buffer, 0, packet.getLength());
System.out.println(rs);
System.out.println(packet.getAddress());
System.out.println(packet.getPort());//客戶端(發送端)的端口,系統默認可以隨機分配
socket.close();//釋放資源
}
}
實現多次反復傳輸
package Basic.src.com.IPDemo.UDPDemo.Demo02;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
public class Cilent {
public static void main(String[] args) throws Exception {
//1.創建客戶端對象(發韭菜出去的人)
DatagramSocket socket = new DatagramSocket();//多開端口時不能設定好
//2.創建數據包對象封裝要發出去的數據(創建一個韭菜盒子)
/*
* public DatagramPacket(byte buf[], int length,
InetAddress address, int port)
* 參數一:封裝要發出去的數據
* 參數二:發生出去的數據大?。ㄗ止潅€數)
* 參數三:服務端的IP地址(找到服務端主機)InetAddress.getByName(****)
* 參數四:服務器程序的端口
* */
Scanner sc = new Scanner(System.in);
while (true) {
//"我是快樂的客戶端,我愛你abc"
System.out.println("請說:");
String msg = sc.nextLine();
//在這段代碼中,while (true) 循環里的 String msg = sc.nextLine(); 是一個阻塞式操作—— 當程序執行到這行時,會暫停當前線程的執行,
// 直到用戶在控制臺輸入內容并按下回車,nextLine() 方法才會返回輸入的字符串,線程才會繼續執行后續的發送邏輯。
//一旦發現用戶輸入exit就退出
if("exit".equals(msg)) {
System.out.println("歡迎下次光臨,退出成功");
socket.close();//釋放資源
break;//跳出死循環
}
byte[] bytes = msg.getBytes();
DatagramPacket packet = new DatagramPacket(bytes, bytes.length, InetAddress.getLocalHost(),6666);
//開始正式發送這個數據包的數據出去了
socket.send(packet);
}
}
}
package Basic.src.com.IPDemo.UDPDemo.Demo02;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Server {
public static void main(String[] args) throws Exception {
System.out.println("-----------------------服務端啟動-------------------------");
//1.創建一個服務端對象(創建一個接韭菜的人)注冊端口
DatagramSocket socket = new DatagramSocket(6666);
//2.創建一個數據包對象,用于接收數據(創建一個韭菜盤子)
byte[] buffer = new byte[1024*64];//64KB,一包數據不會超過64Kb
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
while (true) {
//正式使用數據包來接收客戶端發來的數據
socket.receive(packet);
//4.從字符數組中,把接收到的數據直接打印出來
//獲取本次數據包接收了多少數據
String rs = new String(buffer, 0, packet.getLength());
System.out.println(rs);
System.out.println(packet.getAddress());
System.out.println(packet.getPort());//客戶端(發送端)的端口,系統默認可以隨機分配
//socket.close();//釋放資源,服務端一般不關的
System.out.println("----------------------------------------------------");
}
}
}

浙公網安備 33010602011771號