引言

在网络技术飞速发展的今天,Java网络编程已经成为程序员必备的技能之一。Socket编程作为Java网络编程的核心技术,是实现服务器与客户端通信的基础。本文将带你从入门到实战,轻松掌握Socket编程。

一、Socket编程基础

1.1 什么是Socket

Socket,即“套接字”,是网络通信中的一个抽象概念。它表示网络中两个通信实体(如客户端和服务器)之间的端点。通过Socket,客户端和服务器可以建立连接,进行数据交换。

1.2 Socket编程模型

Socket编程模型主要分为两种:阻塞式和非阻塞式。

  • 阻塞式Socket:在数据传输过程中,当前线程会阻塞,直到数据传输完成。
  • 非阻塞式Socket:在数据传输过程中,当前线程不会阻塞,而是通过轮询或回调机制来处理数据。

1.3 Java中的Socket类

Java提供了java.net.Socketjava.net.ServerSocket两个类来实现Socket编程。

  • Socket类:用于创建客户端Socket,连接到服务器。
  • ServerSocket类:用于创建服务器Socket,监听客户端连接。

二、Socket编程实战

2.1 实现一个简单的聊天程序

以下是一个简单的聊天程序示例,其中客户端发送消息,服务器接收消息并显示。

服务器端代码

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

public class ChatServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(12345);
        System.out.println("服务器启动,等待客户端连接...");

        Socket clientSocket = serverSocket.accept();
        System.out.println("客户端连接成功!");

        BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

        String inputLine;
        while ((inputLine = in.readLine()) != null) {
            System.out.println("客户端:" + inputLine);
            out.println("服务器:" + inputLine);
        }

        in.close();
        out.close();
        clientSocket.close();
        serverSocket.close();
    }
}

客户端代码

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

public class ChatClient {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("localhost", 12345);
        System.out.println("连接到服务器...");

        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

        BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
        String inputLine;

        while ((inputLine = stdin.readLine()) != null) {
            out.println(inputLine);
            System.out.println("服务器:" + in.readLine());
        }

        in.close();
        out.close();
        socket.close();
    }
}

2.2 实现文件传输

以下是一个简单的文件传输程序示例,其中客户端发送文件,服务器接收文件并保存。

服务器端代码

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

public class FileServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(12345);
        System.out.println("服务器启动,等待客户端连接...");

        Socket clientSocket = serverSocket.accept();
        System.out.println("客户端连接成功!");

        InputStream in = clientSocket.getInputStream();
        FileOutputStream fileOutputStream = new FileOutputStream("received_file.txt");

        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = in.read(buffer)) != -1) {
            fileOutputStream.write(buffer, 0, bytesRead);
        }

        fileOutputStream.close();
        in.close();
        clientSocket.close();
        serverSocket.close();
    }
}

客户端代码

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

public class FileClient {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("localhost", 12345);
        System.out.println("连接到服务器...");

        FileInputStream fileInputStream = new FileInputStream("sent_file.txt");
        OutputStream out = socket.getOutputStream();

        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = fileInputStream.read(buffer)) != -1) {
            out.write(buffer, 0, bytesRead);
        }

        fileInputStream.close();
        out.close();
        socket.close();
    }
}

三、总结

通过本文的学习,相信你已经对Java网络编程中的Socket编程有了初步的了解。在实际应用中,Socket编程可以帮助我们实现各种网络应用,如文件传输、聊天程序等。希望本文能帮助你轻松掌握Socket编程,为你的网络编程之路奠定基础。