首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 網絡編程實戰:從圖片/聲音獲取到動態數據抓取與 Socket 通信

     編輯:Java 相關知識

Java 作為 Internet 時代的原生語言,提供了強大的網絡編程 API。本文從基礎環境搭建入手,循序漸進講解:URL 機制獲取圖片/聲音/HTML/文本、動態定時抓取數據、Applet 安全限制與 Application 區別、URL 創建四種方式、Socket 客戶端/服務端通信實現。所有示例代碼精簡易懂,可直接運行驗證。

開發環境與運行方式速覽

類型編譯運行備註
Applicationjavac File.javajava ClassNamemain 入口
Appletjavac File.javaappletviewer test.html / 瀏覽器打開 HTML需 HTML 引用,受沙箱限制

代碼托管:https://www.shu.edu.cn/~xyx/test/jvnet 可直接在線體驗。

核心 API:URL 與 連接獲取資源通用流程

  1. 創建 URL 對象(四種構造方式)
  2. 調用對應方法獲取資源對象(Image/AudioClip/InputStream 等)
  3. 處理並展示資源

五大資源獲取實戰

1. 獲取並顯示網絡圖片

// 方式一:URL 字符串直傳
String url = "https://host/path/img.jpg";
Image img = getImage(new URL(url));

// 方式二:先創建 URL 對象
URL imgUrl = new URL("https://host/path/img.jpg");
Image img = getImage(imgUrl);
// paint() 中 g.drawImage(img, 0, 0, this);

關鍵點:getImage() 非阻塞異步加載,需在 paint() 中繪製。

2. 獲取並播放網絡聲音

兩類 API:

  • 直接播放:play(url) / play(url, filename) — 適合一次性短音效
  • 獲取 AudioClip 控制播放:getAudioClip(url) → clip.loop()/clip.play()/clip.stop() — 適合背景音樂、循環播放
AudioClip clip;
URL auUrl = new URL("https://host/audio/");
clip = getAudioClip(auUrl, "bark.au");
clip.loop(); // 在 paint() 或線程中調用

3. 顯示遠程 HTML 文檔

URL docUrl = new URL("https://host/doc.html");
getAppletContext().showDocument(docUrl, "_blank"); // 新窗口打開
// 或直接:getAppletContext().showDocument(new URL("..."));

此功能不受 Applet 同源策略限制,可打開任意站點頁面。

4. 讀取網絡文件內容(文本/HTML 源碼)

URL fileUrl = new URL("https://host/file.txt");
InputStream in = fileUrl.openStream();
DataInputStream dis = new DataInputStream(in);
String line;
while ((line = dis.readLine()) != null) {
    // 處理每行:解析、顯示、存儲...
    textArea.appendText(line + "\n");
}

此為動態數據抓取基礎:股票行情、新聞、日志分析等。

5. 動態定時抓取:線程 + 循環

public class DynamicFetcher extends Applet implements Runnable {
    Thread fetcher;
    URL dataUrl;
    TextArea area;
    
    public void start() {
        if (fetcher == null) { fetcher = new Thread(this); fetcher.start(); }
    }
    public void stop() { if (fetcher != null) { fetcher.stop(); fetcher = null; } }
    
    public void run() {
        while (true) {
            // 讀取數據並更新 UI(同讀取文件邏輯)
            try { fetcher.sleep(5000); } catch (InterruptedException e) {}
            repaint();
        }
    }
}

每 5 秒自動刷新,配合圖表繪製可實現動態曲線展示。

Applet 安全限制與繞過方案

  • 同源策略:Applet 僅能連接其所在主機(代碼基址)
  • 本地運行無限制:瀏覽器 File → Open File 打開 HTML 可訪問任意網絡資源
  • Application 無限制:改寫為 main() 入口類,直接 java ClassName 運行
  • 部署到遠程主機:將 class/HTML 上傳至對應代碼基址主機

URL 對象四種創建方式

  1. new URL("https://host/path") — 最常用
  2. new URL("http", "host", "/path") — 協議/主機/路徑分離
  3. new URL("http", "host", 80, "/path") — 顯式指定端口
  4. new URL(baseUrl, "relative/path") — 基址 + 相對路徑

Socket 通信進階:客戶端/服務端雙向實現

超越 HTTP,自定義協議:

// 客戶端
Socket socket = new Socket("host", port);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out.println("REQUEST_DATA");
String response = in.readLine();

// 服務端
ServerSocket server = new ServerSocket(port);
while (true) {
    Socket client = server.accept();
    new Thread(() -> handle(client)).start(); // 多線程併發
}

更高性能場景可升級至 NIO(SocketChannel/Selector)實現異步非阻塞。

URLConnection 更豐富的控制

  • 設置請求頭、超時、重定向策略
  • POST 表單數據、文件上傳
  • 獲取響應頭、Cookie 處理
  • 與 CGI/服務端程序雙向交互
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved