網絡編程:
(由於基礎太差很多東西不懂,博客比較簡單,後面會補充)
- 一.應用層:
常見協議:(1).訪問互聯網上的網頁(http協議)
(2).遠程登錄(Telnet協議)
(3).遠程登錄且保證安全(ssh協議)
傳輸層:
tcp協議和udp協議
互聯網層:
IP協議
網絡訪問層 - 二.使用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
男
女