目录

编程自学指南java程序设计开发,网络编程基础,TCP编程,UDP编程,HTTP客户端开发

编程自学指南:java程序设计开发,网络编程基础,TCP编程,UDP编程,HTTP客户端开发

编程自学指南:java程序设计开发,网络编程基础

学习目标

  1. 理解网络协议(TCP/IP、UDP)的核心概念
  2. 掌握Socket编程实现客户端与服务端通信
  3. 能够通过多线程处理并发网络请求
  4. 开发简单的网络应用(如聊天程序、文件传输工具)

一、课程引入

1.1 网络编程的应用场景

  • 实时通信 :聊天软件、视频会议
  • 数据传输 :文件下载、云存储
  • 远程控制 :物联网设备管理、服务器监控

1.2 核心概念

  • IP地址 :设备的唯一标识(如 192.168.1.1

  • 端口号 :应用程序的通信入口(0~65535)

  • TCP vs UDP

    • TCP :可靠传输(三次握手),如网页浏览、文件传输
    • UDP :高效但不可靠,如视频流、实时游戏

二、TCP编程

2.1 服务端开发步骤

  1. 创建 ServerSocket 监听端口
  2. 调用 accept() 等待客户端连接
  3. 通过输入输出流进行数据读写
  4. 关闭资源
案例1:服务端回声程序(Echo Server)
public class TCPServer {  
    public static void main(String[] args) throws IOException {  
        try (ServerSocket serverSocket = new ServerSocket(8888)) {  
            System.out.println("服务端启动,等待连接...");  
            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) {  
                System.out.println("收到客户端消息:" + inputLine);  
                out.println("【服务端响应】" + inputLine);  // 回声  
            }  
        }  
    }  
}

2.2 客户端开发步骤

  1. 创建 Socket 连接服务端
  2. 通过输入输出流通信
案例2:TCP客户端
public class TCPClient {  
    public static void main(String[] args) throws IOException {  
        try (Socket socket = new Socket("localhost", 8888)) {  
            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("服务端回复:" + in.readLine());  
            }  
        }  
    }  
}

三、UDP编程

3.1 数据报通信(DatagramSocket)

案例3:UDP消息发送与接收
// 发送端  
public class UDPSender {  
    public static void main(String[] args) throws IOException {  
        DatagramSocket socket = new DatagramSocket();  
        byte[] data = "Hello UDP".getBytes();  
        DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getByName("localhost"), 9999);  
        socket.send(packet);  
        socket.close();  
    }  
}  

// 接收端  
public class UDPReceiver {  
    public static void main(String[] args) throws IOException {  
        DatagramSocket socket = new DatagramSocket(9999);  
        byte[] buffer = new byte[1024];  
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);  
        socket.receive(packet);  
        String msg = new String(packet.getData(), 0, packet.getLength());  
        System.out.println("收到消息:" + msg);  
        socket.close();  
    }  
}

四、HTTP客户端开发

4.1 使用HttpURLConnection

案例4:获取网页内容
public class HTTPClient {  
    public static void main(String[] args) throws IOException {  
        URL url = new URL("https://www.example.com");  
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
        conn.setRequestMethod("GET");  

        try (BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {  
            String line;  
            while ((line = in.readLine()) != null) {  
                System.out.println(line);  
            }  
        }  
    }  
}

五、综合案例:多线程聊天室

5.1 服务端(支持多客户端)

public class ChatServer {  
    private static final List<Socket> clients = new ArrayList<>();  

    public static void main(String[] args) throws IOException {  
        ServerSocket serverSocket = new ServerSocket(8888);  
        System.out.println("聊天室服务端启动...");  

        while (true) {  
            Socket clientSocket = serverSocket.accept();  
            clients.add(clientSocket);  
            new Thread(() -> handleClient(clientSocket)).start();  
        }  
    }  

    private static void handleClient(Socket clientSocket) {  
        try (BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()))) {  
            String msg;  
            while ((msg = in.readLine()) != null) {  
                System.out.println("广播消息:" + msg);  
                broadcast(msg, clientSocket);  
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  

    private static void broadcast(String msg, Socket sender) {  
        for (Socket client : clients) {  
            if (client != sender) {  
                try {  
                    PrintWriter out = new PrintWriter(client.getOutputStream(), true);  
                    out.println(msg);  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
    }  
}

5.2 客户端代码(参考案例2修改)

  • 每个客户端独立线程接收服务端广播消息

六、常见错误与最佳实践

6.1 常见错误

  • 错误1:端口被占用

    new ServerSocket(8888); // 若端口已被占用抛出BindException

    错误2:未处理Socket超时

socket.setSoTimeout(5000); // 设置读取超时时间避免无限等待

6.2 最佳实践

  1. 使用try-with-resources自动关闭Socket和流

  2. TCP场景选择

    • 需可靠传输 → TCP(如文件传输)
    • 需低延迟 → UDP(如实时游戏)
  3. 多线程优化 :使用线程池(如 ExecutorService )管理客户端连接


七、总结与练习

7.1 总结

  • TCP编程 :可靠传输,需建立连接(三次握手)
  • UDP编程 :高效但不可靠,适合实时场景
  • HTTP客户端 :通过URLConnection访问Web服务

7.2 课后任务

  1. 实现一个TCP文件传输工具(客户端发送文件,服务端保存)
  2. 用UDP协议实现简单的时间服务器(客户端请求时间,服务端返回当前时间)
  3. 预习下一节课:反射与注解

7.3 扩展挑战

  • 基于WebSocket实现实时聊天程序(可借助Java EE或Spring框架)