Java之網絡編程案例講解
Java基礎之網絡編程
基本概念
IP:每個電腦都有一個IP地址,在局域網內IP地址是可變的。
網絡通信協議:通信協議是對計算機必須遵守的規則,隻有遵守這些規則,計算機之間才能進行通信。這就好比在道路中行駛的汽車一定要遵守交通規則一樣,協議中對數據的傳輸格
式、傳輸速率、傳輸步驟等做瞭統一規定,通信雙方必須同時遵守,最終完成數據交換。
TCP協議(傳輸控制協議):是面向連接的傳輸層協議,應用程序在使用TCP之前,必須先建立TCP連接,在傳輸數據完畢後,必須釋放已經建立的連接(跟打電話是否類似)。TCP可以保證從一端將數據傳送至連接的另一端時,數據能夠準確送達,而且送到的數據的排列順序和送出時的順序相同。
UDP協議(用戶數據報協議):是無連接的通信協議,不保證可靠的數據傳輸,但能夠向若幹個目標發送數據,接收發自若幹個源的數據。(在線影片,下載文件)。
端口(Port):如果把IP地址比作一間房子 ,端口就是出入這間房子的門。
套接字(Socket)用於將應用程序與端口連接起來,類似於連接電器與電線的插座。
在Java中,提供瞭兩個類用於實現TCP通信程序:
1.客戶端:java.net.Socket類表示。創建Socket對象,向服務端發送連接請求,服務端相應請求,兩者建立連接開始通信。
2.服務端:java.net.ServerSocket 類表示。創建 ServerSocket 對象,相當於開啟一個服務,並等待客戶端的連接。
Socket 類:該類實現客戶端套接字,套接字指的是兩臺設備之間通訊的端點。
構造函數與常用方法
public Socket(String host, int port) :創建套接字對象並將其連接到指定主機上的指定端口號。如果指定的host是null ,則相當於指定地址為回送地址。
public InputStream getInputStream() : 返回此套接字的輸入流。
如果此Scoket具有相關聯的通道,則生成的InputStream 的所有操作也關聯該通道。 關閉生成的InputStream也將關閉相關的Socket。
public OutputStream getOutputStream() : 返回此套接字的輸出流。
如果此Scoket具有相關聯的通道,則生成的OutputStream 的所有操作也關聯該通道。 關閉生成的OutputStream也將關閉相關的Socket。
public void close() :關閉此套接字。 一旦一個socket被關閉,它不可再使用。 關閉此socket也將關閉相關的InputStream和OutputStream 。
public void shutdownOutput() : 禁用此套接字的輸出流。 任何先前寫出的數據將被發送,隨後終止輸出流
客戶端實現步驟–使用Socket類
1.創建一個客戶端對象Socket,構造方法綁定服務器的IP地址和端口號
2.使用Socket對象中的方法getOutputStream()獲取網絡字節輸出流OutputStream對象
3.使用網絡字節輸出流OutputStream對象中的方法write,給服務器發送數據
4.使用Socket對象中的方法getInputStream()獲取網絡字節輸入流InputStream對象
5.使用網絡字節輸入流InputStream對象中方法read,讀取服務器回寫的數據
6.使用資源(Socket.Close)
public static void main(String[] args) throws IOException { //1.創建一個客戶端對象Socket,構造方法綁定服務器的IP地址和端口號 Socket socket = new Socket("127.0.0.1",8888); //2.使用Socket對象中的方法getOutputStream()獲取網絡字節輸出流OutputStream對象 OutputStream os = socket.getOutputStream(); //3.使用網絡字節輸出流OutputStream對象中的方法write,給服務器發送數據 os.write("你好服務器".getBytes()); //4.使用Socket對象中的方法getInputStream()獲取網絡字節輸入流InputStream對象 InputStream is = socket.getInputStream(); //5.使用網絡字節輸入流InputStream對象中方法read,讀取服務器回寫的數據 byte[] bytes = new byte[1024]; int len = is.read(bytes); System.out.println(new String(bytes,0,len)); //6.使用資源(Socket.Close) socket.close(); }
ServerSocket 類:這個類實現瞭服務器套接字,該對象等待通過網絡的請求。 構造函數與常用方法
public ServerSocket(int port) :使用該構造方法在創建ServerSocket對象時,就可以將其綁定到一個指定的端口號上,參數port就是端口號。
public Socket accept() :偵聽並接受連接,返回一個新的 Socket 對象,用於和客戶端實現通信。該方法會一直阻塞直到建立連接。
服務器端實現步驟–使用ServerSocket類
1.使用服務器ServerSocket對象和系統要指定的端口號
2.使用ServerSocket對象中的方法accept,獲取到請求的客戶端對象socket
3.使用Socket對象中的getInputStream()獲取網絡字節輸入流Inputstream對象
4.使用網絡字節輸入流InputStream對象中方法read,讀取客戶端發送的數據
5.使用Socket對象中的方法getOutputStream()獲取網絡字節輸出流OutputStream對象
6.使用網絡字節輸出流Outputstream對象中的方法Write,給客戶端回寫數據
7.釋放資源(Socket,ServerSocket)
public static void main(String[]args)throws IOException{ //1.使用服務器ServerSocket對象和系統要指定的端口號 ServerSocket server=new ServerSocket(8888); //2.使用ServerSocket對象中的方法accept,獲取到請求的客戶端對象socket Socket socket=server.accept(); //3.使用Socket對象中的getInputStream()獲取網絡字節輸入流Inputstream對象 InputStream is=socket.getInputStream(); //4..使用網絡字節輸入流InputStream對象中方法read,讀取客戶端發送的數據 byte[]bytes=new byte[1024]; int len=is.read(bytes); System.out.println(new String(bytes,0,len)); //5.使用Socket對象中的方法getOutputStream()獲取網絡字節輸出流OutputStream對象 OutputStream os=socket.getOutputStream(); //6.使用網絡字節輸出流Outputstream對象中的方法Write,給客戶端回寫數據 os.write("收到謝謝".getBytes()); //7.釋放資源(Socket,ServerSocket) server.close(); socket.close(); }
文件上傳練習
客戶端
public static void main(String[]args)throws IOException{ //1.創建一個本地字節輸入流FileInputStream對象,構造方法中綁定要讀取的數據源 FileInputStream fis=new FileInputStream("c:\\1.jpg"); //2.創建一個客戶端Socket對象,構造方法中綁定服務器的IP地址和端口號 Socket socket=new Socket("127.0.0.1",8888); //3.使用Socket中的方法getOutputStream,獲取網絡字節輸出流OutputStream對象 OutputStream os=socket.getOutputStream(); //4.使用本地字節輸入流FileInputStream對象中的方法read,讀取本地文件 int len=0; byte[]bytes=new byte[1024]; while((len=fis.read(bytes))!=-1){ //5.使用網絡字節輸出流OutputStream對象中的方法write,把讀取到的文件上傳到服務器 os.write(bytes,0,len); } /* 解決:上傳完文件,給服務器寫一個結束標記 voidshutdownOutput()禁用此套接字的輸出流。 對於TCP套接字,任何以前寫入的數據都將被發送,並且後跟TCP的正常連接終止序列。 */ socket.shutdownOutput(); //6.使用Socket中的方法getInputStream,獲取網絡字節輸入流InputStream對象 InputStream is=socket.getInputStream(); System.out.println("333333333333333333333"); //7.使用網絡字節輸入流InputStream對象中的方法read讀取服務回寫的數據 while((len=is.read(bytes))!=-1){ System.out.println(new String(bytes,0,len)); } System.out.println("444444444444444444while死循環打印不到"); //8.釋放資源(FileInputStream,Socket) fis.close(); socket.close(); }
服務端
public static void main(String[]args)throws IOException{ //1.創建一個服務器ServerSocket對象,和系統要指定的端口號 ServerSocket server=new ServerSocket(8888); //2.使用ServerSocket對象中的方法accept,獲取到請求的客戶端Socket對象 Socket socket=server.accept(); //3.使用Socket對象中的方法getInputStream,獲取到網絡字節輸入流InputStream對象 InputStream is=socket.getInputStream(); //4.判斷d:\\upload文件夾是否存在,不存在則創建 File file=new File("d:\\upload"); if(!file.exists()){ file.mkdirs(); } //5.創建一個本地字節輸出流FileOutputStream對象,構造方法中綁定要輸出的目的地 FileOutputStream fos=new FileOutputStream(file+"\\1.jpg"); //6.使用網絡字節輸入流InputStream對象中的方法read,讀取客戶端上傳的文件 System.out.println("11111111111111111111"); int len=0; byte[]bytes=new byte[1024]; while((len=is.read(bytes))!=-1){ //7.使用本地字節輸出流FileOutputStream對象中的方法write,把讀取到的文件保存到服務器的硬盤上 fos.write(bytes,0,len); } System.out.println("22222222222222222222222while死循環打印不到"); //8.使用Socket對象中的方法getOutputStream,獲取到網絡字節輸出流OutputStream對象 //9.使用網絡字節輸出流OutputStream對象中的方法write,給客戶端回寫"上傳成功" socket.getOutputStream().write("上傳成功".getBytes()); //10.釋放資源(FileOutputStream,Socket,ServerSocket) fos.close(); socket.close(); server.close(); }
到此這篇關於Java之網絡編程案例講解的文章就介紹到這瞭,更多相關Java之網絡編程內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!