Java網絡編程之實現資源下載詳解【王道Java】
一,前言
有一個作業需求,如下:
實現用戶端輸入需要下載的編號【存儲在數據庫里】,通過TCP連接,發出請求,客戶端響應,傳輸目標文件個用戶端。用戶端,保存傳輸過來的文件。
二,實現資源下載
功能需求:
1-在服務器的硬盤創建一個目錄,目錄中存放供客戶端下載的資源文件。
2-創建數據庫表,表中存放資源文件的編號和資源文件的地址。
我的數據庫截圖,和服務端目標路徑如下圖。
三,資源下載的客戶端
功能需求:
1-客戶端輸入要下載的資源編號
2-將編號發送給服務器
3-接收服務器的資源,保存到文件
服務器的ip,本機:
InetAddress ip=InetAddress.getLocalHost(); Socket client=new Socket(ip, port);
向服務器發送資源編號,編號—鍵盤輸入。
String no;//編號 String name;
上述代碼解釋:
no變量為編號,name變量為下載資源另存為的名稱。
輸入下載資源的編號和輸入下載資源另存為的名稱:
System.out.println("輸入下載資源的編號:"); no=scanner.next(); System.out.println("輸入下載資源另存為的名稱:"); name=scanner.next();
no編號發送給服務器
下載服務器發送來的資源: ```java OutputStream out=client.getOutputStream(); out.write(no.getBytes()); System.out.println("下載服務器發送來的資源"); InputStream in=client.getInputStream();
字節數組---->保存到文件。
保存文件的路徑名。
File file=new File("E:/tcpcont/client/"+name+".jpg");
使用io流。保存文件。下載完成
FileOutputStream fos=new FileOutputStream(file); byte[]buf=new byte[1024*10]; int len; while((len=in.read(buf))!=-1){ fos.write(buf,0,len); } fos.close(); client.close(); System.out.println("下載完成");
四,資源下載的服務器端
功能需求:
1-接收客戶端的編號
2-在資源表中查找對應資源的地址
3-將資源發送給客戶端
聲明自己的端口
int port=10010;
服務器的ip,本機
InetAddress ip=InetAddress.getLocalHost(); ServerSocket server=new ServerSocket(port);
接收客戶端
阻塞式的方法,沒有客戶端接入,就會一直等待。
Socket client=server.accept();
接收一個資源編號。編號:
InputStream in=client.getInputStream();
將流中的數據讀入到buf數組
連接數據庫,執行sql語句:
查詢resource數據庫里,uid為目標值。
Connection conn=JDBCUtils.getConnection(); String sql="SELECT * FROM resource WHERE uid=?"; PreparedStatement pStatement=conn.prepareStatement(sql); pStatement.setString(1,no); ResultSet rs=pStatement.executeQuery();
獲取返回指針。
使用while函數遍歷指針。
while(rs.next()) {
獲取到對應值。
int id = rs.getInt("uid"); String url = rs.getString("url");
將讀入的數據寫入到輸出流,通知客戶端,傳輸結束了。
實驗總結:理解tcp的三次握手與連接的建立。
客戶端:
1,創建客戶端的socket,指定客戶端的IP對象和端口。
2,創建客戶端的對象,進行數據傳輸。
3,傳輸或者接受數據。
4,關閉
服務端:
1,創建在指定端口上的服務端對象ServerSocket。
2,獲取到在指定端口上監聽到對應的客戶端socket對象。
3,傳輸數據/接收數據。
4,關閉流。
五,最后
有一定的心得。了解了tcp的傳輸原理。
成功完成需求。實現用戶端輸入需要下載的編號【存儲在數據庫里】,通過TCP連接,發出請求,客戶端響應,傳輸目標文件個用戶端。用戶端,保存傳輸過來的文件。
Java 網絡
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。