日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java socket编程客户端_Java Socket编程 - 基于Socket实现HTTP下载客户端

發布時間:2025/3/8 java 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java socket编程客户端_Java Socket编程 - 基于Socket实现HTTP下载客户端 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

沒有借助任何第三方庫,完全基于JAVA Socket實現一個最小化的HTTP文件下載客

戶端。完整的演示如何通過Socket實現下載文件的HTTP請求(request header)發送

如何從Socket中接受HTTP響應(Response header, Response body)報文并解析與

保存文件內容。如何通過SwingWork實現UI刷新,實時顯示下載進度。

首先看一下UI部分:

【添加下載】按鈕:

點擊彈出URL輸入框,用戶Copy要下載文件URL到輸入框以后,點擊[OK]按鈕即開始

下載

【清除完成】按鈕:

清除所有已經下載完成的文件列表

文件下載狀態分為以下幾種:

package com.gloomyfish.socket.tutorial.http.download;

public enum DownLoadStatus {

NOT_STARTED,

IN_PROCESS,

COMPLETED,

ERROR

}

UI部分主要是利用Swing組件完成。點擊【添加下載】執行的代碼如下:

final JDialog dialog = new JDialog(this,"Add File Link",true);

dialog.getContentPane().setLayout(new BorderLayout());

// dialog.setSize(new Dimension(400,200));

final URLFilePanel panel = new URLFilePanel();

panel.setUpListener(new ActionListener(){

@Override

public void actionPerformed(ActionEvent e) {

if("OK".equals(e.getActionCommand())){

if(panel.validateInput()) {

DownloadDetailStatusInfoModel data = new DownloadDetailStatusInfoModel(panel.getValidFileURL());

tableModel.getData().add(data);

startDownlaod();

refreshUI();

}

dialog.setVisible(false);

dialog.dispose();

} else if("Cancel".equals(e.getActionCommand())) {

dialog.setVisible(false);

dialog.dispose();

}

}});

dialog.getContentPane().add(panel, BorderLayout.CENTER);

dialog.pack();

centre(dialog);

dialog.setVisible(true);

【清除完成】按鈕執行的代碼如下:

private void clearDownloaded() {

List downloadedList = new ArrayList();

for(DownloadDetailStatusInfoModel fileStatus : tableModel.getData()) {

if(fileStatus.getStatus().toString().equals(DownLoadStatus.COMPLETED.toString())) {

downloadedList.add(fileStatus);

}

}

tableModel.getData().removeAll(downloadedList);

refreshUI();

}

讓JFrame組件居中顯示的代碼如下:

public static void centre(Window w) {

Dimension us = w.getSize();

Dimension them = Toolkit.getDefaultToolkit().getScreenSize();

int newX = (them.width - us.width) / 2;

int newY = (them.height - us.height) / 2;

w.setLocation(newX, newY);

}

HTTP協議實現部分:

概述:HTTP請求頭與相應頭報文基本結構與解釋

HTTP請求:一個標準的HTTP請求報文如

其中請求頭可以有多個,message-body可以沒有,不是必須的。請求行的格式如下:

Request-Line = Method SP Request-URI SPHTTP-Version CRLF 舉例說明如下:

Request-Line = GET http://www.w3.org/pub/WWW/TheProject.htmlHTTP/1.1\r\n

其中SP表示空格, CRLF表示回車換行符\r\n

當你想要上傳文件時候,使用Post方式來填寫數據到message-body中即可。發送一個

簡單的HTTP請求報文如下:

GET /pub/WWW/TheProject.html HTTP/1.1\r\n

\r\n

HTTP響應:一個標準的HTTP響應報文如下

最先得到是狀態行,其格式如下:

Status-Line = HTTP-Version SP Status-CodeSP Reason-Phrase CRLF, 一個狀態行的

簡單例子如下:Status-Line = HTTP/1.1 200 OK一般大家最喜歡的就是Status-Code會

給你很多提示,最常見的就是404,500等狀態碼。狀態碼的意思可以參考RFC2616中

