初識Socket通信:基於TCP和UDP協議學習網絡編程
學習筆記:
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協議學習網絡編程