使用Java編寫Socket程序實現網路通信

一、Socket Programming是什麼

Socket Programming(套接字編程)是指使用Socket API進行網路編程。在Java中,Socket可以用來通過TCP/IP協議進行數據交換,可以實現不同機器之間的數據通信。

Socket編程通過創建Socket對象來開啟一個埠,埠號是從1到65535之間的整數。一台機器可以同時開啟多個埠,不同的埠用來提供不同的服務。

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServer {
    public static void main(String[] args) throws IOException {
        int portNumber = 8080;
        ServerSocket serverSocket = new ServerSocket(portNumber);
        while (true) {
            Socket clientSocket = serverSocket.accept();
            // 開啟線程處理客戶端請求
            new RequestHandler(clientSocket).start();
        }
    }
}

二、實現Tcp Server服務端

要實現一個Tcp Server服務端,需要創建一個ServerSocket對象,調用accept()方法等待客戶端請求,當有客戶端請求時,會返回一個Socket對象,通過該對象即可與客戶端通信。

開啟一個ServerSocket對象,設置埠號,使用accept()方法等待客戶端請求:

ServerSocket serverSocket = new ServerSocket(portNumber);
Socket clientSocket = serverSocket.accept();

獲取客戶端請求後,可以使用輸入流讀取客戶端發送的數據,使用輸出流向客戶端發送響應數據:

InputStream inputStream = clientSocket.getInputStream();
OutputStream outputStream = clientSocket.getOutputStream();

完整的Tcp Server服務端代碼示例:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {
    public static void main(String[] args) throws IOException {
        int portNumber = 8080;
        ServerSocket serverSocket = new ServerSocket(portNumber);
        while (true) {
            Socket clientSocket = serverSocket.accept();
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                out.println(inputLine);
            }
        }
    }
}

三、實現Tcp Client客戶端

要實現一個Tcp Client客戶端,需要創建一個Socket對象,連接指定的伺服器地址和埠號,然後使用輸入輸出流向伺服器發送請求和接收響應。

創建一個Socket對象,設置伺服器地址和埠號,向伺服器發送請求,並讀取響應:

Socket socket = new Socket(serverAddress, portNumber);
OutputStream outputStream = socket.getOutputStream();
InputStream inputStream = socket.getInputStream();

完整的Tcp Client客戶端代碼示例:

import java.io.*;
import java.net.Socket;

public class TcpClient {
    public static void main(String[] args) throws IOException {
        String serverAddress = "localhost";
        int portNumber = 8080;
        Socket socket = new Socket(serverAddress, portNumber);
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
        String userInput;
        while ((userInput = stdIn.readLine()) != null) {
            out.println(userInput);
            System.out.println("echo: " + in.readLine());
        }
    }
}

四、使用UDP協議進行數據傳輸

使用UDP(User Datagram Protocol)協議可以實現不需要建立連接,直接進行數據傳輸的網路通信。相比於TCP,UDP更輕便,但無法保證數據的可靠性和順序。

使用UDP協議創建一個DatagramSocket對象,然後創建一個DatagramPacket對象,該對象包含發送或接收的數據和目標地址和埠號。通過send()方法向指定地址發送數據包,使用receive()方法接收數據包。

完整的UDP Server服務端代碼示例:

import java.io.IOException;
import java.net.*;

public class UdpServer {
    public static void main(String[] args) throws IOException {
        int portNumber = 8080;
        DatagramSocket serverSocket = new DatagramSocket(portNumber);
        byte[] receiveData = new byte[1024];
        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
        while (true) {
            serverSocket.receive(receivePacket);
            String message = new String(receivePacket.getData(), receivePacket.getOffset(), receivePacket.getLength());
            System.out.println("Received message: " + message);
            InetAddress address = receivePacket.getAddress();
            int port = receivePacket.getPort();
            byte[] sendData = message.toUpperCase().getBytes();
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, address, port);
            serverSocket.send(sendPacket);
        }
    }
}

完整的UDP Client客戶端代碼示例:

import java.io.IOException;
import java.net.*;

public class UdpClient {
    public static void main(String[] args) throws IOException {
        String serverAddress = "localhost";
        int portNumber = 8080;
        DatagramSocket clientSocket = new DatagramSocket();
        InetAddress address = InetAddress.getByName(serverAddress);
        byte[] sendData = "Hello, UDP!".getBytes();
        DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, address, portNumber);
        clientSocket.send(sendPacket);
        byte[] receiveData = new byte[1024];
        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
        clientSocket.receive(receivePacket);
        String message = new String(receivePacket.getData(), receivePacket.getOffset(), receivePacket.getLength());
        System.out.println("Received message: " + message);
    }
}

五、總結

本文詳細介紹了使用Java編寫Socket程序實現網路通信的方法,包括Tcp Server服務端,Tcp Client客戶端,以及UDP協議的實現方式。希望讀者能夠通過本文加深對Socket編程的理解,實踐中靈活運用。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/251029.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-13 13:32
下一篇 2024-12-13 13:32

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智慧、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Python程序文件的拓展

    Python是一門功能豐富、易於學習、可讀性高的編程語言。Python程序文件通常以.py為文件拓展名,被廣泛應用於各種領域,包括Web開發、機器學習、科學計算等。為了更好地發揮P…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29

發表回復

登錄後才能評論