Java網(wǎng)絡編程三要素及通信程序詳解
1 網(wǎng)絡編程入門
1.1 網(wǎng)絡編程概述
- 計算機網(wǎng)絡:是指將地理位置不同的具有獨立功能的多臺計算機及 其外部設備,通過通信線路連接起來,在網(wǎng)絡操作系統(tǒng),網(wǎng)絡管理軟件及網(wǎng)絡通信協(xié)議的管理和協(xié)調(diào)下,實現(xiàn)資源共享和信息傳遞的計算機系統(tǒng)
- 網(wǎng)絡編程:在網(wǎng)絡通信協(xié)議下,實現(xiàn)網(wǎng)絡互連的不同計算機上運行的程序間可以進行數(shù)據(jù)交換
1.2 網(wǎng)絡編程三要素
- IP地址
要想讓網(wǎng)絡中的計算機能夠 互相通信,必須為每臺計算機指定一個標識號, 通過這個標識號來指定要接收數(shù)據(jù)的計算機和識別發(fā)送的計算機,而IP地址就是這個標識號。也就是設備的標識
- 端口
網(wǎng)絡的通信, 本質(zhì)上是兩個應用程序的通信。每臺計算機都有很多的應用程序,那么在網(wǎng)絡通信時,如何區(qū)分這些應用程序呢?如果說IP地址可以唯一標識網(wǎng)絡中的設備 ,那么端口號就可以唯一標識設備中的應用程序了。也就是應用程序的標識
- 協(xié)議
通過計算機網(wǎng)絡可以使多 臺計算機實現(xiàn)連接,位于同一個網(wǎng)絡中的計算機在進行連接和通信時需要遵守-定的規(guī)則,這就好比在道路中行駛的汽車-定要遵守交通規(guī)則一 樣。在計算機網(wǎng)絡中,這些連接和通信的規(guī)則被稱為網(wǎng)絡通信協(xié)議,它對數(shù)據(jù)的傳輸格式、傳輸速率、傳輸步驟等做了統(tǒng)一規(guī)定, 通信雙方必須同時遵守才能完成數(shù)據(jù)交換。常見的協(xié)議有UDP協(xié)議和TCP協(xié)議
1.3 IP地址
- IP地址:是網(wǎng)絡中設備的唯一標識
- IP地址分為兩大類
- IPv4:是給每個連接在網(wǎng)絡上的主機分配一個32bit地址。 按照TCP/IP規(guī)定,IP地址用二進制來表示, 每個P地址長32bit,也就是4個字節(jié)。例如一個采用I進制形式的IP地址是11000000 101010000000001 01000010" ,這么長的地址,處理起來也太費勁了。為了方便使用,IP地址經(jīng)常被寫成+進制的形式,中間使用符號"分隔不同的字節(jié)。于是,. 上面的IP地址可以表示為"192168. 1.66" . IP地址的這種表示法叫做"盼+進制表示法”, 這顯然比1和0容易記憶得多
- IPv6:由于互聯(lián)網(wǎng)的蓬勃發(fā)展, IP地址的需求量愈來愈大,但是網(wǎng)絡地址資源有限,使得IP的分配越發(fā)緊張。為了擴大地址空間,通過IPv6重新定義地址空間,采用128位地址長度,每16個字節(jié)-組,分成8組十六進制數(shù),這樣就解決了網(wǎng)絡地址資源數(shù)量不夠的問題
- 常用命令:
- ipconfig: 查看本機P地址ping
- IP地址:檢查網(wǎng)絡是否連通
- 特殊IP地址127.0.0.1:是回送地址,可以代表本機地址,一般用來測試使用
1.4 InetAddress的使用
- 為了方便我們對IP地址的獲取和操作, Java提供了一個類InetAddress供我們使用
- InetAddress:此類表示Internet協(xié)議(IP) 地址
- 導包:
import java.net.InetAddress
方法名 | 說明 |
static InetAddress getByName(String host) | 確定主機名稱的IP地址。 主機名稱可以是機器名稱,也可以是IP地址 |
String getHostName() | 獲取此IP地址的主機名 |
String getHostAddress() | 返回文本顯示中的IP地址字符串 |
范例
package test; import java.net.InetAddress; import java.net.UnknownHostException; public class Demo { public static void main(String[] args) throws UnknownHostException { //1,static InetAddress getByName(String host) 確定主機名稱的IP地址。 主機名稱可以是機器名稱,也可以是IP地址 // InetAddress address = InetAddress.getByName("YM"); InetAddress address = InetAddress.getByName("192.168.128.1"); //推薦使用 System.out.println(address); //YM/192.168.128.1 //2,String getHostName() 獲取此IP地址的主機名 String hostName = address.getHostName(); System.out.println(hostName); //YM //3,String getHostAddress() 返回文本顯示中的IP地址字符串 String hostAddress = address.getHostAddress(); System.out.println(hostAddress); //192.168.128.1 } }
1.5 端口
- 端口:設備上應用程序的唯一標識
- 端口號:用兩個字節(jié)表示的整數(shù),它的取值范圍是0~65535。其中, 0~ 1023之間的端口號用于些知名的網(wǎng)絡服務和應用,普通的應用程序需要使用1024以上的端口號。如果端口號被另外一個服務或應用所占用,會導致當前程序啟動失敗
1.6 協(xié)議
- 協(xié)議:計算機網(wǎng)絡中,連接和通信的規(guī)則被稱為網(wǎng)絡通信協(xié)議
UDP協(xié)議
- 用戶數(shù)據(jù)報協(xié)議(User Datagram Protocol)
- UDP是無連接通信協(xié)議, 即在數(shù)據(jù)傳輸時,數(shù)據(jù)的發(fā)送端和接收端不建立邏輯連接。簡單來說,當一臺計算機向另外-臺計算機發(fā)送數(shù)據(jù)時,發(fā)送端不會確認接收端是否存在,就會發(fā)出數(shù)據(jù),同樣接收端在收到數(shù)據(jù)時,也不會向發(fā)送端反饋是否收到數(shù)據(jù)。
- 由于使用UDP協(xié)議消耗資源小,通信效率高,所以通常都會用于音頻視頻和普通數(shù)據(jù)的傳輸
- 例如視頻會議通常采用UDP協(xié)議, 因為這種情況即使偶爾丟失一兩個數(shù)據(jù)包,也不會對接收結(jié)果產(chǎn)生大影響。但是在使用UDP協(xié)議傳送數(shù)據(jù)時,由于UDP的面向無連接性,不能保證數(shù)據(jù)的完整性,因此在傳輸重要數(shù)據(jù)時不建議使用UDP協(xié)議
TCP協(xié)議
- 傳輸控制協(xié)議 (Transmission Control Protocol)
- TCP協(xié)議是面向連接的通信協(xié)議,即傳輸數(shù)據(jù)之前,在發(fā)送端和接收端建立邏輯連接,然后再傳輸數(shù)據(jù),它提供了兩臺計算機之間可靠無差錯的數(shù)據(jù)傳輸。在TCP連接中必須要明確客戶端與服務器端,由客戶端向服務端發(fā)出連接請求,每次連接的創(chuàng)建都需要經(jīng)過“三次握手"
- 三次握手:TCP協(xié)議中,在發(fā)送數(shù)據(jù)的準備階段,客戶端與服務器之間的三次交互,以保證連接的可靠
- 第一次握手,客戶端向服務器端發(fā)出連接請求,等待服務器確認
- 第二次握手,服務器端向客戶端回送一個響應, 通知客戶端收到了連接請求
- 第三次握手,客戶端再次向服務器端發(fā)送確認信息,確認連接
- 完成三次握手,連接建立后,客戶端和服務器就可以開始進行數(shù)據(jù)傳輸了。由于這種面向連接的特性,TCP協(xié)議可以保證傳輸數(shù)據(jù)的安全,所以應用十分廣泛。例如上傳文件、下載文件、 瀏覽網(wǎng)頁等
2 UDP通信程序
2.1 UDP通信原理
UDP協(xié)議是一種不可靠的網(wǎng)絡協(xié)議,它在通信的兩端各建立一個Socket對象, 但是這兩個Socket只是發(fā)送,接收數(shù)據(jù)的對象因此對于基于UDP協(xié)議的通信雙方而言,沒有所謂的客戶端和服務器的概念
Java提供了DatagramSocket類作為基于UDP協(xié)議的Socket
2.2 UDP發(fā)送數(shù)據(jù)
- 發(fā)送數(shù)據(jù)的步驟
1、創(chuàng)建發(fā)送端的Socket對象(DatagramSocket):DatagramSocket()
2、創(chuàng)建數(shù)據(jù), 并把數(shù)據(jù)打包:DatogramPacket (byte[] buf, int Length, InetAddress address, int port)
3、調(diào)用DatagramSocket對象的方法發(fā)送數(shù)據(jù):void send(DatagramPacket p)
4、關閉發(fā)送端:void close()
范例
package test; import java.io.IOException; import java.net.*; public class Demo { public static void main(String[] args) throws IOException { //1、創(chuàng)建發(fā)送端的Socket對象(DatagramSocket) DatagramSocket ds = new DatagramSocket(); //2、創(chuàng)建數(shù)據(jù), 并把數(shù)據(jù)打包 //DatogramPacket (byte[] buf, int Length, InetAddress address, int port) // 構造一個數(shù)據(jù)包,發(fā)送長度為length的數(shù)據(jù) 包到指定主機上的指定端口號。 byte[] bys = "hello,java".getBytes(); DatagramPacket dp = new DatagramPacket(bys,bys.length, InetAddress.getByName("127.0.0.1"),10086); //3、調(diào)用DatagramSocket對象的方法發(fā)送數(shù)據(jù) //void send(DatagramPacket p) ds.send(dp); //4、關閉發(fā)送端 ds.close(); } }
2.3 UDP接收數(shù)據(jù)
- 接收數(shù)據(jù)的步驟
1、創(chuàng)建接收端的Socket對象(DatagramSocket):DatagramSocket(int port)
2、創(chuàng)建一個數(shù)據(jù)包, 用于接收數(shù)據(jù):DatagramPacket(byte[] buf, int length)
3、調(diào)用DatagramSocket對象的方法接收數(shù)據(jù):void receive(DatagramPacketp)
4、解析數(shù)據(jù)包, 并把數(shù)據(jù)在控制臺顯示:byte[] getData()
、int getLength()
5、關閉接收端:void close()
package test; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; public class ReceiveDemo { public static void main(String[] args) throws IOException { //1、創(chuàng)建接收端的Socket對象(DatagramSocket):DatagramSocket(int port) DatagramSocket ds = new DatagramSocket(10086); //2、創(chuàng)建一個數(shù)據(jù)包, 用于接收數(shù)據(jù) //DatagramPacket(byte[] buf, int length):構造一個DatagramPacket用來接收長度為length的數(shù)據(jù)包 byte[] bys = new byte[1024]; DatagramPacket dp = new DatagramPacket(bys, bys.length); //3、調(diào)用DatagramSocket對象的方法接收數(shù)據(jù):void receive(DatagramPacketp) ds.receive(dp); //4、解析數(shù)據(jù)包, 并把數(shù)據(jù)在控制臺顯示: // byte[] getData():返回數(shù)據(jù)緩沖區(qū) int getLength() byte[] datas = dp.getData(); //int getlength():返回要發(fā)送的數(shù)據(jù)長度或接收的數(shù)據(jù)長度 int len = dp.getlength(); String dataString = new String(datas,0,len); System.out.println("數(shù)據(jù)是:"+dataString); //5、關閉接收端:void close() ds.close(); } }
2.4 范例
發(fā)送端
package test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class SendDemo { public static void main(String[] args) throws IOException { //1、創(chuàng)建發(fā)送端的Socket對象(DatagramSocket):DatagramSocket() DatagramSocket ds = new DatagramSocket(); //鍵盤錄入數(shù)據(jù) BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line; while ((line = br.readLine()) != null) { if ("886".equals(line)) { break; } else { //創(chuàng)建數(shù)據(jù)并把數(shù)據(jù)打包 byte[] bys = line.getBytes(); DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("127.0.0.1"), 1001); //3、調(diào)用DatagramSocket對象的方法發(fā)送數(shù)據(jù):void send(DatagramPacket p) ds.send(dp); } } ds.close(); } }
接收端
package test; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; public class ReceiveDemo { public static void main(String[] args) throws IOException { //創(chuàng)建接收端的Socket對象(DatagramSocket):DatagramSocket(int port) DatagramSocket ds = new DatagramSocket(1001); while(true) { //創(chuàng)建一個數(shù)據(jù)包接收數(shù)據(jù) byte[] bys = new byte[1024]; DatagramPacket dp = new DatagramPacket(bys, bys.length); //調(diào)用DatagramSocket對象的方法接收數(shù)據(jù):void receive(DatagramPacketp) ds.receive(dp); //解析數(shù)據(jù)包, 并把數(shù)據(jù)在控制臺顯示:byte[] getData()、int getLength() System.out.println("數(shù)據(jù)是:" + new String(dp.getData(), 0, dp.getLength())); } //關閉 // ds.close(); } }
3 TCP通信程序
3.1 TCP通信原理
TCP通信協(xié)議是一種可靠的網(wǎng)絡協(xié)議, 它在通信的兩端名建立一個Socke對象, 從而在通信的兩端形成網(wǎng)絡虛擬鏈路一旦建立了 虛擬的網(wǎng)絡鏈路,兩端的程序就可以通過虛擬鏈路進行通信
Java對基于TCP協(xié)議的的網(wǎng)絡提供了良好的封裝,使用Socket對象來代表兩端的通信端口,并通過Socket產(chǎn)生l0流來進行網(wǎng)絡通信Java為客戶端提供了Socket類,為服務器端提供了ServerSocket類
3.2 TCP發(fā)送數(shù)據(jù)
- 發(fā)送數(shù)據(jù)的步驟
1、創(chuàng)建客戶端的Socket對象(Socket):Socket(String host, int port)
2、獲取輸出流,寫數(shù)據(jù):OutputStream對象的getOutputStream()方法
???????3、釋放資源:void close()
范例:
package test; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; public class ClientDemo { public static void main(String[] args) throws IOException { //1、創(chuàng)建客戶端的Socket對象(Socket):Socket(String host, int port) Socket s = new Socket("127.0.0.1",1000); //2、獲取輸出流,寫數(shù)據(jù):OutputStream對象的getOutputStream()方法 OutputStream os = s.getOutputStream(); os.write("hello,java".getBytes()); //3、釋放資源:void close() s.close(); } }
3.3 TCP接收數(shù)據(jù)
- 接收數(shù)據(jù)的步驟
1、創(chuàng)建服務 器端的Socket對象(ServerSocket):ServerSocket(int port)
???????2、監(jiān)聽客戶端連接, 返回個Socket對象:Socket accept()
???????3、獲取輸入流, 讀數(shù)據(jù),并把數(shù)據(jù)顯示在控制臺:InputStream對象的getInputStream()方法
???????4、釋放資源:void close()
范例
package test; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class SeverDemo { public static void main(String[] args) throws IOException { //1、創(chuàng)建服務 器端的Socket對象(ServerSocket):ServerSocket(int port) ServerSocket ss = new ServerSocket(1000); //2、監(jiān)聽客戶端連接, 返回個Socket對象:Socket accept() Socket s = ss.accept(); //3、獲取輸入流, 讀數(shù)據(jù),并把數(shù)據(jù)顯示在控制臺:InputStream對象的getInputStream()方法 InputStream is = s.getInputStream(); byte[] bys = new byte[1014]; int len = is.read(bys); String data = new String(bys,0,len); System.out.println(data); //4、釋放資源:void close() s.close(); ss.close(); } }
3.4 案例
3.4.1 練習一:服務器給出反饋
客戶端
package test; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; public class ClientDemo { public static void main(String[] args) throws IOException { //1、創(chuàng)建客戶端的Socket對象(Socket):Socket(String host, int port) Socket s = new Socket("127.0.0.1",1000); //2、獲取輸出流,寫數(shù)據(jù):OutputStream對象的getOutputStream()方法 OutputStream os = s.getOutputStream(); os.write("hello,java".getBytes()); //接收服務器反饋 InputStream is = s.getInputStream(); byte[] bys = new byte[1024]; int len = is.read(bys); String data = new String(bys,0,len); System.out.println("客戶端:"+data); //3、釋放資源:void close() s.close(); //客戶端:數(shù)據(jù)已經(jīng)收到 } }
服務器
package test; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class SeverDemo { public static void main(String[] args) throws IOException { //1、創(chuàng)建服務 器端的Socket對象(ServerSocket):ServerSocket(int port) ServerSocket ss = new ServerSocket(1000); //2、監(jiān)聽客戶端連接, 返回個Socket對象:Socket accept() Socket s = ss.accept(); //3、獲取輸入流, 讀數(shù)據(jù),并把數(shù)據(jù)顯示在控制臺:InputStream對象的getInputStream()方法 InputStream is = s.getInputStream(); byte[] bys = new byte[1014]; int len = is.read(bys); String data = new String(bys,0,len); System.out.println("服務器:"+data); //給出反饋 OutputStream os = s.getOutputStream(); os.write("數(shù)據(jù)已經(jīng)收到".getBytes()); //4、釋放資源:void close() s.close(); ss.close(); //服務器:hello,java } }
3.4.2 練習二:客戶端數(shù)據(jù)來源于鍵盤錄入
客戶端
package test; import java.io.*; import java.net.Socket; public class ClientDemo { public static void main(String[] args) throws IOException { //創(chuàng)建客戶端的Socket對象(Socket):Socket(String host, int port) Socket s = new Socket("127.0.0.1",1000); //數(shù)據(jù)來源于鍵盤錄入,直到886停止 System.out.println("請輸入數(shù)據(jù)"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //封裝輸出流對象 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); String line; while((line= br.readLine())!=null) { if("886".equals(line)) { break; } //獲取輸出流對象 bw.write(line); bw.newLine(); bw.flush(); } //釋放資源 s.close(); // hello // 886 } }
服務器
package test; import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class SeverDemo { public static void main(String[] args) throws IOException { //1、創(chuàng)建服務 器端的Socket對象(ServerSocket):ServerSocket(int port) ServerSocket ss = new ServerSocket(1000); //2、監(jiān)聽客戶端連接, 返回個Socket對象:Socket accept() Socket s = ss.accept(); //3、獲取輸入流, 讀數(shù)據(jù),并把數(shù)據(jù)顯示在控制臺:InputStream對象的getInputStream()方法 // InputStream is = s.getInputStream(); // InputStreamReader isr = new InputStreamReader(is); // BufferedReader br = new BufferedReader(isr); BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); String line; while((line=br.readLine())!=null) { System.out.println(line); } //4、釋放資源:void close() s.close(); //hello } }
3.4.3 練習三:服務器數(shù)據(jù)寫入文本文件
服務器
package test; import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class SeverDemo { public static void main(String[] args) throws IOException { //1、創(chuàng)建服務 器端的Socket對象(ServerSocket):ServerSocket(int port) ServerSocket ss = new ServerSocket(1000); //2、監(jiān)聽客戶端連接, 返回個Socket對象:Socket accept() Socket s = ss.accept(); //3、獲取輸入流, 讀數(shù)據(jù),并把數(shù)據(jù)顯示在控制臺:InputStream對象的getInputStream()方法 BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); //把數(shù)據(jù)寫入文本文件 BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\test\\java.txt")); String line; while((line=br.readLine())!=null) { bw.write(line); bw.newLine(); bw.flush(); } //4、釋放資源:void close() bw.close(); ss.close(); //文件中數(shù)據(jù):hello } }
3.4.4 練習四:客戶端數(shù)據(jù)來源于文本文件
客戶端
package test; import java.io.*; import java.net.Socket; public class ClientDemo { public static void main(String[] args) throws IOException { //創(chuàng)建客戶端的Socket對象(Socket):Socket(String host, int port) Socket s = new Socket("127.0.0.1",1000); //封裝文本文件數(shù)據(jù) BufferedReader br =new BufferedReader(new FileReader("E:\\test\\fos.txt")); //封裝輸出流對象 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); String line; while((line= br.readLine())!=null) { //獲取輸出流對象 bw.write(line); bw.newLine(); bw.flush(); } //釋放資源 br.close(); s.close(); } }
3.4.5 練習五:上傳文件服務器給出反饋
客戶端
package test; import java.io.*; import java.net.Socket; public class ClientDemo { public static void main(String[] args) throws IOException { //創(chuàng)建客戶端的Socket對象(Socket):Socket(String host, int port) Socket s = new Socket("127.0.0.1",1000); //封裝文本文件數(shù)據(jù) BufferedReader br =new BufferedReader(new FileReader("E:\\test\\fos.txt")); //封裝輸出流對象 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); String line; while((line= br.readLine())!=null) { //獲取輸出流對象 bw.write(line); bw.newLine(); bw.flush(); } // //自定義結(jié)束標記 // bw.write("886"); // bw.newLine(); // bw.flush(); s.shutdownOutput();//Socket類中方法:表示輸出結(jié)束 //接收反饋 BufferedReader brClient = new BufferedReader(new InputStreamReader(s.getInputStream())); String data = brClient.readLine(); //等待讀取數(shù)據(jù) System.out.println("服務器的反饋:"+data); //服務器的反饋:文件上傳成功 //釋放資源 br.close(); s.close(); } }
服務端
package test; import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class SeverDemo { public static void main(String[] args) throws IOException { //1、創(chuàng)建服務 器端的Socket對象(ServerSocket):ServerSocket(int port) ServerSocket ss = new ServerSocket(1000); //2、監(jiān)聽客戶端連接, 返回個Socket對象:Socket accept() Socket s = ss.accept(); //3、獲取輸入流, 讀數(shù)據(jù),并把數(shù)據(jù)顯示在控制臺:InputStream對象的getInputStream()方法 BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); //把數(shù)據(jù)寫入文本文件 BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\test\\java.txt")); String line; while((line=br.readLine())!=null) { //等待讀取數(shù)據(jù) // if("886".equals(line)) { // break; // } bw.write(line); bw.newLine(); bw.flush(); } //給出反饋 BufferedWriter bwServer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); bwServer.write("文件上傳成功"); bwServer.newLine(); bwServer.flush(); //4、釋放資源:void close() bw.close(); ss.close(); } }
3.4.6 練習六:多線程實現(xiàn)文件上傳
服務端
package test; import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class SeverDemo { public static void main(String[] args) throws IOException { //創(chuàng)建服務 器端的Socket對象(ServerSocket):ServerSocket(int port) ServerSocket ss = new ServerSocket(1000); while(true) { //監(jiān)聽客戶端連接, 返回個Socket對象:Socket accept() Socket s = ss.accept(); //為每一個客戶端開啟一個線程 new Thread(new ServerThread(s)).start(); } } }
服務端多線程
package test; import java.io.*; import java.net.Socket; public class ServerThread implements Runnable { private Socket s; public ServerThread(Socket s) { this.s = s; } @Override public void run() { try { //接收數(shù)據(jù)寫入文本文件 BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); // BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\test\\java.txt")); //解決名稱沖突問題,上傳到不同文件中 int count = 0; File file = new File("E:\\test\\["+count+"]java.txt"); while(file.exists()) { count++; file = new File("E:\\test\\["+count+"]java.txt"); } BufferedWriter bw = new BufferedWriter(new FileWriter(file)); String line; while ((line=br.readLine()) != null) { bw.write(line); bw.newLine(); bw.flush(); } //給出反饋 BufferedWriter bwSever =new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); bwSever.write("文件上傳成功"); bwSever.newLine(); bwSever.flush(); //釋放資源 s.close(); }catch (IOException e) { e.printStackTrace(); } } }
到此這篇關于Java網(wǎng)絡編程三要素及通信程序詳解的文章就介紹到這了,更多相關Java網(wǎng)絡編程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java中的自動拆裝箱、基本類型的轉(zhuǎn)換、包裝類的緩存詳解
文章詳細介紹了Java中數(shù)據(jù)類型的拆裝箱、自動拆箱和裝箱,以及包裝類的緩存機制,包括基本數(shù)據(jù)類型的容量大小、轉(zhuǎn)換規(guī)則和自動類型轉(zhuǎn)換等2024-12-12Java實現(xiàn)的文件上傳下載工具類完整實例【上傳文件自動命名】
這篇文章主要介紹了Java實現(xiàn)的文件上傳下載工具類,結(jié)合完整實例形式分析了java針對文件上傳下載操作的相關實現(xiàn)技巧,并且針對上傳文件提供了自動命名功能以避免文件命名重復,需要的朋友可以參考下2017-11-11Spring boot中filter類不能注入@Autowired變量問題
這篇文章主要介紹了Spring boot中filter類不能注入@Autowired變量問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09SpringCLoud搭建Zuul網(wǎng)關集群過程解析
這篇文章主要介紹了SpringCLoud搭建Zuul網(wǎng)關集群過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-03-03詳解java中Reference的實現(xiàn)與相應的執(zhí)行過程
不知道大家知不知道特殊的reference對象都是被jvm專門處理的,所以這篇文章就相應的工作流程和referencequeue之間的協(xié)作進行梳理.有需要的朋友們可以參考借鑒。2016-09-09