Java之網(wǎng)絡(luò)編程案例講解
Java基礎(chǔ)之網(wǎng)絡(luò)編程
基本概念
IP:每個(gè)電腦都有一個(gè)IP地址,在局域網(wǎng)內(nèi)IP地址是可變的。
網(wǎng)絡(luò)通信協(xié)議:通信協(xié)議是對計(jì)算機(jī)必須遵守的規(guī)則,只有遵守這些規(guī)則,計(jì)算機(jī)之間才能進(jìn)行通信。這就好比在道路中行駛的汽車一定要遵守交通規(guī)則一樣,協(xié)議中對數(shù)據(jù)的傳輸格
式、傳輸速率、傳輸步驟等做了統(tǒng)一規(guī)定,通信雙方必須同時(shí)遵守,最終完成數(shù)據(jù)交換。
TCP協(xié)議(傳輸控制協(xié)議):是面向連接的傳輸層協(xié)議,應(yīng)用程序在使用TCP之前,必須先建立TCP連接,在傳輸數(shù)據(jù)完畢后,必須釋放已經(jīng)建立的連接(跟打電話是否類似)。TCP可以保證從一端將數(shù)據(jù)傳送至連接的另一端時(shí),數(shù)據(jù)能夠準(zhǔn)確送達(dá),而且送到的數(shù)據(jù)的排列順序和送出時(shí)的順序相同。
UDP協(xié)議(用戶數(shù)據(jù)報(bào)協(xié)議):是無連接的通信協(xié)議,不保證可靠的數(shù)據(jù)傳輸,但能夠向若干個(gè)目標(biāo)發(fā)送數(shù)據(jù),接收發(fā)自若干個(gè)源的數(shù)據(jù)。(在線影片,下載文件)。
端口(Port):如果把IP地址比作一間房子 ,端口就是出入這間房子的門。
套接字(Socket)用于將應(yīng)用程序與端口連接起來,類似于連接電器與電線的插座。
在Java中,提供了兩個(gè)類用于實(shí)現(xiàn)TCP通信程序:
1.客戶端:java.net.Socket類表示。創(chuàng)建Socket對象,向服務(wù)端發(fā)送連接請求,服務(wù)端相應(yīng)請求,兩者建立連接開始通信。
2.服務(wù)端:java.net.ServerSocket 類表示。創(chuàng)建 ServerSocket 對象,相當(dāng)于開啟一個(gè)服務(wù),并等待客戶端的連接。
Socket 類:該類實(shí)現(xiàn)客戶端套接字,套接字指的是兩臺設(shè)備之間通訊的端點(diǎn)。
構(gòu)造函數(shù)與常用方法
public Socket(String host, int port) :創(chuàng)建套接字對象并將其連接到指定主機(jī)上的指定端口號。如果指定的host是null ,則相當(dāng)于指定地址為回送地址。
public InputStream getInputStream() : 返回此套接字的輸入流。
如果此Scoket具有相關(guān)聯(lián)的通道,則生成的InputStream 的所有操作也關(guān)聯(lián)該通道。 關(guān)閉生成的InputStream也將關(guān)閉相關(guān)的Socket。
public OutputStream getOutputStream() : 返回此套接字的輸出流。
如果此Scoket具有相關(guān)聯(lián)的通道,則生成的OutputStream 的所有操作也關(guān)聯(lián)該通道。 關(guān)閉生成的OutputStream也將關(guān)閉相關(guān)的Socket。
public void close() :關(guān)閉此套接字。 一旦一個(gè)socket被關(guān)閉,它不可再使用。 關(guān)閉此socket也將關(guān)閉相關(guān)的InputStream和OutputStream 。
public void shutdownOutput() : 禁用此套接字的輸出流。 任何先前寫出的數(shù)據(jù)將被發(fā)送,隨后終止輸出流
客戶端實(shí)現(xiàn)步驟--使用Socket類
1.創(chuàng)建一個(gè)客戶端對象Socket,構(gòu)造方法綁定服務(wù)器的IP地址和端口號
2.使用Socket對象中的方法getOutputStream()獲取網(wǎng)絡(luò)字節(jié)輸出流OutputStream對象
3.使用網(wǎng)絡(luò)字節(jié)輸出流OutputStream對象中的方法write,給服務(wù)器發(fā)送數(shù)據(jù)
4.使用Socket對象中的方法getInputStream()獲取網(wǎng)絡(luò)字節(jié)輸入流InputStream對象
5.使用網(wǎng)絡(luò)字節(jié)輸入流InputStream對象中方法read,讀取服務(wù)器回寫的數(shù)據(jù)
6.使用資源(Socket.Close)
public static void main(String[] args) throws IOException { //1.創(chuàng)建一個(gè)客戶端對象Socket,構(gòu)造方法綁定服務(wù)器的IP地址和端口號 Socket socket = new Socket("127.0.0.1",8888); //2.使用Socket對象中的方法getOutputStream()獲取網(wǎng)絡(luò)字節(jié)輸出流OutputStream對象 OutputStream os = socket.getOutputStream(); //3.使用網(wǎng)絡(luò)字節(jié)輸出流OutputStream對象中的方法write,給服務(wù)器發(fā)送數(shù)據(jù) os.write("你好服務(wù)器".getBytes()); //4.使用Socket對象中的方法getInputStream()獲取網(wǎng)絡(luò)字節(jié)輸入流InputStream對象 InputStream is = socket.getInputStream(); //5.使用網(wǎng)絡(luò)字節(jié)輸入流InputStream對象中方法read,讀取服務(wù)器回寫的數(shù)據(jù) byte[] bytes = new byte[1024]; int len = is.read(bytes); System.out.println(new String(bytes,0,len)); //6.使用資源(Socket.Close) socket.close(); }
ServerSocket 類:這個(gè)類實(shí)現(xiàn)了服務(wù)器套接字,該對象等待通過網(wǎng)絡(luò)的請求。 構(gòu)造函數(shù)與常用方法
public ServerSocket(int port) :使用該構(gòu)造方法在創(chuàng)建ServerSocket對象時(shí),就可以將其綁定到一個(gè)指定的端口號上,參數(shù)port就是端口號。
public Socket accept() :偵聽并接受連接,返回一個(gè)新的 Socket 對象,用于和客戶端實(shí)現(xiàn)通信。該方法會(huì)一直阻塞直到建立連接。
服務(wù)器端實(shí)現(xiàn)步驟--使用ServerSocket類
1.使用服務(wù)器ServerSocket對象和系統(tǒng)要指定的端口號
2.使用ServerSocket對象中的方法accept,獲取到請求的客戶端對象socket
3.使用Socket對象中的getInputStream()獲取網(wǎng)絡(luò)字節(jié)輸入流Inputstream對象
4.使用網(wǎng)絡(luò)字節(jié)輸入流InputStream對象中方法read,讀取客戶端發(fā)送的數(shù)據(jù)
5.使用Socket對象中的方法getOutputStream()獲取網(wǎng)絡(luò)字節(jié)輸出流OutputStream對象
6.使用網(wǎng)絡(luò)字節(jié)輸出流Outputstream對象中的方法Write,給客戶端回寫數(shù)據(jù)
7.釋放資源(Socket,ServerSocket)
public static void main(String[]args)throws IOException{ //1.使用服務(wù)器ServerSocket對象和系統(tǒng)要指定的端口號 ServerSocket server=new ServerSocket(8888); //2.使用ServerSocket對象中的方法accept,獲取到請求的客戶端對象socket Socket socket=server.accept(); //3.使用Socket對象中的getInputStream()獲取網(wǎng)絡(luò)字節(jié)輸入流Inputstream對象 InputStream is=socket.getInputStream(); //4..使用網(wǎng)絡(luò)字節(jié)輸入流InputStream對象中方法read,讀取客戶端發(fā)送的數(shù)據(jù) byte[]bytes=new byte[1024]; int len=is.read(bytes); System.out.println(new String(bytes,0,len)); //5.使用Socket對象中的方法getOutputStream()獲取網(wǎng)絡(luò)字節(jié)輸出流OutputStream對象 OutputStream os=socket.getOutputStream(); //6.使用網(wǎng)絡(luò)字節(jié)輸出流Outputstream對象中的方法Write,給客戶端回寫數(shù)據(jù) os.write("收到謝謝".getBytes()); //7.釋放資源(Socket,ServerSocket) server.close(); socket.close(); }
文件上傳練習(xí)
客戶端
public static void main(String[]args)throws IOException{ //1.創(chuàng)建一個(gè)本地字節(jié)輸入流FileInputStream對象,構(gòu)造方法中綁定要讀取的數(shù)據(jù)源 FileInputStream fis=new FileInputStream("c:\\1.jpg"); //2.創(chuàng)建一個(gè)客戶端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ù)器寫一個(gè)結(jié)束標(biāo)記 voidshutdownOutput()禁用此套接字的輸出流。 對于TCP套接字,任何以前寫入的數(shù)據(jù)都將被發(fā)送,并且后跟TCP的正常連接終止序列。 */ socket.shutdownOutput(); //6.使用Socket中的方法getInputStream,獲取網(wǎng)絡(luò)字節(jié)輸入流InputStream對象 InputStream is=socket.getInputStream(); System.out.println("333333333333333333333"); //7.使用網(wǎng)絡(luò)字節(jié)輸入流InputStream對象中的方法read讀取服務(wù)回寫的數(shù)據(jù) while((len=is.read(bytes))!=-1){ System.out.println(new String(bytes,0,len)); } System.out.println("444444444444444444while死循環(huán)打印不到"); //8.釋放資源(FileInputStream,Socket) fis.close(); socket.close(); }
服務(wù)端
public static void main(String[]args)throws IOException{ //1.創(chuàng)建一個(gè)服務(wù)器ServerSocket對象,和系統(tǒng)要指定的端口號 ServerSocket server=new ServerSocket(8888); //2.使用ServerSocket對象中的方法accept,獲取到請求的客戶端Socket對象 Socket socket=server.accept(); //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(); } //5.創(chuàng)建一個(gè)本地字節(jié)輸出流FileOutputStream對象,構(gòu)造方法中綁定要輸出的目的地 FileOutputStream fos=new FileOutputStream(file+"\\1.jpg"); //6.使用網(wǎng)絡(luò)字節(jié)輸入流InputStream對象中的方法read,讀取客戶端上傳的文件 System.out.println("11111111111111111111"); int len=0; byte[]bytes=new byte[1024]; while((len=is.read(bytes))!=-1){ //7.使用本地字節(jié)輸出流FileOutputStream對象中的方法write,把讀取到的文件保存到服務(wù)器的硬盤上 fos.write(bytes,0,len); } System.out.println("22222222222222222222222while死循環(huán)打印不到"); //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(); server.close(); }
到此這篇關(guān)于Java之網(wǎng)絡(luò)編程案例講解的文章就介紹到這了,更多相關(guān)Java之網(wǎng)絡(luò)編程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java代理模式實(shí)例詳解【靜態(tài)代理與動(dòng)態(tài)代理】
這篇文章主要介紹了Java代理模式,結(jié)合實(shí)例形式詳細(xì)分析了java靜態(tài)代理與動(dòng)態(tài)代理模式相關(guān)概念、原理、操作技巧與注意事項(xiàng),需要的朋友可以參考下2019-09-09Druid連接池的自定義過濾功能實(shí)現(xiàn)方法
在數(shù)據(jù)密集型應(yīng)用中,監(jiān)控和分析數(shù)據(jù)庫操作對于確保性能和穩(wěn)定性至關(guān)重要,本文將探討如何實(shí)現(xiàn)一個(gè)自定義的Druid過濾器來捕獲數(shù)據(jù)庫請求并進(jìn)行日志記錄,以輔助開發(fā)和維護(hù)工作,需要的朋友可以參考下2023-11-11關(guān)于Spring Boot WebSocket整合以及nginx配置詳解
這篇文章主要給大家介紹了關(guān)于Spring Boot WebSocket整合以及nginx配置的相關(guān)資料,文中通過示例代碼給大家介紹的非常詳細(xì),相信對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)下吧。2017-09-09Java基礎(chǔ)之面向?qū)ο髾C(jī)制(多態(tài)、繼承)底層實(shí)現(xiàn)
這篇文章主要介紹了Java基礎(chǔ)之面向?qū)ο髾C(jī)制(多態(tài)、繼承)底層實(shí)現(xiàn),文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04詳解如何在Spring Boot中實(shí)現(xiàn)容錯(cuò)機(jī)制
容錯(cuò)機(jī)制是構(gòu)建健壯和可靠的應(yīng)用程序的重要組成部分,它可以幫助應(yīng)用程序在面對異?;蚬收蠒r(shí)保持穩(wěn)定運(yùn)行,Spring Boot提供了多種機(jī)制來實(shí)現(xiàn)容錯(cuò),包括異常處理、斷路器、重試和降級等,本文將介紹如何在Spring Boot中實(shí)現(xiàn)這些容錯(cuò)機(jī)制,需要的朋友可以參考下2023-10-10Spring Boot 中的 Spring Cloud Feign的原
Spring Cloud Feign 是 Spring Cloud 中的一個(gè)組件,它可以幫助我們實(shí)現(xiàn)聲明式的 REST 客戶,這篇文章主要介紹了Spring Boot 中的 Spring Cloud Feign,需要的朋友可以參考下2023-07-07IDEA使用學(xué)生郵箱無法注冊問題:JetBrains Account connection error: 拒絕連接
這篇文章主要介紹了IDEA使用學(xué)生郵箱無法注冊問題:JetBrains Account connection error: 拒絕連接,文中通過圖文及示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07