的解釋。下載文件最要緊是的檢查HTTP響應頭中的Content-Length與Content-Type兩

個中分別聲明了文件的長度與文件的類型。其它如Accept-Ranges表示接受多少到多少

的字節。可能在多線程下載中使用。搞清楚了HTTP請求與響應的報文格式以后,我們

就可以通過Socket按照報文格式解析內容,發送與讀取HTTP請求與響應。具體步驟

如下:

一:根據用戶輸入的文件URL建立Socket連接

URL url = new URL(fileInfo.getFileURL());

String host = url.getHost();

int port = (url.getPort() == -1) ? url.getDefaultPort():url.getPort();

System.out.println("Host Name = " + host);

System.out.println("port = " + port);

System.out.println("File URI = " + url.getFile());

// create socket and start to construct the request line

Socket socket = new Socket();

SocketAddress address = new InetSocketAddress(host, port);

socket.connect(address);

用了URL類來把用戶輸入的url string變成容易解析一點的URL。

二:構造HTTP請求

BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8"));

String requestStr = "GET " + url.getFile() + " HTTP/1.1\r\n"; // request line

// construct the request header - 構造HTTP請求頭(request header)

String hostHeader = "Host: " + host + "\r\n";

String acceptHeader = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";

String charsetHeader = "Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3\r\n";

String languageHeader = "Accept-Language: zh-CN,zh;q=0.8\r\n";

String keepHeader = "Connection: close\r\n";

三:發送HTTP請求

// 發送HTTP請求

bufferedWriter.write(requestStr);

bufferedWriter.write(hostHeader);

bufferedWriter.write(acceptHeader);

bufferedWriter.write(charsetHeader);

bufferedWriter.write(languageHeader);

bufferedWriter.write(keepHeader);

bufferedWriter.write("\r\n"); // 請求頭信息發送結束標志

bufferedWriter.flush();

四:接受HTTP響應并解析內容,寫入創建好的文件

// 準備接受HTTP響應頭并解析

CustomDataInputStream input = new CustomDataInputStream(socket.getInputStream());

File myFile = new File(fileInfo.getStoreLocation() + File.separator + fileInfo.getFileName());

String content = null;

HttpResponseHeaderParser responseHeader = new HttpResponseHeaderParser();

BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(myFile));

boolean hasData = false;

while((content = input.readHttpResponseHeaderLine()) != null) {

System.out.println("response header contect -->> " + content);

responseHeader.addResponseHeaderLine(content);

if(content.length() == 0) {

hasData = true;

}

if(hasData) {

int totalBytes = responseHeader.getFileLength();

if(totalBytes == 0) break; // no response body and data

int offset = 0;

byte[] myData = null;

if(totalBytes >= 2048) {

myData = new byte[2048];

} else {

myData = new byte[totalBytes];

}

int numOfBytes = 0;

while((numOfBytes = input.read(myData, 0, myData.length)) > 0 && offset < totalBytes) {

offset += numOfBytes;

float p = ((float)offset) / ((float)totalBytes) * 100.0f;

if(offset > totalBytes) {

numOfBytes = numOfBytes + totalBytes - offset;

p = 100.0f;

}

output.write(myData, 0, numOfBytes);

updateStatus(p);

}

hasData = false;

break;

}

}

簡單的HTTP響應頭解析類HttpResponseHeaderParser代碼如下:

package com.gloomyfish.socket.tutorial.http.download;

import java.util.HashMap;

import java.util.Map;

/**

* it can parse entity header, response head

* and response line

* refer to RFC2616,關于HTTP響應頭,請看RFC文檔,描寫的很詳細啊!!

*

* @author fish

*

*/

