【Java网络编程详解】

文章目录


前言

Java网络编程是开发分布式应用程序的重要技能,它通过套接字(Socket)进行数据传输,支持TCP和UDP协议。本文将介绍Java网络编程的基础知识,包括Socket、ServerSocket、TCP通信、UDP通信、常用类和示例代码。


一、网络编程基础知识

1. 什么是网络编程?

网络编程是指在计算机之间通过网络进行数据传输和通信的编程方式。Java提供了强大的java.net包,封装了底层的网络协议,简化了网络编程。

网络编程常用协议:

  • TCP(Transmission Control Protocol):面向连接,可靠传输,保证数据按序到达,适合文件传输、Web通信等。
  • UDP(User Datagram Protocol):面向无连接,不可靠但速度快,适合视频通话、广播消息等。

二、Java网络编程核心类

Java使用java.net包中的类进行网络编程,常用类包括:

  • Socket:用于实现TCP客户端通信。
  • ServerSocket:用于实现TCP服务器通信。
  • DatagramSocket:用于UDP通信。
  • InetAddress:用于处理IP地址。
  • URL与HttpURLConnection:处理HTTP协议通信。

三、TCP编程实现

1. TCP通信原理

在TCP通信中:

  • 服务器端 :创建ServerSocket对象,监听指定端口,等待客户端连接。
  • 客户端 :创建Socket对象,连接服务器。
  • 数据传输:双方使用输入输出流进行数据读写。

2. TCP服务器端示例

创建服务器端,监听端口并接收客户端发送的数据。

java 复制代码
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {
    public static void main(String[] args) {
        int port = 8080;
        try (ServerSocket serverSocket = new ServerSocket(port)) {
            System.out.println("服务器启动,等待客户端连接...");

            while (true) {
                Socket socket = serverSocket.accept();  // 等待客户端连接
                System.out.println("客户端已连接:" + socket.getInetAddress());

                // 接收数据
                BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String message = reader.readLine();
                System.out.println("客户端消息: " + message);

                // 响应数据
                PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
                writer.println("服务器已收到: " + message);

                socket.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3. TCP客户端示例

创建客户端,连接服务器并发送消息。

java 复制代码
import java.io.*;
import java.net.Socket;

public class TCPClient {
    public static void main(String[] args) {
        String host = "localhost";
        int port = 8080;

        try (Socket socket = new Socket(host, port)) {
            System.out.println("连接服务器...");

            // 发送数据
            PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
            writer.println("你好,服务器!");

            // 接收响应
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            System.out.println("服务器响应: " + reader.readLine());

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

运行步骤:

  1. 先运行服务器端程序,监听端口。
  2. 再运行客户端程序,连接服务器并发送消息。
  3. 服务器收到消息后返回响应。

四、UDP编程实现

1. UDP通信原理

  • 服务器端 :创建DatagramSocket,监听端口,接收数据报。
  • 客户端 :创建DatagramSocket,向服务器发送数据报。
  • 数据传输 :使用DatagramPacket进行发送和接收。

2. UDP服务器端示例

创建服务器,监听端口,接收客户端数据报。

java 复制代码
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPServer {
    public static void main(String[] args) {
        int port = 8080;
        byte[] buffer = new byte[1024];

        try (DatagramSocket socket = new DatagramSocket(port)) {
            System.out.println("UDP服务器启动,监听端口:" + port);

            while (true) {
                DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
                socket.receive(packet);

                String message = new String(packet.getData(), 0, packet.getLength());
                System.out.println("收到客户端消息: " + message);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3. UDP客户端示例

创建客户端,向服务器发送数据报。

java 复制代码
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPClient {
    public static void main(String[] args) {
        String server = "localhost";
        int port = 8080;

        try (DatagramSocket socket = new DatagramSocket()) {
            byte[] buffer = "你好,UDP服务器!".getBytes();
            
            InetAddress address = InetAddress.getByName(server);
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, port);
            
            socket.send(packet);
            System.out.println("UDP消息已发送");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行步骤:

  1. 先运行服务器端程序,监听端口。
  2. 再运行客户端程序,发送消息。
  3. 服务器端输出接收到的消息。

五、使用HttpURLConnection发送HTTP请求

HttpURLConnection类用于在Java中实现HTTP请求,可用于调用REST API或抓取网页数据。

1. GET请求示例

java 复制代码
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpGetExample {
    public static void main(String[] args) {
        try {
            URL url = new URL("https://jsonplaceholder.typicode.com/posts/1");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            
            connection.setRequestMethod("GET");

            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String line;
            StringBuilder response = new StringBuilder();
            
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
            reader.close();
            
            System.out.println("响应数据: " + response.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

输出示例:

json 复制代码
{
  "userId": 1,
  "id": 1,
  "title": "sunt aut facere repellat",
  "body": "quia et suscipit..."
}

六、网络编程中的常见问题与解决方案

1. 端口占用问题

  • 运行程序时若端口被占用,需手动释放或选择其他端口。

2. 网络延迟与超时

  • 设置Socket超时:
java 复制代码
socket.setSoTimeout(5000);  // 设置超时时间为5秒

3. 防止粘包与拆包

  • TCP可能出现粘包或拆包问题,可通过BufferedReader读取一行数据或使用分隔符处理。
相关推荐
冰敷逆向1 天前
京东h5st纯算分析
java·前端·javascript·爬虫·安全·web
vortex51 天前
Alpine Linux syslinux 启动加固(密码保护)
linux·服务器·网络
晚风吹长发1 天前
初步了解Linux中的线程同步问题及线程安全和死锁与生产消费者模型
linux·运维·服务器·开发语言·数据结构·安全
学嵌入式的小杨同学1 天前
【Linux 封神之路】进程进阶实战:fork/vfork/exec 函数族 + 作业实现(含僵尸进程解决方案)
linux·开发语言·vscode·嵌入式硬件·vim·软件工程·ux
fengfuyao9851 天前
基于MATLAB/Simulink的车辆自适应巡航控制(ACC)实现
开发语言·matlab
海盗12341 天前
WPF上位机组件开发-设备状态运行图基础版
开发语言·c#·wpf
看我干嘛!1 天前
python第四次作业
开发语言·python
Coder_preston1 天前
Java集合框架详解
java·开发语言
多多*1 天前
2026年最新 测试开发工程师相关 Linux相关知识点
java·开发语言·javascript·算法·spring·java-ee·maven
树码小子1 天前
SpringIoC & DI (1):IOC介绍 & Spring IoC使用 & DI
java·后端·spring