一、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
微信掃一掃
支付寶掃一掃