1. 程式人生 > >初識Socket通信:基於TCP和UDP協議學習網絡編程

初識Socket通信:基於TCP和UDP協議學習網絡編程

auth bsp servers 客戶 name 本地 監聽 max ava

學習筆記:

1.基於TCP協議的Socket網絡編程:

  (1)Socket類構造方法:在客戶端和服務器端建立連接

    Socket s = new Socket(hostName,port);以主機名和端口號作為參數來創建一個Socket對象。

    Socket s = new Socket(address,port);以InetAddress對象和端口號作為參數來創建一個Socket對象。

  創建Socket對象時可能拋出UnknownHostException或IOException異常,必須捕獲它們。

  (2)常用方法

    InetAddress getInetAddress();返回與Socket對象關聯的InetAddress

    int getPort();遠程端口

    int getLocalPort();本地端口

    InputStream getInputStream();相關聯的InputStream

    OutputStream getOutputStream();相關聯的OutputStream

    void close();關閉該Socket

  (3)ServerSocket類:等待客戶端建立連接,連接以後進行通信

    ServerSocket ss = new ServerSocket(port);接收端口號作為參數

    ServerSocket ss = new ServerSocket(port,maxqueue);接收端口號和最大隊列長度作為參數。

    accept();等待客戶端觸發通信

 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStream;
 4 import java.io.InputStreamReader;
 5 import java.io.OutputStream;
 6 import java.net.ServerSocket;
 7 import java.net.Socket;
 8 
 9 /**
10  * 使用Socket變成實現用戶登錄
11  * 1.實現單用戶登錄
12 * 2.服務器端關鍵代碼 13 * @author Administrator 14 * 15 */ 16 public class Test0101 { 17 18 public static void main(String[] args) { 19 try { 20 //創建一個服務器Socket(ServerSocket),指定端口8800並開始監聽 21 ServerSocket serverSocket = new ServerSocket(8800); 22 //使用accept()方法等待客戶端觸發通信 23 Socket socket = serverSocket.accept(); 24 //打開輸入/輸出流 25 InputStream is = socket.getInputStream(); 26 OutputStream os = socket.getOutputStream(); 27 //獲取客戶端信息,即從輸入流讀取信息 28 BufferedReader br = new BufferedReader(new InputStreamReader(is)); 29 String info = null; 30 while(!((info = br.readLine())==null)){ 31 System.out.println("我是服務器,客戶登錄信息為:"+info); 32 } 33 socket.shutdownInput(); 34 //給客戶端一個響應,即向輸出流寫入信息 35 String reply = "歡迎你,登陸成功!"; 36 os.write(reply.getBytes()); 37 os.close(); 38 br.close(); 39 is.close(); 40 socket.close(); 41 serverSocket.close(); 42 } catch (IOException e) { 43 e.printStackTrace(); 44 } 45 } 46 47 }
 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStream;
 4 import java.io.InputStreamReader;
 5 import java.io.OutputStream;
 6 import java.net.Socket;
 7 import java.net.UnknownHostException;
 8 
 9 /**
10  * 使用Socket變成實現用戶登錄
11  * 1.實現單用戶登錄
12  * 2.客戶端關鍵代碼
13  * @author Administrator
14  *
15  */
16 public class Test01 {
17 
18     public static void main(String[] args) {
19         try {
20             //建立客戶端Socket連接,指定服務器的位置為本機以及端口8800
21             Socket socket = new Socket("127.0.0.1",8800);
22             //打開輸入/輸出流
23             OutputStream os = socket.getOutputStream();
24             InputStream is = socket.getInputStream();
25             //發送客戶端登錄信息,即向輸出流寫入信息
26             String info = "用戶名:Tom;用戶密碼:123456";
27             os.write(info.getBytes());
28             socket.shutdownOutput();
29             //接受服務器端的響應,即從輸入流讀取信息
30             String reply = null;
31             BufferedReader br = new BufferedReader(new InputStreamReader(is));
32             while(!((reply = br.readLine())==null)){
33                 System.out.println("我是客戶端,服務器端的響應為:"+reply);
34             }
35             //關閉資源
36             br.close();
37             is.close();
38             os.close();
39             socket.close();
40         } catch (UnknownHostException e) {
41             e.printStackTrace();
42         } catch (IOException e) {
43             e.printStackTrace();
44         }
45         
46     }
47 
48 }
 1 import java.io.IOException;
 2 import java.io.InputStream;
 3 import java.io.ObjectInputStream;
 4 import java.io.OutputStream;
 5 import java.net.ServerSocket;
 6 import java.net.Socket;
 7 
 8 /**
 9  * 服務器端關鍵代碼
10  * @author Administrator
11  *
12  */
13 public class Test0201 {
14 
15     public static void main(String[] args) {
16         try {
17             //創建一個服務器Socket(ServerSocket)連接,指定端口並開始監聽
18             ServerSocket serverSocket = new ServerSocket(8800);
19             //使用accpet()方法等待客戶端觸發通信
20             Socket socket = serverSocket.accept();
21             //打開輸入輸出流
22             InputStream is = socket.getInputStream();
23             OutputStream os = socket.getOutputStream();
24             //反序列化
25             ObjectInputStream ois = new ObjectInputStream(is);
26             //獲取客戶端信息(從輸入流讀取信息)
27             User user = (User)ois.readObject();
28             if (!(user==null)) {
29                 System.out.println("我是服務器端,客戶登錄信息為:\n用戶名:"+user.getLoginName()+",密碼:"+user.getPwd());
30             }
31             //給客戶端一個響應(向輸出流寫入信息)
32             String reply = "歡迎你,登陸成功!";
33             os.write(reply.getBytes());
34             //關閉資源
35             os.close();
36             ois.close();
37             is.close();
38             socket.close();
39             serverSocket.close();
40         } catch (ClassNotFoundException e) {
41             e.printStackTrace();
42         } catch (IOException e) {
43             e.printStackTrace();
44         }
45 
46     }
47 
48 }
 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStream;
 4 import java.io.InputStreamReader;
 5 import java.io.ObjectOutputStream;
 6 import java.io.OutputStream;
 7 import java.net.Socket;
 8 import java.net.UnknownHostException;
 9 
10 /**
11  * 客戶端關鍵代碼
12  * @author Administrator
13  *
14  */
15 public class Test02 {
16 
17     public static void main(String[] args) {
18         try {
19             //建立客戶端Socket連接,指定服務器的位置和端口
20             Socket socket = new Socket("127.0.0.1",8800);
21             //打開輸入輸出流
22             OutputStream os = socket.getOutputStream();
23             InputStream is = socket.getInputStream();
24             //對象序列化
25             ObjectOutputStream oos = new ObjectOutputStream(os);
26             //發送客戶端登錄信息(向輸出流寫入數據)
27             User user = new User();
28             user.setLoginName("Tom");
29             user.setPwd("12345678");
30             oos.writeObject(user);
31             socket.shutdownOutput();
32             //接收服務器端的響應(從輸入流讀取信息)
33             String reply = null;
34             BufferedReader br = new BufferedReader(new InputStreamReader(is));
35             while(!((reply = br.readLine())==null)){
36                 System.out.println("我是客戶端,服務器端的響應為"+reply);
37             }
38             //關閉資源
39             br.close();
40             oos.close();
41             is.close();
42             os.close();
43             socket.close();
44         } catch (UnknownHostException e) {
45             e.printStackTrace();
46         } catch (IOException e) {
47             e.printStackTrace();
48         }
49 
50     }
51 
52 }

案例:實現多客戶端用戶登錄

1.登錄線程類

 1 import java.io.IOException;
 2 import java.io.InputStream;
 3 import java.io.ObjectInputStream;
 4 import java.io.OutputStream;
 5 import java.net.Socket;
 6 
 7 /**
 8  * 登錄線程類
 9  * @author Administrator
10  *
11  */
12 public class LoginThread extends Thread {
13     Socket socket = null;
14     //每啟動一個線程,連接對應的Socket接口
15     public LoginThread(Socket socket){
16         this.socket = socket;
17     }
18     //啟動線程,即響應客戶請求
19     public void run(){
20         try {
21             //打開輸入輸出流
22             InputStream is = socket.getInputStream();
23             OutputStream os = socket.getOutputStream();
24             //反序列化
25             ObjectInputStream ois = new ObjectInputStream(is);
26             //獲取客戶端信息(從輸入流讀取信息)
27             User user = (User)ois.readObject();
28             if (!(user==null)) {
29                 System.out.println("我是服務器端,客戶登錄信息為:\n用戶名:"+user.getLoginName()+",密碼:"+user.getPwd());
30             }
31             //給客戶端一個響應(向輸出流寫入信息)
32             String reply = "歡迎你,登陸成功!";
33             os.write(reply.getBytes());
34             //關閉資源
35             os.close();
36             ois.close();
37             is.close();
38             socket.close();
39         } catch (ClassNotFoundException e) {
40             e.printStackTrace();
41         } catch (IOException e) {
42             e.printStackTrace();
43         }
44     }
45 
46 }

2.服務器端的響應

 1 import java.io.IOException;
 2 import java.net.ServerSocket;
 3 import java.net.Socket;
 4 
 5 /**
 6  * 服務器端關鍵代碼
 7  * @author Administrator
 8  *
 9  */
10 public class Test0301 {
11 
12     public static void main(String[] args) {
13         try {
14             //創建一個服務器Socket(ServerSocket),指定端口並開始監聽
15             @SuppressWarnings("resource")
16             ServerSocket serverSocket = new ServerSocket(8800);
17             //使用accpet()方法等待客戶端觸發通信
18             Socket socket = null;
19             while (true) {
20                 //監聽一直進行中
21                 socket = serverSocket.accept();
22                 LoginThread login = new LoginThread(socket);
23                 login.start();
24             }
25         } catch (IOException e) {
26             e.printStackTrace();
27         }
28 
29     }
30 
31 }

3.客戶登陸

 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStream;
 4 import java.io.InputStreamReader;
 5 import java.io.ObjectOutputStream;
 6 import java.io.OutputStream;
 7 import java.net.Socket;
 8 import java.net.UnknownHostException;
 9 
10 /**
11  * 實現多客戶端用戶登錄
12  * @author Administrator
13  *
14  */
15 public class Test03 {
16 
17     public static void main(String[] args) {
18         try {
19             //建立客戶端Socket連接,指定服務器的位置和端口
20             Socket socket = new Socket("127.0.0.1",8800);
21             //打開輸入輸出流
22             OutputStream os = socket.getOutputStream();
23             InputStream is = socket.getInputStream();
24             //對象序列化
25             ObjectOutputStream oos = new ObjectOutputStream(os);
26             //發送客戶端登錄信息(向輸出流寫入數據)
27             User user = new User();
28             user.setLoginName("Kate");
29             user.setPwd("12345678");
30             oos.writeObject(user);
31             socket.shutdownOutput();
32             //接收服務器端的響應(從輸入流讀取信息)
33             String reply = null;
34             BufferedReader br = new BufferedReader(new InputStreamReader(is));
35             while(!((reply = br.readLine())==null)){
36                 System.out.println("我是客戶端,服務器端的響應為"+reply);
37             }
38             //關閉資源
39             br.close();
40             oos.close();
41             is.close();
42             os.close();
43             socket.close();
44         } catch (UnknownHostException e) {
45             e.printStackTrace();
46         } catch (IOException e) {
47             e.printStackTrace();
48         }
49     }
50 
51 }

二、InetAddress類中的工廠方法

  static InetAddress getLocalHost();返回本地主機InetAddress對象

  static InetAddress getByName(String hostName);返回InetAddress對象

  static InetAddress[] getAllByName(String hostName);返回主機名~所有主機對象組

 1 import java.net.InetAddress;
 2 import java.net.UnknownHostException;
 3 
 4 /**
 5  * 獲取淘寶網服務器地址
 6  * @author Administrator
 7  *
 8  */
 9 public class Test002 {
10 
11     public static void main(String[] args) {
12         //定義目標網址
13         String target = "localhost";
14         System.out.println("------淘寶的主服務器地址------");
15         InetAddress iad;
16         try {
17             iad = InetAddress.getByName(target);
18             System.out.println(iad);
19         } catch (UnknownHostException e) {
20             e.printStackTrace();
21         }
22         
23         System.out.println("------淘寶的所有服務器地址------");
24         InetAddress[] iads;
25         try {
26             iads = InetAddress.getAllByName(target);
27             System.out.println(target+"的IP地址有"+iads.length+"個,分別是:");
28             for (InetAddress ia : iads) {
29                 System.out.println(ia);
30             }
31         } catch (UnknownHostException e) {
32             e.printStackTrace();
33         }
34 
35     }
36 
37 }

初識Socket通信:基於TCP和UDP協議學習網絡編程