網路程式設計詳解-TCP
一,TCP協議的特點
面向連線的協議(有傳送端就一定要有接收端)
通過三次連線握手建立連線
通過四次握手斷開連線
基於IO流傳輸資料
傳輸資料大小沒有限制
速度慢但可靠
二,TCP協議相關的兩個類
Socket(一個socket物件表示一個客戶端物件)
常用構造方法介紹
Socket(String host, int port)
host引數為伺服器的ip地址字串
port引數為伺服器的埠號
大家記憶的時候可以使用這一種記憶方式 :記住socket是個客戶端物件就可以了,引數就想socket物件既然是客戶端物件他就需要連線伺服器,那麼他需要什麼呢,連線伺服器肯定需要服務端的IP和地址才能夠連線。
三,常用方法介紹
OutputStream getOutputStream() 獲取位元組輸出流(該位元組輸出可以向服務端輸出資料,只能獲取一次,呼叫該方法多少次,獲取到的還是同一個物件)
InputStream getInputStream() 獲取位元組輸入流(該位元組輸入流可以讀取伺服器端方式過來的資料,只能獲取一次,呼叫該方法多少次,獲取到的還是同一個物件)
void shutdownOutputStream() 關閉輸出流(在socket裡面作用就是告訴伺服器端,資料已經傳輸完成,呼叫該方法以後獲取到的輸出流就不能使用了)
void close() 關閉資源
int getPort() 獲取伺服器端的埠
InetAddress getInetAddress()
四,獲取伺服器端的IP地址物件
ServerSocket(一個該類物件就代表一個服務端物件)
常用構造方法介紹
ServerSocket(int port)
port引數為服務端的埠號
常用方法介紹
Socket accept() 等待客戶端連線,獲取一個客戶端物件
InteAddress getInteAdderss() 獲取連線的客戶端的ip物件
五,網路程式設計(TCP-服務端響應客戶端)程式碼
1.客戶端程式碼
1 import java.io.BufferedReader; 2 import java.io.BufferedWriter; 3 import java.io.IOException; 4 import java.io.InputStreamReader; 5 import java.io.OutputStreamWriter; 6 import java.net.Socket; 7 import java.util.Scanner; 8 9 public class UserClint_3 { 10 static Scanner sc = new Scanner(System.in); 11 public static void main(String[] args) throws IOException { 12 //1.建立客戶端套接字 13 Socket s = new Socket("localhost", 152); 14 //2.建立客戶端輸出流 15 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); 16 //3.使用者輸入使用者和密碼,並寫入輸出流 17 System.out.println("請輸入使用者名稱:"); 18 String user = sc.nextLine(); 19 System.out.println("請輸入使用者密碼:"); 20 String password = sc.nextLine(); 21 bw.write(user); 22 bw.flush(); 23 bw.newLine(); 24 bw.write(password); 25 bw.flush(); 26 27 //4.通知服務端客戶端使用者資訊寫入完畢 28 s.shutdownOutput(); 29 30 //5.建立輸入流來接受服務端響應的資訊 31 BufferedReader br= new BufferedReader(new InputStreamReader(s.getInputStream())); 32 String info = br.readLine(); 33 //6.輸出響應資訊 34 System.out.println(info); 35 //7.關閉套接字 36 s.close(); 37 } 38 }
2.將客戶登入資訊放在在User.Properties檔案中,持久化資訊庫
1 username=lsx 2 pwd=123 3 username=wn 4 pwd=123
3.伺服器端程式碼
1 import java.io.BufferedReader; 2 import java.io.BufferedWriter; 3 import java.io.FileInputStream; 4 import java.io.IOException; 5 import java.io.InputStreamReader; 6 import java.io.OutputStreamWriter; 7 import java.net.ServerSocket; 8 import java.net.Socket; 9 import java.util.HashMap; 10 import java.util.Map; 11 import java.util.Properties; 12 13 public class UserServer_3 { 14 public static Map<String, String> User() throws IOException{ 15 //將使用者資訊存放在User.properties檔案中 16 //建立properties類獲取使用者資訊 17 Properties p = new Properties(); 18 //通過load()方法讀取使用者資訊 19 p.load(new FileInputStream("User.Properties")); 20 //通過getProperty()方法獲取使用者資訊的鍵,得到使用者資訊的值 21 String user = p.getProperty("username"); 22 String pwd = p.getProperty("pwd"); 23 24 //建立map集合,將使用者資訊的鍵以及對應的值放入集合中 25 Map<String, String> map = new HashMap<>(); 26 map.put("username", user); 27 map.put("pwd", pwd); 28 return map; 29 } 30 public static void main(String[] args) throws IOException { 31 //1.建立伺服器端套接字 32 ServerSocket ss = new ServerSocket(152); 33 //2.監聽客戶端套接字 34 Socket s = ss.accept(); 35 //3.建立輸入流用來讀取客戶端傳送的使用者資訊 36 BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); 37 //4.讀取客戶端傳送的使用者資訊 38 String username = br.readLine(); 39 String password = br.readLine(); 40 41 //5.呼叫map集合,拿到map集合裡面的使用者資訊和客戶端傳送的資訊進行比對 42 Map<String, String> map = User(); 43 //6.建立輸出流用來響應客戶端 44 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); 45 //7.進行資訊比對 46 if(map.get("username").equals(username)&&map.get("pwd").equals(password)){ 47 //8.寫入響應資訊 48 bw.write("恭喜您,登入成功!"); 49 bw.flush(); 50 }else{ 51 bw.write("登入失敗,使用者或使用者密碼錯誤!"); 52 bw.flush(); 53 } 54 //9.關閉客戶端套接字 55 s.close(); 56 } 57 }
java容器和資料結構詳解:連結:https://pan.baidu.com/s/1jR9neu9JuTy4UpBN1p83bQ 提取碼:lutu