java網路程式設計(TCP詳解)

大暑發表於2019-01-09

 網路程式設計詳解-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 

 

相關文章