1. 程式人生 > >JavaSE(十二)網路程式設計、JDBC程式設計、函數語言程式設計

JavaSE(十二)網路程式設計、JDBC程式設計、函數語言程式設計

網路程式設計、JDBC程式設計、函數語言程式設計

網路程式設計

Socket

TCP:面向連線,可靠傳輸
UDP:不面向連線,不可靠傳輸

TCP程式設計

1)客戶端使用Socket(InetAddress, port)開啟Socket
2)伺服器端用ServerSocket監聽埠
3)伺服器端用accept接收並返回Socket
4)雙方通過Socket開啟 InputStream / OutputStream 讀寫資料
5)flush()用於強制輸出緩衝區

伺服器端

public class TCPServer {
	public static void main(String[] args) throws Exception{
		ServerSocket socketSocket = new ServerSocket(9090);
		System.out.println("TCP server ready...");
		Socket socket = socketSocket.accept();
		try(BufferedReader reader = new BufferedReader(
				new InputStreamReader
(socket.getInputStream(), StandardCharsets.UTF_8))){ try(BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8))){ String cmd = reader.readLine(); if("time".equals(cmd)){ writer.write(LocalDateTime.now().toString() + "\n"); writer.flush(); }else{ writer.write("Sorroy?\n"); writer.flush(); } } } socket.close(); socketSocket.close(); } }

客戶端

public class TCPClient {
	public static void main(String[] args) throws IOException {
		InetAddress address = InetAddress.getLoopbackAddress();
		try (Socket socket = new Socket(address, 9090)) {
			try (BufferedReader reader = new BufferedReader(
					new InputStreamReader(socket.getInputStream(),
							StandardCharsets.UTF_8))) {
				try (BufferedWriter writer = new BufferedWriter(
						new OutputStreamWriter(socket.getOutputStream(),
								StandardCharsets.UTF_8))) {
					writer.write("time\n");
					writer.flush();
					String response = reader.readLine();
					System.out.println("Response: " + response);
				}
			}
		}
	}
}
// 所有IP地址
ServerSocket(int port)
ServerSocket(int port, int backlog)
// 指定IP地址
ServerSocket(int port, int backlog, InetAddress bindAddr)
// 例如:假設公網:101.77.99.88,內網:10.1.0.100
// 所有IP都可以訪問
new ServerSocket(12345);
// 僅本機(127.0.0.1)可以訪問
new ServerSocket(12345, 50, InetAddress.getLoopbackAddress());
// 僅公網IP可以訪問
new ServerSocket(12345, 50, InetAddress.getByAddress(new byte[]{101, 77, 99, 88}));
// 僅內網IP可以訪問
new ServerSocket(12345, 50, InetAddress.getByAddress(new byte[]{10, 1, 0, 100}));

TCP多執行緒
伺服器端

public class TCPServer {
	public static void main(String[] args) throws Exception {
		@SuppressWarnings("resource")
		ServerSocket socketSocket = new ServerSocket(9090);
		System.out.println("TCP server ready...");
		for (;;) {
			Socket socket = socketSocket.accept();
			System.out.println("Accept from " + socket.getRemoteSocketAddress());
			TimeHandler handler = new TimeHandler(socket);
			handler.start();
		}
	}
}
class TimeHandler extends Thread {
	Socket socket;
	public TimeHandler(Socket socket) {
		this.socket = socket;
	}
	@Override
	public void run(){
		try(BufferedReader reader = new BufferedReader(
				new InputStreamReader(socket.getInputStream(),
						StandardCharsets.UTF_8))){
			try(BufferedWriter writer = new BufferedWriter(
					new OutputStreamWriter(socket.getOutputStream(),
							StandardCharsets.UTF_8))){
				for(;;){
					String cmd = reader.readLine();
					if("q".equals(cmd)){
						writer.write("bye!\n");
						writer.flush();
					}else if("time".equals(cmd)){
						writer.write(LocalDateTime.now().toString() + "\n");
						writer.flush();
					}else {
						writer.write("Sorroy?\n");
						writer.flush();
					}
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try{
				this.socket.close();
			} catch (IOException e){
				e.printStackTrace();
			}
		}
	}
}

客戶端

public class TCPClient {
	public static void main(String[] args) throws IOException, InterruptedException {
		InetAddress address = InetAddress.getByName("localhost");
		try (Socket socket = new Socket(address, 9090)) {
			try (BufferedReader reader = new BufferedReader(
					new InputStreamReader(socket.getInputStream(),
							StandardCharsets.UTF_8))) {
				try (BufferedWriter writer = new BufferedWriter(
						new OutputStreamWriter(socket.getOutputStream(),
								StandardCharsets.UTF_8))) {
					writer.write("time\n");
					writer.flush();
					String response = reader.readLine();
					System.out.println("Response: " + response);
					Thread.sleep(1000);
					writer.write("q\n");
					writer.flush();
					response = reader.readLine();
					System.out.println("Response: " + response);
				}
			}
		}
	}
}
1)伺服器端使用無線迴圈
2)每次accept()返回後,建立新的執行緒來處理客戶端請求
3)每個客戶端請求對應一個服務執行緒
4)使用執行緒池可以提高執行效率

