java练气期(3)----java高级(网络编程)
生活随笔
收集整理的這篇文章主要介紹了
java练气期(3)----java高级(网络编程)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
什么是java的網(wǎng)絡(luò)編程
Socket 編程套接字使用TCP提供了兩臺計算機之間的通信機制。 客戶端程序創(chuàng)建一個套接字,并嘗試連接服務(wù)器的套接字。
當連接建立時,服務(wù)器會創(chuàng)建一個 Socket 對象。客戶端和服務(wù)器現(xiàn)在可以通過對 Socket 對象的寫入和讀取來進行通信。
TCP通信:面向連接的通信,客戶端和服務(wù)器端必須經(jīng)過3次握手,建立邏輯連接,才能通信(安全)
通信步驟:
- 服務(wù)器端先啟動
- 服務(wù)器端不會主動請求客戶端
- 必須使用客戶端請求服務(wù)器端
- 客戶端和服務(wù)器端就會建立一個邏輯連接
- 而這個連接中包含一個對象,這個對象就是IO對象
- 客戶端和服務(wù)器端就可以使用IO對象進行通信
服務(wù)器端必須明確兩件事情:
1.多個客戶端同時和服務(wù)器進行交互,服務(wù)器必須明確和那個客戶端進行交互
- 在服務(wù)器端有一個方法,叫accept客戶端獲取到請求的客戶端對象
2.多個客戶端同時和服務(wù)器進行交互,就需要使用多個IO流對象
- 服務(wù)器是沒有IO流的,服務(wù)器可以獲取到請求的客戶端對象Socket
- 使用每個客戶端Socket中提供的IO流和客戶端進行交互
- 服務(wù)器使用客戶端的字節(jié)輸入流讀取客戶端發(fā)送的數(shù)據(jù)
- 服務(wù)器使用客戶端的字節(jié)輸出流給客戶端回寫數(shù)據(jù)
?
流程圖
?
代碼示例
服務(wù)器端
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.Random;/*文件上傳案例服務(wù)器端:讀取客戶端上傳的文件,保存到服務(wù)器的硬盤,給客戶端回寫"上傳成功"明確:數(shù)據(jù)源:客戶端上傳的文件目的地:服務(wù)器的硬盤 d:\\upload\\1.jpg實現(xiàn)步驟:1.創(chuàng)建一個服務(wù)器ServerSocket對象,和系統(tǒng)要指定的端口號2.使用ServerSocket對象中的方法accept,獲取到請求的客戶端Socket對象3.使用Socket對象中的方法getInputStream,獲取到網(wǎng)絡(luò)字節(jié)輸入流InputStream對象4.判斷d:\\upload文件夾是否存在,不存在則創(chuàng)建5.創(chuàng)建一個本地字節(jié)輸出流FileOutputStream對象,構(gòu)造方法中綁定要輸出的目的地6.使用網(wǎng)絡(luò)字節(jié)輸入流InputStream對象中的方法read,讀取客戶端上傳的文件7.使用本地字節(jié)輸出流FileOutputStream對象中的方法write,把讀取到的文件保存到服務(wù)器的硬盤上8.使用Socket對象中的方法getOutputStream,獲取到網(wǎng)絡(luò)字節(jié)輸出流OutputStream對象9.使用網(wǎng)絡(luò)字節(jié)輸出流OutputStream對象中的方法write,給客戶端回寫"上傳成功"10.釋放資源(FileOutputStream,Socket,ServerSocket)*/ public class TCPServer {public static void main(String[] args) throws IOException {//1.創(chuàng)建一個服務(wù)器ServerSocket對象,和系統(tǒng)要指定的端口號ServerSocket server = new ServerSocket(8888);//2.使用ServerSocket對象中的方法accept,獲取到請求的客戶端Socket對象/*讓服務(wù)器一直處于監(jiān)聽狀態(tài)(死循環(huán)accept方法)有一個客戶端上傳文件,就保存一個文件*/while(true){Socket socket = server.accept();/*使用多線程技術(shù),提高程序的效率有一個客戶端上傳文件,就開啟一個線程,完成文件的上傳*/new Thread(new Runnable() {//完成文件的上傳@Overridepublic void run() {try {//3.使用Socket對象中的方法getInputStream,獲取到網(wǎng)絡(luò)字節(jié)輸入流InputStream對象InputStream is = socket.getInputStream();//4.判斷d:\\upload文件夾是否存在,不存在則創(chuàng)建File file = new File("d:\\upload");if(!file.exists()){file.mkdirs();}/*自定義一個文件的命名規(guī)則:防止同名的文件被覆蓋規(guī)則:域名+毫秒值+隨機數(shù)*/String fileName = "itcast"+System.currentTimeMillis()+new Random().nextInt(999999)+".jpg";//5.創(chuàng)建一個本地字節(jié)輸出流FileOutputStream對象,構(gòu)造方法中綁定要輸出的目的地//FileOutputStream fos = new FileOutputStream(file+"\\1.jpg");FileOutputStream fos = new FileOutputStream(file+"\\"+fileName);//6.使用網(wǎng)絡(luò)字節(jié)輸入流InputStream對象中的方法read,讀取客戶端上傳的文件int len =0;byte[] bytes = new byte[1024];while((len = is.read(bytes))!=-1){//7.使用本地字節(jié)輸出流FileOutputStream對象中的方法write,把讀取到的文件保存到服務(wù)器的硬盤上fos.write(bytes,0,len);}//8.使用Socket對象中的方法getOutputStream,獲取到網(wǎng)絡(luò)字節(jié)輸出流OutputStream對象//9.使用網(wǎng)絡(luò)字節(jié)輸出流OutputStream對象中的方法write,給客戶端回寫"上傳成功"socket.getOutputStream().write("上傳成功".getBytes());//10.釋放資源(FileOutputStream,Socket,ServerSocket)fos.close();socket.close();}catch (IOException e){System.out.println(e);}}}).start();}//服務(wù)器就不用關(guān)閉//server.close();} }客戶端
import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket;/*文件上傳案例的客戶端:讀取本地文件,上傳到服務(wù)器,讀取服務(wù)器回寫的數(shù)據(jù)明確:數(shù)據(jù)源:c:\\1.jpg目的地:服務(wù)器實現(xiàn)步驟:1.創(chuàng)建一個本地字節(jié)輸入流FileInputStream對象,構(gòu)造方法中綁定要讀取的數(shù)據(jù)源2.創(chuàng)建一個客戶端Socket對象,構(gòu)造方法中綁定服務(wù)器的IP地址和端口號3.使用Socket中的方法getOutputStream,獲取網(wǎng)絡(luò)字節(jié)輸出流OutputStream對象4.使用本地字節(jié)輸入流FileInputStream對象中的方法read,讀取本地文件5.使用網(wǎng)絡(luò)字節(jié)輸出流OutputStream對象中的方法write,把讀取到的文件上傳到服務(wù)器6.使用Socket中的方法getInputStream,獲取網(wǎng)絡(luò)字節(jié)輸入流InputStream對象7.使用網(wǎng)絡(luò)字節(jié)輸入流InputStream對象中的方法read讀取服務(wù)回寫的數(shù)據(jù)8.釋放資源(FileInputStream,Socket)*/ public class TCPClient {public static void main(String[] args) throws IOException {//1.創(chuàng)建一個本地字節(jié)輸入流FileInputStream對象,構(gòu)造方法中綁定要讀取的數(shù)據(jù)源FileInputStream fis = new FileInputStream("c:\\1.jpg");//2.創(chuàng)建一個客戶端Socket對象,構(gòu)造方法中綁定服務(wù)器的IP地址和端口號Socket socket = new Socket("127.0.0.1",8888);//3.使用Socket中的方法getOutputStream,獲取網(wǎng)絡(luò)字節(jié)輸出流OutputStream對象OutputStream os = socket.getOutputStream();//4.使用本地字節(jié)輸入流FileInputStream對象中的方法read,讀取本地文件int len = 0;byte[] bytes = new byte[1024];while((len = fis.read(bytes))!=-1){//5.使用網(wǎng)絡(luò)字節(jié)輸出流OutputStream對象中的方法write,把讀取到的文件上傳到服務(wù)器os.write(bytes,0,len);}/*解決:上傳完文件,給服務(wù)器寫一個結(jié)束標記void shutdownOutput() 禁用此套接字的輸出流。對于 TCP 套接字,任何以前寫入的數(shù)據(jù)都將被發(fā)送,并且后跟 TCP 的正常連接終止序列。*/socket.shutdownOutput();//6.使用Socket中的方法getInputStream,獲取網(wǎng)絡(luò)字節(jié)輸入流InputStream對象InputStream is = socket.getInputStream();//7.使用網(wǎng)絡(luò)字節(jié)輸入流InputStream對象中的方法read讀取服務(wù)回寫的數(shù)據(jù)while((len = is.read(bytes))!=-1){System.out.println(new String(bytes,0,len));}//8.釋放資源(FileInputStream,Socket)fis.close();socket.close();} }?
?
?
總結(jié)
以上是生活随笔為你收集整理的java练气期(3)----java高级(网络编程)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java练气期(2)----java高级
- 下一篇: java筑基期(6)----javasc