public class HttpResponseHeaderParser {

public final static String CONTENT_LENGTH = "Content-Length";

public final static String CONTENT_TYPE = "Content-Type";

public final static String ACCEPT_RANGES = "Accetp-Ranges";

private Map headerMap;

public HttpResponseHeaderParser() {

headerMap = new HashMap();

}

/**

*

get the response header key value pair

* @param responseHeaderLine

*/

public void addResponseHeaderLine(String responseHeaderLine) {

if(responseHeaderLine.contains(":")) {

String[] keyValue = responseHeaderLine.split(": ");

if(keyValue[0].equalsIgnoreCase(CONTENT_LENGTH)) {

headerMap.put(CONTENT_LENGTH, keyValue[1]);

} else if(keyValue[0].equalsIgnoreCase(CONTENT_TYPE)) {

headerMap.put(CONTENT_TYPE, keyValue[1]);

} else {

headerMap.put(keyValue[0], keyValue[1]);

}

}

}

public int getFileLength() {

if(headerMap.get(CONTENT_LENGTH) == null){

return 0;

}

return Integer.parseInt(headerMap.get(CONTENT_LENGTH));

}

public String getFileType() {

return headerMap.get(CONTENT_TYPE);

}

public Map getAllHeaders() {

return headerMap;

}

}

可執行的Jar文件下載地址(這次我要點分):

http://download.csdn.net/detail/jia20003/4862076

轉載請務必注明

總結

以上是生活随笔為你收集整理的java socket编程客户端_Java Socket编程 - 基于Socket实现HTTP下载客户端的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 激情六月 | 欧美男女交配 | 毛片毛片毛片毛片毛片毛片毛片 | 久久久久久99精品 | 国产精品毛片一区 | 三级少妇| 国产精品怡红院 | 在线天堂一区 | 男女aa视频 | 色婷婷av一区二区三 | 无套日出白浆 | 日本人妖japanesexxx| 日本xxxxxⅹxxxx69 | 狠狠干综合 | 黄色麻豆视频 | 国产美女精品一区二区三区 | 一级做a爰片久久毛片潮喷 天天透天天干 | 欧美激情视频在线 | 插插插操操操 | 欧美另类一区 | 亚洲综合第一页 | 国产麻豆天美果冻无码视频 | 六月婷婷七月丁香 | 中文字幕在线视频观看 | 99热国产在线观看 | 99热com| 波多野结衣激情视频 | 波多野结衣一区二区三区高清av | 精品国产一级久久 | 黄色在线观看www | 日日爱99| 91超碰在线 | 91爱爱·com| www免费网站在线观看 | 国产又粗又猛又爽又 | 动漫美女揉胸 | 日韩精品成人在线观看 | av视觉盛宴 | 久久久啊啊啊 | 天天干天天舔天天射 | 四虎4hu永久免费网站影院 | 欧美亚洲激情视频 | 九九人人| av先锋资源网 | 在线视频欧美一区 | 欧美精品亚洲 | 久久精品视频在线观看 | 欧美少妇bbw | 中文字幕网站在线观看 | 久久精品伊人 | 麻豆传谋在线观看免费mv | 亚洲伦理网 | 开心激情久久 | 在线观看视频中文字幕 | 超碰在线观看免费 | 日本免费不卡 | 久久久国产精品黄毛片 | 欧美整片sss| 亚洲人视频 | 男女爱爱动态图 | 精品国产免费看 | 国产网址在线 | 日本特黄一级大片 | 久久888| 久久精品视频91 | 肥婆大荫蒂欧美另类 | 久久精品波多野结衣 | 1024精品一区二区三区日韩 | 成av人片一区二区三区久久 | 在线免费观看h片 | 欧美精品乱码 | 绿帽视频 | 亚洲图片自拍偷拍 | 成人在线观看h | 日本一级黄色录像 | 天天干少妇 | 久久手机看片 | 久久免费手机视频 | 亚洲aa| 性生活毛片 | 69精品一区二区三区 | 一二区视频 | 亚洲欧美精品一区二区 | 久久精品视频6 | 色女人天堂| 穿扒开跪着折磨屁股视频 | 国产免费观看av | 中文字幕无码乱码人妻日韩精品 | 拍真实国产伦偷精品 | 国产精品77777 | 蜜桃视频在线观看www | 91精品视频一区二区三区 | 国产啪视频 | 男人日女人在线观看 | 超碰人人超碰 | 成人28深夜影院 | 一区二区伦理 | 精品自拍视频 | 国产一区二区三区免费 |