練習
請把多執行緒模型中每次建立一個新執行緒改為使用執行緒池實現

UDP程式設計

1)UDP不需要建立連線
2)UDP不保證可靠傳輸
3)客戶端使用DatagramSocket.connect()指定遠端地址和埠
4)伺服器端用DatagramSocket(port)監聽埠
5)雙方通過 revice / send 讀寫資料
6)沒有 IO 流資料

伺服器端

public class UDPServer {
	public LocalDateTime currentTime(){
		return LocalDateTime.now();
	}
	public static void main(String[] args) throws Exception{
		@SuppressWarnings("resource")
		DatagramSocket ds = new DatagramSocket(9090);
		System.out.println("UDP server ready...");
		for(;;){
			// receive:
			byte[] buffer = new byte[1024];
			DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
			ds.receive(packet);
			byte[] data = packet.getData();
			String s = new String(data, StandardCharsets.UTF_8);
			System.out.println("Packet received from: " + packet.getSocketAddress() + " " + s);
			// send:
			String response = LocalDateTime.now().toString();
			packet.setData(response.getBytes(StandardCharsets.UTF_8));
			ds.send(packet);
		}
	}
}

客戶端

public class UDPClient {
	public static void main(String[] args) throws Exception{
		InetAddress address = InetAddress.getLoopbackAddress();
		try(DatagramSocket socket = new DatagramSocket()){
			socket.connect(address, 9090);
			byte[] data = "time".getBytes(StandardCharsets.UTF_8);
			DatagramPacket packet = new DatagramPacket(data, data.length);
			socket.send(packet);
			System.out.println("Data was send.");
			Thread.sleep(1000);
			byte[] buffer = new byte[1024];
			DatagramPacket response = new DatagramPacket(buffer, buffer.length);
			socket.receive(response);
			byte[] responseData = response.getData();
			String responseText = new String(responseData, 0, response.getLength(), StandardCharsets.UTF_8);
			System.out.println("Response: " + responseText);
		}
	}
}

Email

在這裡插入圖片描述

傳送Email

SMTP(Simple Mail Transport Protocol)
標準埠25,加密埠 465、587
使用javamail API傳送Email:
1)確定SMTP伺服器資訊:域名、埠、使用明文、SSL、TLS
2)呼叫相關API傳送Email
3)設定debug模式可以檢視通訊詳細內容

// 1. 建立Session:
Session session = Session.getInstance(props, new Authenticator(){...});
// 2. 建立Message物件:
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("[email protected]"));
message.setRecipient(Message.RecipientType.TO, new InternetAddress("[email protected]"));
message.setSubject("RE:how to use JavaMail", "UTF-8");
message.setText("blablabla...", "UTF-8");
// 3. 傳送郵件:
Transport.send(message);
<dependency>
  <groupId>javax.mail</groupId>
  <artifactId>mail</artifactId>
  <version>1.4</version>
</dependency>

傳送文字郵件

/**
 * 傳送文字郵件 
 */
public class SendMail {
	/**
	 * 郵件伺服器域名
	 */
	final String smtpHost;
	/**
	 * 郵件伺服器登陸名
	 */
	final String username;
	/**
	 * 郵件伺服器登陸密碼
	 */
	final String password;
	final boolean debug;
	public SendMail(String smtpHost, String username, String password){
		this.smtpHost = smtpHost;
		this.username = username;
		this.password = password;
		this.debug = true;
	}
	public static void main(String[] args) throws Exception {
		SendMail sender = new SendMail("smtp.sina.com", "[email protected]", "java-12345678");
		// 建立Session:
		Session session = sender.createSSLSession();
		// 建立Message:
		Message message = createTextMessage(session, "[email protected]", "[email protected]", "Java郵件測試",
				"Hello, 這是一封javamail測試郵件!");
		// 傳送郵件:
		Transport.send(message);
	}
	/**
	 * 建立SSL會話
	 * @return
	 */
	Session createSSLSession() {
		Properties props = new Properties();
		props.put("mail.smtp.host", this.smtpHost); // SMTP主機名
		props.put("mail.smtp.port", "465"); // 主機埠號
		props.put("mail.smtp.auth", "true"); // 是否需要使用者認證
		// 啟動SSL:
		props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
		props.put("mail.smtp.socketFactory.port", "465");
		Session session = Session.getInstance(props, new Authenticator() {
			// 使用者名稱+口令認證:
			protected PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication(SendMail.this.username, SendMail.this.password);
			}
		});
		session.setDebug(this.debug); // 顯示除錯資訊
		return session;
	}
