------- android培訓、java培訓、期待與您交流! ----------
26.01網絡編程概述網絡編程:就是用來實現網絡互連的不同計算機上運行的程序間可以進行數據交換。
26.02網絡模型概述和圖解計算機網絡之間以何種規則進行通信,就是網絡模型研究問題。
網絡模型一般是指
OSI(OpenSystemInterconnection開放系統互連)參考模型
TCP/ip參考模型

OSI參考模型七層簡述:
1.物理層:主要定義物理設備標準,如網線的接口類型、光纖的接口類型、各種傳輸介質的傳輸速率等。它的主要作用是傳輸比特流(就是由1、0轉化為電流強弱來進行傳輸,到達目的地后在轉化為1、0,也就是我們常說的數模轉換與模數轉換)。這一層的數據叫做比特。
2.數據鏈路層:主要將從物理層接收的數據進行MAC地址(網卡的地址)的封裝與解封裝。常把這一層的數據叫做幀。在這一層工作的設備是交換機,數據通過交換機來傳輸。
3.網絡層:主要將從下層接收到的數據進行IP地址(例192.168.0.1)的封裝與解封裝。在這一層工作的設備是路由器,常把這一層的數據叫做數據包。
4.傳輸層:定義了一些傳輸數據的協議和端口號(WWW端口80等),如:TCP(傳輸控制協議,傳輸效率低,可靠性強,用于傳輸可靠性要求高,數據量大的數據),UDP(用戶數據報協議,與TCP特性恰恰相反,用于傳輸可靠性要求不高,數據量小的數據,如QQ聊天數據就是通過這種方式傳輸的)。主要是將從下層接收的數據進行分段和傳輸,到達目的地址后再進行重組。常常把這一層數據叫做段。
5.會話層:通過傳輸層(端口號:傳輸端口與接收端口)建立數據傳輸的通路。主要在你的系統之間發起會話或者接受會話請求(設備之間需要互相認識可以是IP也可以是MAC或者是主機名)
6.表示層:主要是進行對接收的數據進行解釋、加密與解密、壓縮與解壓縮等(也就是把計算機能夠識別的東西轉換成人能夠能識別的東西(如圖片、聲音等)。
7.應用層:主要是一些終端的應用,比如說FTP(各種文件下載),WEB(IE瀏覽),QQ之類的(可以把它理解成我們在電腦屏幕上可以看到的東西.就是終端應用)。
26.03網絡編程三要素概述網絡通信三要素
1.IP地址: InetAddress網絡中設備的標識,不易記憶,可用主機名
2.端口號: 用于標識進程的邏輯地址,不同進程的標識
3.傳輸協議: 通訊的規則常見協議:TCP,UDP
26.04網絡編程三要素之IP概述1IP地址:InetAddress
1.網絡中設備的標識
2.不易記憶,可用主機名
3.本地回環地址:127.0.0.1主機名:localhost
IP地址的組成
IP地址=網絡號碼+主機地址
A類IP地址:第一段號碼為網絡號碼,剩下的三段號碼為本地計算機的號碼
B類IP地址:前二段號碼為網絡號碼,剩下的二段號碼為本地計算機的號碼
C類IP地址:前三段號碼為網絡號碼,剩下的一段號碼為本地計算機的號碼
A類 1.0.0.1---127.255.255.254
(1)10.X.X.X是私有地址(私有地址就是在互聯網上不使用,而被用在局域網絡中的地址)
(2)127.X.X.X是保留地址,用做循環測試用的。
B類 128.0.0.1---191.255.255.254
172.16.0.0---172.31.255.255是私有地址。169.254.X.X是保留地址。
C類 192.0.0.1---223.255.255.254
192.168.X.X是私有地址
D類 224.0.0.1---239.255.255.254
E類 240.0.0.1---247.255.255.254
DOS命令ipconfig:查看本機IP地址
xxx.xxx.xxx.0網絡地址
xxx.xxx.xxx.255廣播地址
127.0.0.1回環地址,可用于測試本機的網絡是否有問題.ping127.0.0.1
26.05InetAddress類的概述和使用為了方便我們對IP地址的獲取和操作,java提供了一個類InetAddress供我們使用
InetAddress:此類表示互聯網協議(IP)地址。IP地址是IP使用的32位或128位無符號數字,它是一種低級協議,UDP和TCP協議都是在它的基礎上構建的。
方法:
1.publicstaticInetAddress[]getAllByName(StrinGhost)throwsUnknownHostException
在給定主機名的情況下,根據系統上配置的名稱服務返回其IP地址所組成的數組。
2.publicStringgetHostName()
獲取此IP地址的主機名。
3.publicStringgetHostAddress()
返回IP地址字符串(以文本表現形式)。
例:
1 InetAddress address = InetAddress.getByName("192.168.1.88");2 // 獲取此 IP 地址的主機名3 String name = address.getHostName();4 // 返回 IP 地址字符串(以文本表現形式)。5 String ip = address.getHostAddress();6 System.out.26.06網絡編程三要素之端口
物理端口網卡口
邏輯端口
1:每個網絡程序都會至少有一個邏輯端口
2:用于標識進程的邏輯地址,不同進程的標識
3:有效端口:0~65535,其中0~1024系統使用或保留端口
26.07網絡編程三要素之協議協議:通訊的規則,常見協議:TCP,UDP
UDP:
1.將數據源和目的封裝成數據包中,不需要建立連接
2.每個數據報的大小在限制在64k
3.因無連接,是不可靠協議
4.不需要建立連接,速度快
TCP:
1.建立連接,形成傳輸數據的通道
2.在連接中進行大數據量傳輸
3.通過三次握手完成連接,是可靠協議
4.必須建立連接,效率會稍低
26.08Socket通信原理Socket套接字:網絡上具有唯一標識的IP地址和端口號組合在一起才能構成唯一能識別的標識符套接字
Socket原理機制:
1.通信的兩端都有Socket
2.網絡通信其實就是Socket間的通信
3.數據在兩個Socket間通過IO傳輸
26.09UDP協議發送數據DatagramSocket:此類表示用來發送和接收數據報包的套接字。數據報套接字是包投遞服務的發送或接收點。
DatagramPacket:此類表示數據報包。數據報包用來實現無連接包投遞服務。
發送端步驟:
1:建立udp的socket服務
2:將要發送的數據封裝成數據包
3:通過udp的socket服務,將數據包發送出
4:關閉資源
例:
1 public class Send 2 { 3 public static void main(String[] args) throws IOException 4 { 5 // 創建發送端Socket對象 6 DatagramSocket ds = new DatagramSocket(); 7 8 // 創建數據 9 byte[] bys = "hello,udp,我來了".getBytes();10 // 長度11 int length = bys.length;12 // IP地址對象13 InetAddress address = InetAddress.getByName("192.168.12.92");14 // 端口15 int port = 10086;16 17 //將數據打包,包含內容、長度、IP地址、端口號18 DatagramPacket dp = new DatagramPacket(bys, length, address, port);19 20 // 發送數據包21 ds.send(dp);22 23 // 釋放資源24 ds.close();25 }26 }26.10UDP協議接收數據
接收端步驟:
1:建立udp的socket服務.
2:通過receive方法接收數據
3:將收到的數據存儲到數據包對象中
4:通過數據包對象的功能來完成對接收到數據進行解析
5:可以對資源進行關閉
例:
1 public class Receive 2 { 3 public static void main(String[] args) throws IOException 4 { 5 // 創建接收端Socket對象 6 DatagramSocket ds = new DatagramSocket(10000); 7 8 // 創建一個數據包(接收容器) 9 byte[] bys = new byte[1024];10 int length = bys.length;11 DatagramPacket dp = new DatagramPacket(bys, length);12 13 // 調用Socket對象的接收方法接收數據14 ds.receive(dp); // 阻塞式15 16 // 解析數據包17 // 獲取對方的ip18 InetAddress address = dp.getAddress();19 String ip = address.getHostAddress();20 // 獲取數據緩沖區21 byte[] bys2 = dp.getData();22 // 獲取數據的實際長度23 int len = dp.getLength();24 String s = new String(bys2, 0, len);25 System.out.println("ip:"+ip);26 System.out.println("傳遞的數據:"+ s);27 // 釋放資源28 ds.close();29 }30 }26.11UDP協議發送和接收數據代碼優化
例:
1 public class Send 2 { 3 public static void main(String[] args) throws IOException 4 { 5 // 創建發送端的Socket對象 6 DatagramSocket ds = new DatagramSocket(); 7 8 // 創建數據并打包 9 byte[] bys = "helloworld".getBytes();10 DatagramPacket dp = new DatagramPacket(bys, bys.length,11 InetAddress.getByName("192.168.1.99"), 10001);12 13 // 發送數據14 ds.send(dp);15 16 // 釋放資源17 ds.close();18 }19 }20 21 --------------------------------------------------------------22 public class Receive 23 {24 public static void main(String[] args) throws IOException 25 {26 // 創建接收端的Socket對象27 DatagramSocket ds = new DatagramSocket(10001);28 29 // 創建一個包裹30 byte[] bys = new byte[1024];31 DatagramPacket dp = new DatagramPacket(bys, bys.length);32 33 // 接收數據34 ds.receive(dp);35 36 // 解析數據37 String ip = dp.getAddress().getHostAddress();38 String s = new String(dp.getData(), 0, dp.getLength());39 System.out.println("ip:" + ip);40 System.out.println("數據:" + s);41 42 // 釋放資源43 ds.close();44 }45 }26.12發送端的數據來自于鍵盤錄入案例
從鍵盤錄入數據進行發送,如果輸入的是886那么客戶端就結束輸入數據。
1 public class Send 2 { 3 public static void main(String[] args) throws IOException 4 { 5 // 創建發送端的Socket對象 6 DatagramSocket ds = new DatagramSocket(); 7 8 // 封裝鍵盤錄入數據 9 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));10 String line = null;11 while ((line = br.readLine()) != null) 12 {13 if ("886".equals(line)) 14 {15 break;16 }17 18 // 創建數據并打包19 byte[] bys = line.getBytes();20 DatagramPacket dp = new DatagramPacket(bys, bys.length,21 InetAddress.getByName("192.168.1.99"), 10001);22 //192.168.1.255為廣播地址23 24 // 發送數據25 ds.send(dp);26 }27 28 // 釋放資源29 ds.close();30 }31 }32 --------------------------------------------------------------33 public class Receive 34 {35 public static void main(String[] args) throws IOException 36 {37 // 創建接收端的Socket對象38 DatagramSocket ds = new DatagramSocket(10001);39 40 while (true) 41 {42 // 創建一個包裹43 byte[] bys = new byte[1024];44 DatagramPacket dp = new DatagramPacket(bys, bys.length);45 46 // 接收數據47 ds.receive(dp);48 49 // 解析數據50 String ip = dp.getAddress().getHostAddress();51 String s = new String(dp.getData(), 0, dp.getLength());52 System.out.println("from " + ip + " data is : " + s);53 }54 55 // 釋放資源56 // 接收端應該一直開著等待接收數據,是不需要關閉57 // ds.close();58 }59 }26.13多線程實現聊天室程序
1 public class Practice 2 { 3 public static void main(String[] args) throws IOException 4 { 5 DatagramSocket dsSend = new DatagramSocket(); 6 DatagramSocket dsReceive = new DatagramSocket(10001); 7 8 Send st = new Send(dsSend); 9 Receive rt = new Receive(dsReceive);10 11 Thread t1 = new Thread(st);12 Thread t2 = new Thread(rt);13 14 t1.start();15 t2.start();16 }17 }18 --------------------------------------------------------------19 發送端:20 public class Send implements Runnable21 {22 private DatagramSocket ds;23 24 public Send(DatagramSocket ds) 25 {26 this.ds = ds;27 }28 29 @Override30 public void run() 31 {32 try 33 {34 // 封裝鍵盤錄入數據35 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));36 String line = null;37 while ((line = br.readLine()) != null) 38 {39 if ("886".equals(line)) 40 {41 break;42 }43 44 // 創建數據并打包45 byte[] bys = line.getBytes();46 DatagramPacket dp = new DatagramPacket(bys, bys.length,InetAddress.getByName("192.168.1.255"), 10001);47 48 // 發送數據49 ds.send(dp);50 }51 52 // 釋放資源53 ds.close();54 } 55 catch (IOException e)56 {57 e.printStackTrace();58 }59 }60 }61 --------------------------------------------------------------62 接收端:63 public class Receive implements Runnable64 {65 private DatagramSocket ds;66 67 public Receive(DatagramSocket ds)68 {69 this.ds = ds;70 }71 72 @Override73 public void run() 74 {75 try 76 {77 while (true) 78 {79 // 創建一個包裹80 byte[] bys = new byte[1024];81 DatagramPacket dp = new DatagramPacket(bys, bys.length);82 83 // 接收數據84 ds.receive(dp);85 86 // 解析數據87 String ip = dp.getAddress().getHostAddress();88 String s = new String(dp.getData(), 0, dp.getLength());89 System.out.println("來自" + ip + "的數據: " + s);90 }91 } 92 catch (IOException e)93 {94 e.printStackTrace();95 }96 }97 }26.14TCP協議發送數據
TCP協議發送數據:
A:創建發送端的Socket對象,這一步如果成功,就說明連接已經建立成功了
B:獲取輸出流,寫數據
C:釋放資源
TCP協議一定要先開服務器。否則報錯:java.net.ConnectException:Connectionrefused:connect
publicSocket(Stringhost,intport)throwsUnknownHostException,IOException
創建一個流套接字并將其連接到指定主機上的指定端口號。
例:
1 public class Client 2 { 3 public static void main(String[] args) throws IOException 4 { 5 // 創建發送端的Socket對象 6 // Socket(InetAddress address, int port) 7 // Socket(String host, int port) 8 // Socket s = new Socket(InetAddress.getByName("192.168.1.88"), 10002); 9 Socket s = new Socket("192.168.1.88", 10002);10 11 // 獲取輸出流,寫數據12 // public OutputStream getOutputStream()13 OutputStream os = s.getOutputStream();14 os.write("hello,tcp".getBytes());15 16 // 釋放資源17 s.close();18 }19 }26.15TCP協議接收數據
TCP協議接收數據:
A:創建接收端的Socket對象
B:監聽客戶端連接。返回一個對應的Socket對象
C:獲取輸入流,讀取數據顯示在控制臺
D:釋放資源
例:
1 public class Server 2 { 3 public static void main(String[] args) throws IOException 4 { 5 // 創建接收端的Socket對象 6 // ServerSocket(int port) 7 ServerSocket ss = new ServerSocket(10002); 8 9 // 監聽客戶端連接。返回一個對應的Socket對象10 // public Socket accept()11 Socket s = ss.accept(); // 偵聽并接受到此套接字的連接。此方法在連接傳入之前一直阻塞。12 13 // 獲取輸入流,讀取數據顯示在控制臺14 InputStream is = s.getInputStream();15 16 byte[] bys = new byte[1024];17 int len = is.read(bys); // 阻塞式方法18 String str = new String(bys, 0, len);19 20 String ip = s.getInetAddress().getHostAddress();21 22 System.out.println(ip + "---" + str);23 24 // 釋放資源25 s.close();26 // ss.close(); //這個不應該關閉27 }28 }26.16服務器給客戶端一個反饋案例
1 //服務端 2 public class Server 3 { 4 public static void main(String[] args) throws IOException 5 { 6 // 創建服務器Socket對象 7 ServerSocket ss = new ServerSocket(10002); 8 9 // 監聽客戶端的連接10 Socket s = ss.accept(); // 阻塞11 12 // 獲取輸入流13 InputStream is = s.getInputStream();14 byte[] bys = new byte[1024];15 int len = is.read(bys); // 阻塞16 String server = new String(bys, 0, len);17 System.out.println("server:" + server);18 19 // 獲取輸出流20 OutputStream os = s.getOutputStream();21 os.write("數據已經收到".getBytes());22 23 // 釋放資源24 s.close();25 // ss.close();26 }27 }28 --------------------------------------------------------------29 //客戶端30 public class Client 31 {32 public static void main(String[] args) throws IOException 33 {34 // 創建客戶端Socket對象35 Socket s = new Socket("192.168.1.88", 10002);36 37 // 獲取輸出流38 OutputStream os = s.getOutputStream();39 os.write("hello".getBytes());40 41 // 獲取輸入流42 InputStream is = s.getInputStream();43 byte[] bys = new byte[1024];44 int len = is.read(bys);// 阻塞45 String client = new String(bys, 0, len);46 System.out.println("client:" + client);47 48 // 釋放資源49 s.close();50 }51 }26.17客戶端鍵盤錄入服務器控制臺輸出
1 //服務端 2 public class Server 3 { 4 public static void main(String[] args) throws IOException 5 { 6 // 創建服務器Socket對象 7 ServerSocket ss = new ServerSocket(10003); 8 9 // 監聽客戶端連接10 Socket s = ss.accept();11 12 // 包裝通道內容的流13 BufferedReader br = new BufferedReader(new InputStreamReader(14 s.getInputStream()));15 String line = null;16 while ((line = br.readLine()) != null) 17 {18 System.out.println(line);19 }20 21 // br.close();22 s.close();23 // ss.close();24 }25 }26 --------------------------------------------------------------27 //客戶端28 public class Client 29 {30 public static void main(String[] args) throws IOException 31 {32 // 創建客戶端Socket對象33 Socket s = new Socket("192.168.1.88", 10003);34 35 // 鍵盤錄入數據36 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));37 // 把通道內的流給包裝一下38 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(39 s.getOutputStream()));40 41 String line = null;42 while ((line = br.readLine()) != null) 43 {44 // 鍵盤錄入數據要自定義結束標記45 if ("886".equals(line)) 46 {47 break;48 }49 bw.write(line);50 bw.newLine();51 bw.flush();52 }53 54 // 釋放資源55 // bw.close();56 // br.close();57 s.close();58 }59 }26.18TCP上傳文本文件并給出反饋
1 //服務端 2 public class Server 3 { 4 public static void main(String[] args) throws IOException 5 { 6 // 創建服務器端的Socket對象 7 ServerSocket ss = new ServerSocket(10003); 8 9 // 監聽客戶端連接10 Socket s = ss.accept();// 阻塞11 12 // 封裝通道內的流13 BufferedReader br = new BufferedReader(new InputStreamReader(14 s.getInputStream()));15 // 封裝文本文件16 BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java"));17 18 String line = null;19 while ((line = br.readLine()) != null) 20 { 21 // 阻塞22 // if("over".equals(line)){23 // break;24 // }25 bw.write(line);26 bw.newLine();27 bw.flush();28 }29 30 // 給出反饋31 BufferedWriter bwServer = new BufferedWriter(new OutputStreamWriter(32 s.getOutputStream()));33 bwServer.write("文件上傳成功");34 bwServer.newLine();35 bwServer.flush();36 37 // 釋放資源38 bw.close();39 s.close();40 }41 }42 --------------------------------------------------------------43 //客戶端44 public class Client 45 {46 public static void main(String[] args) throws IOException 47 {48 // 創建客戶端Socket對象49 Socket s = new Socket("192.168.1.99", 10003);50 51 // 封裝文本文件52 BufferedReader br = new BufferedReader(new FileReader(53 "InetAddressDemo.java"));54 // 封裝通道內流55 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(56 s.getOutputStream()));57 58 String line = null;59 while ((line = br.readLine()) != null) 60 { // 阻塞61 bw.write(line);62 bw.newLine();63 bw.flush();64 }65 66 //自定義一個結束標記67 // bw.write("over");68 // bw.newLine();69 // bw.flush();70 71 //Socket提供了一個終止,它會通知服務器沒有數據過來了72 s.shutdownOutput();73 74 // 接收反饋75 BufferedReader brClient = new BufferedReader(new InputStreamReader(76 s.getInputStream()));77 String client = brClient.readLine(); // 阻塞78 System.out.println(client);79 80 // 釋放資源81 br.close();82 s.close();83 }84 }26.19TCP協議上傳圖片并給出反饋
1 //服務端 2 public class Server 3 { 4 public static void main(String[] args) throws IOException 5 { 6 // 創建服務器Socket對象 7 ServerSocket ss = new ServerSocket(10004); 8 9 // 監聽客戶端連接10 Socket s = ss.accept();11 12 // 封裝通道內流13 BufferedInputStream bis = new BufferedInputStream(s.getInputStream());14 // 封裝圖片文件15 BufferedOutputStream bos = new BufferedOutputStream(16 new FileOutputStream("D://bj.jpg"));17 18 byte[] bys = new byte[1024];19 int len = 0;20 while ((len = bis.read(bys)) != -1) 21 {22 bos.write(bys, 0, len);23 bos.flush();24 }25 26 // 給一個反饋27 OutputStream os = s.getOutputStream();28 os.write("圖片上傳成功".getBytes());29 30 bos.close();31 s.close();32 }33 }34 --------------------------------------------------------------35 //客戶端36 public class Client 37 {38 public static void main(String[] args) throws IOException 39 {40 // 創建客戶端Socket對象41 Socket s = new Socket("192.168.1.88", 10004);42 43 // 封裝圖片文件44 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(45 "D://001.jpg"));46 // 封裝通道內的流47 BufferedOutputStream bos = new BufferedOutputStream(s.getOutputStream());48 49 byte[] bys = new byte[1024];50 int len = 0;51 while ((len = bis.read(bys)) != -1) 52 {53 bos.write(bys, 0, len);54 bos.flush();55 }56 57 s.shutdownOutput();58 59 // 讀取反饋60 InputStream is = s.getInputStream();61 byte[] bys2 = new byte[1024];62 int len2 = is.read(bys2);63 String client = new String(bys2, 0, len2);64 System.out.println(client);65 66 // 釋放資源67 bis.close();68 s.close();69 }70 }26.20多線程改進多個客戶端上傳文件案例
1 //用戶線程 2 public class UserThread implements Runnable 3 { 4 private Socket s; 5 6 public UserThread(Socket s) 7 { 8 this.s = s; 9 } 10 11 @Override 12 public void run() 13 { 14 try 15 { 16 // 封裝通道內的流 17 BufferedReader br = new BufferedReader(new InputStreamReader( 18 s.getInputStream())); 19 // 封裝文本文件 20 // BufferedWriter bw = new BufferedWriter(new 21 // FileWriter("Copy.java")); 22 23 // 為了防止名稱沖突 24 String newName = System.currentTimeMillis() + ".java"; 25 BufferedWriter bw = new BufferedWriter(new FileWriter(newName)); 26 27 String line = null; 28 while ((line = br.readLine()) != null) 29 { // 阻塞 30 bw.write(line); 31 bw.newLine(); 32 bw.flush(); 33 } 34 35 // 給出反饋 36 BufferedWriter bwServer = new BufferedWriter( 37 new OutputStreamWriter(s.getOutputStream())); 38 bwServer.write("文件上傳成功"); 39 bwServer.newLine(); 40 bwServer.flush(); 41 42 // 釋放資源 43 bw.close(); 44 s.close(); 45 } 46 catch (IOException e) 47 { 48 e.printStackTrace(); 49 } 50 } 51 } 52 -------------------------------------------------------------- 53 //服務端 54 public class Server 55 { 56 public static void main(String[] args) throws IOException 57 { 58 // 創建服務器Socket對象 59 ServerSocket ss = new ServerSocket(10005); 60 61 while (true) 62 { 63 Socket s = ss.accept(); 64 new Thread(new UserThread(s)).start(); 65 } 66 } 67 } 68 -------------------------------------------------------------- 69 //客戶端 70 public class Client 71 { 72 public static void main(String[] args) throws IOException 73 { 74 // 創建客戶端Socket對象 75 Socket s = new Socket("192.168.1.99", 10005); 76 77 // 封裝文本文件 78 // BufferedReader br = new BufferedReader(new FileReader( 79 // "InetAddressDemo.java")); 80 BufferedReader br = new BufferedReader(new FileReader( 81 "ReceiveDemo.java")); 82 // 封裝通道內流 83 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter( 84 s.getOutputStream())); 85 86 String line = null; 87 while ((line = br.readLine()) != null) 88 { // 阻塞 89 bw.write(line); 90 bw.newLine(); 91 bw.flush(); 92 } 93 94 // Socket提供了一個終止,它會通知服務器你別等了,我沒有數據過來了 95 s.shutdownOutput(); 96 97 // 接收反饋 98 BufferedReader brClient = new BufferedReader(new InputStreamReader( 99 s.getInputStream()));100 String client = brClient.readLine(); // 阻塞101 System.out.println(client);102 103 // 釋放資源104 br.close();105 s.close();106 }107 }
新聞熱點
疑難解答