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
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、 filter、servlet 載入順序及其詳解
一、建立順序
1、web.xml檔案中的載入順序為:listener-filter-servlet
2、如果web.xml中配置了<context-param>,初始化順序:
context-param > Listener > Filter
深度學習筆記(十二)--深度學習資料集MNIST、ImageNet、 COCO 、 VOC介紹
1. MNIST
深度學習領域的“Hello World!”,入門必備!MNIST是一個手寫數字資料庫,它有60000個訓練樣本集和10000個測試樣本集,每個樣本影象的寬高為28*28。此資料集是以二進位制儲存的,不能直接以影象格式檢視,不過很容易找到將其轉換成
(十二)vue.js元件——其他$nextTick、X-Templates、手動掛載例項(6)
1)$nextTick
在vue中,dom的更新是採取非同步更新佇列的,即vue資料變了並不會立即就修改Dom,而是開啟一個佇列,並緩衝在同一事件迴圈中發生的所有資料改變。
在緩衝時會去掉重複資料,避免不必要計算和DOM操作。
所以,在一個事件裡面我們通過修改v
restapi(6)- 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 (三十九)網路程式設計(網路程式設計三要素和Socket、UDP傳輸、多執行緒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學習筆記(十二)usermod、passwd、mkpasswd
屬於 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...in、for...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年提出的模