//	/**
//	 * 建立TLS會話
//	 * @return
//	 */
//	Session createTLSSession() {
//		Properties props = new Properties();
//		props.put("mail.smtp.host", this.smtpHost); // SMTP主機名
//		props.put("mail.smtp.port", "587"); // 主機埠號
//		props.put("mail.smtp.auth", "true"); // 是否需要使用者認證
//		props.put("mail.smtp.starttls.enable", "true"); // 啟用TLS加密
//		Session session = Session.getInstance(props, new Authenticator() {
//			protected PasswordAuthentication getPasswordAuthentication() {
//				return new PasswordAuthentication(SendMail.this.username, SendMail.this.password);
//			}
//		});
//		session.setDebug(this.debug); // 顯示除錯資訊
//		return session;
//	}
//	/**
//	 * 建立Insecure會話
//	 * @return
//	 */
//	Session createInsecureSession(String host, String username, String password) {
//		Properties props = new Properties();
//		props.put("mail.smtp.host", this.smtpHost); // SMTP主機名
//		props.put("mail.smtp.port", "25"); // 主機埠號
//		props.put("mail.smtp.auth", "true"); // 是否需要使用者認證
//		Session session = Session.getInstance(props, new Authenticator() {
//			protected PasswordAuthentication getPasswordAuthentication() {
//				return new PasswordAuthentication(SendMail.this.username, SendMail.this.password);
//			}
//		});
//		session.setDebug(this.debug); // 顯示除錯資訊
//		return session;
//	}
	/**
	 * 建立文字的訊息(Message)物件
	 * @param session		會話
	 * @param from			傳送方郵件地址
	 * @param to				接收方郵件地址
	 * @param subject		郵件主題
	 * @param body			郵件正文
	 * @return
	 * @throws MessagingException
	 */
	static Message createTextMessage(Session session, String from, String to, String subject, String body)
			throws MessagingException {
		MimeMessage message = new MimeMessage(session);
		message.setFrom(new InternetAddress(from));
		message.setRecipient(Message.RecipientType.TO, 
            
           

相關推薦

JavaSE網路程式設計JDBC程式設計語言程式設計

網路程式設計、JDBC程式設計、函數語言程式設計 網路程式設計 Socket TCP程式設計 UDP程式設計 Email 傳送Email 傳送文字郵件

JavaWeb---web.xml 中的listener filterservlet 載入順序及其詳解

一、建立順序   1、web.xml檔案中的載入順序為:listener-filter-servlet   2、如果web.xml中配置了<context-param>,初始化順序:       context-param > Listener > Filter

深度學習筆記--深度學習資料集MNISTImageNet COCO VOC介紹

1.  MNIST 深度學習領域的“Hello World!”,入門必備!MNIST是一個手寫數字資料庫,它有60000個訓練樣本集和10000個測試樣本集,每個樣本影象的寬高為28*28。此資料集是以二進位制儲存的,不能直接以影象格式檢視,不過很容易找到將其轉換成

vue.js元件——其他$nextTickX-Templates手動掛載例項6

1)$nextTick 在vue中,dom的更新是採取非同步更新佇列的,即vue資料變了並不會立即就修改Dom,而是開啟一個佇列,並緩衝在同一事件迴圈中發生的所有資料改變。 在緩衝時會去掉重複資料,避免不必要計算和DOM操作。 所以,在一個事件裡面我們通過修改v

restapi6- do it the functional way, 重溫語言程式設計

  再次看了看上篇部落格的原始碼,發現連自己都看不懂了。想是為了趕時間交貨不知不覺又回到OOP行令模式了,看看下面這段程式碼: (post & parameters('pid,'desc.?,'width.as[Int].?,'heigth.as[Int].?)) { (p

scala與語言程式設計——面向物件模式在語言程式設計下的實現

用函式組合實現設計模式   設計模式是面向物件下的產物,但其中蘊藏的程式設計理念仍然是通用的。對於面向物件的程式設計熟手而言,在程式設計時幾乎離不開常用的設計模式。在剛開始使用函數語言程式設計的時候,還會不自覺地想使用策略、裝飾器等模式,但卻不知在函數語言程式設計的世界裡,有些模式早已被

scala與語言程式設計——從範疇論看語言程式設計

什麼是範疇?   生活中我們經常說:我們講的不是一個範疇裡的東西!意思就是說兩個人所講的事物不具有任何關聯,沒有相關性。其實範疇Category就是指一群事物以及這些事物之間的所有關聯關係,這些事物和這些關聯關係共同組成了某個範疇。   舉一個例子,比如在動物這個範疇中,蟬,螳螂,黃雀

Java 8程式設計進階-Stream之語言程式設計

1、什麼是Stream       Java 8 API添加了一個新的抽象稱為流Stream,可以讓你以一種宣告的方式處理資料。Stream 使用一種類似用 SQL 語句從資料庫查詢資料的直觀方式來提供一種對 Java 集合運算和表達的高階抽象。Stream API可以極大提

javaSE (三網路程式設計網路程式設計三要素和SocketUDP傳輸多執行緒UDP傳輸

1、網路程式設計三要素: 地址:定位電腦 本地迴路地址:127.0.0.1 廣播地址:255.255.255.255 埠號:定位電腦中的程式 o~65525 儘量使用1024以上的 協議:資料交換的規則/標準 UDP: 面向無連線,資料不安全,速度快,不區分客戶端與服

python面向物件程式設計

面向物件程式設計 面向物件--Object Oriented Programming,簡稱oop,是一種程式設計思想。在說面向物件之前,先說一下什麼是程式設計正規化,程式設計正規化你按照什麼方式來去程式設計,去實現一個功能。舉個例子,你要做飯,可以用電磁爐,也可以用煤氣灶。不同的程式設計正規化本質上代表對各

區塊鏈開發公有鏈聯盟鏈私有鏈及網路配置介紹

以太坊網路 去中心化共識的基礎是參與節點的點對點網路,節點維護並保證區塊鏈網路的安全。參見挖礦。 以太坊網路資料統計 EthStats.net是以太坊網路實時資料的儀表板,這個儀表板展示重要資訊,諸如現在的區塊,散表難度,gas價格和gas花費等。

黑馬程式設計師 筆記——網路程式設計

------- android培訓、java培訓、期待與您交流! ---------- 網路程式設計 一、預備知識: 1、IP地址:   網際網路上連線了無數的伺服器和計算機,每個主機都有唯一的地址,作為該主機在網際網路上的標識,這個地址就是IP地址。IP地址是一種在I

Linux學習網路程式設計

#include <stdio.h> //printf #include <arpa/inet.h> //inet_addr htons #include <sys/types.h> #include <sys/socket.h> //socket bin

Linux學習筆記usermodpasswdmkpasswd

屬於 pass bsp exp -- 改密碼 use uid gid 一、usermod修改用戶信息usermod -u 111 username #修改用戶 usermod -g grp2 username #修改用戶組 usermod -d

Go語言開發Go語言常用標準庫

after 更新 use har 相等 文件的 環境變量 its 內核 Go語言開發(十二)、Go語言常用標準庫二 一、os 1、os簡介 os 包提供了不依賴平臺的操作系統函數接口,設計像Unix風格,但錯誤處理是go風格,當os包使用時,如果失敗後返回錯誤類型而不是錯誤

前端—— JavaScript基礎操作:if語句for循環while循環for...infor...of異常處理事件JS選擇器JS操作頁面樣式

結束 建議 prop map、set -c 表單元素 tle form collect JavaScript基礎操作 一、分支結構 1、if語句 if 基礎語法 if (條件表達式) { 代碼塊; } // 當條件表達式結果為true,會執行代碼塊;反之不執行

小橙書閱讀指南——無向圖深度優先搜索和路徑查找算法

val 短路徑 clas 圖論 bsp 檢查 inf targe 自然 在計算機應用中,我們把一系列相連接的節點組成的數據結構,叫做圖。今天我們將要介紹它的一種形式——無向圖,以及針對這種結構的深度優先搜索和路徑查找算法。 一、無向圖數據結構 接口: /** * 圖論接

安全程式設計 - static

1.引言         java中被static修飾的成員叫做靜態成員或類成員。她屬於整個類所有,而非某一個物件所有,即被類的所以物件所共享。靜態成員可以使用類名直接訪問,也可以使用物件名進行訪問。大多時候推薦使用類名進行訪問。   &nb

程式設計菜鳥到大佬之路:C語言程式

第十二天學習精要 遞迴初步 遞迴 一個函式,自己呼叫自己,就是遞迴。 # include <iostream> using namespace std; int factorial(int n) // 函式返回n的階乘 { if (n ==

機器學習與深度學習系列連載: 第二部分 深度學習卷積神經網路 3 經典的模型LeNet-5,AlexNet ,VGGNet,GoogLeNet,ResNet

卷積神經網路 3 經典的模型 經典的卷積神經網路模型是我們學習CNN的利器,不光是學習原理、架構、而且經典模型的超引數、引數,都是我們做遷移學習最好的源材料之一。 1. LeNet-5 [LeCun et al., 1998] 我們還是從CNN之父,LeCun大神在98年提出的模