Java网络编程

发布于:2024-06-20 ⋅ 阅读:(150) ⋅ 点赞:(0)

引言

网络编程是Java编程的重要组成部分,它允许开发者编写分布式应用程序,实现计算机之间的信息交换。Java的网络编程库提供了丰富的类和方法来处理网络通信。本文将详细介绍Java网络编程的基础知识,包括TCP/IP概述、Socket编程、URL和HTTP编程、网络通信应用等内容,并通过表格进行总结和示范。

TCP/IP概述

什么是TCP/IP?

TCP/IP(传输控制协议/互联网协议)是网络通信的基础协议,包括一套规则和标准,用于在网络中进行数据传输。TCP负责保证数据的可靠传输,而IP负责数据的路由和寻址。

TCP和UDP区别

特性 TCP UDP
连接类型 面向连接 无连接
可靠性 高,保证数据准确传输 低,数据可能丢失
传输速度 较慢,因需确认和重传 较快,无需确认和重传
应用场景 文件传输、电子邮件、网页 实时视频、在线游戏、广播

Socket编程

Socket是网络编程的基础,可通过它实现设备间的双向通讯。Java的Socket类和ServerSocket类分别用于客户端和服务端编程。

使用Socket类进行TCP客户端编程

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class TCPClient {
    public static void main(String[] args) {
        try (Socket socket = new Socket("localhost", 8080);
             PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
             BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
             
            // 发送数据到服务器
            out.println("Hello Server!");
            
            // 接收服务器回传的数据
            String response = in.readLine();
            System.out.println("Server response: " + response);
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

使用ServerSocket类进行TCP服务端编程

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {
    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(8080)) {
            System.out.println("Server is listening on port 8080");
            
            while (true) {
                Socket socket = serverSocket.accept();
                new Thread(() -> handleClient(socket)).start();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void handleClient(Socket socket) {
        try (BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
             PrintWriter out = new PrintWriter(socket.getOutputStream(), true)) {
             
            String request = in.readLine();
            System.out.println("Received from client: " + request);
            out.println("Hello Client!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Socket和ServerSocket类方法表

方法 描述 示例
Socket(String host, int port) 创建一个连接到指定主机和端口的Socket new Socket("localhost", 8080);
getOutputStream() 获取输出流,用于发送数据 socket.getOutputStream();
getInputStream() 获取输入流,用于接收数据 socket.getInputStream();
close() 关闭Socket连接 socket.close();
ServerSocket(int port) 创建绑定到指定端口的ServerSocket new ServerSocket(8080);
accept() 等待客户端连接,返回客户端Socket serverSocket.accept();

URL和HTTP编程

Java提供了URLHttpURLConnection类进行HTTP协议的网络编程,方便实现Web数据的请求和响应。

URL类

URL类表示统一资源定位符,可以通过它获取网络资源。

使用URL类访问网络资源

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;

public class URLExample {
    public static void main(String[] args) {
        try {
            URL url = new URL("http://example.com");
            BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
            
            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                System.out.println(inputLine);
            }
            
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

HttpURLConnection类

HttpURLConnection类用于发送和接收HTTP请求和响应。

使用HttpURLConnection发送GET请求

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("http://example.com");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            
            int responseCode = connection.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                
                String inputLine;
                StringBuilder response = new StringBuilder();
                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                
                in.close();
                System.out.println("Response: " + response.toString());
            } else {
                System.out.println("GET request failed");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

使用HttpURLConnection发送POST请求

import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpPostExample {
    public static void main(String[] args) {
        try {
            URL url = new URL("http://example.com/api");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/json");
            connection.setDoOutput(true);
            
            String jsonInputString = "{\"name\": \"John\", \"age\": 30}";
            
            try (OutputStream os = connection.getOutputStream()) {
                byte[] input = jsonInputString.getBytes("utf-8");
                os.write(input, 0, input.length);
            }
            
            int responseCode = connection.getResponseCode();
            System.out.println("Response Code: " + responseCode);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

URL和HttpURLConnection类方法表

方法 描述 示例
openStream() 打开连接并返回输入流 url.openStream();
openConnection() 返回一个URLConnection对象,表示与URL之间的通信链接 url.openConnection();
setRequestMethod(String method) 设置请求方法(GET, POST等) connection.setRequestMethod("GET");
setRequestProperty(String key, String value) 设置请求头属性 connection.setRequestProperty("Content-Type", "application/json");
setDoOutput(boolean doOutput) 指示是否需要输出 connection.setDoOutput(true);
getResponseCode() 获取HTTP响应码 connection.getResponseCode();
getInputStream() 获取输入流,用于接收响应数据 connection.getInputStream();
getOutputStream() 获取输出流,用于发送请求数据 connection.getOutputStream();

网络通信应用

聊天应用

通过结合Socket编程,可以实现一个简单的聊天应用。服务器端接受多个客户端的连接,每个客户端发送的消息会被广播给所有连接的客户端。

服务端实现

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashSet;
import java.util.Set;

public class ChatServer {
    private static final int PORT = 12345;
    private static Set<PrintWriter> clientWriters = new HashSet<>();

    public static void main(String[] args) {
        System.out.println("Chat server started...");

        try (ServerSocket serverSocket = new ServerSocket(PORT)) {
            while (true) {
                Socket clientSocket = serverSocket.accept();
                new Thread(new ClientHandler(clientSocket)).start();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    static class ClientHandler implements Runnable {
        private Socket socket;
        private PrintWriter out;
        private BufferedReader in;

        public ClientHandler(Socket socket) {
            this.socket = socket;
        }

        @Override
        public void run() {
            try {
                in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                out = new PrintWriter(socket.getOutputStream(), true);

                // 将客户端的输出流添加到集合中,以便广播消息
                synchronized (clientWriters) {
                    clientWriters.add(out);
                }

                String message;
                while ((message = in.readLine()) != null) {
                    broadcastMessage(message);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (out != null) {
                    synchronized (clientWriters) {
                        clientWriters.remove(out);
                    }
                }
                try {
                    socket.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

        // 广播消息给所有客户端
        private void broadcastMessage(String message) {
            synchronized (clientWriters) {
                for (PrintWriter writer : clientWriters) {
                    writer.println(message);
                }
            }
        }
    }
}

客户端实现

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class ChatClient {
    private static final String SERVER_ADDRESS = "localhost";
    private static final int SERVER_PORT = 12345;

    public static void main(String[] args) {
        try (Socket socket = new Socket(SERVER_ADDRESS, SERVER_PORT);
             BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
             PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
             BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in))) {

            // 读取服务器的消息的线程
            new Thread(() -> {
                try {
                    String serverMessage;
                    while ((serverMessage = in.readLine()) != null) {
                        System.out.println("Server: " + serverMessage);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }).start();

            // 发送消息到服务器
            String userMessage;
            while ((userMessage = stdIn.readLine()) != null) {
                out.println(userMessage);
            }

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

在这个示例中,ChatServer负责接受客户端连接,并创建一个新的线程处理每个客户端。ChatClient则连接到服务器并允许用户发送和接收消息。

表格总结

TCP和UDP对比表

特性 TCP UDP
连接类型 面向连接 无连接
可靠性 高,保证数据准确传输 低,数据可能丢失
传输速度 较慢,因需确认和重传 较快,无需确认和重传
应用场景 文件传输、电子邮件、网页 实时视频、在线游戏、广播

Socket和ServerSocket类方法表

方法 描述 示例
Socket(String host, int port) 创建一个连接到指定主机和端口的Socket new Socket("localhost", 8080);
getOutputStream() 获取输出流,用于发送数据 socket.getOutputStream();
getInputStream() 获取输入流,用于接收数据 socket.getInputStream();
close() 关闭Socket连接 socket.close();
ServerSocket(int port) 创建绑定到指定端口的ServerSocket new ServerSocket(8080);
accept() 等待客户端连接,返回客户端Socket serverSocket.accept();

URL和HttpURLConnection类方法表

方法 描述 示例
openStream() 打开连接并返回输入流 url.openStream();
openConnection() 返回一个URLConnection对象,表示与URL之间的通信链接 url.openConnection();
setRequestMethod(String method) 设置请求方法(GET, POST等) connection.setRequestMethod("GET");
setRequestProperty(String key, String value) 设置请求头属性 connection.setRequestProperty("Content-Type", "application/json");
setDoOutput(boolean doOutput) 指示是否需要输出 connection.setDoOutput(true);
getResponseCode() 获取HTTP响应码 connection.getResponseCode();
getInputStream() 获取输入流,用于接收响应数据 connection.getInputStream();
getOutputStream() 获取输出流,用于发送请求数据 connection.getOutputStream();

总结

本文详细介绍了Java网络编程的基础知识,包括TCP/IP概述、Socket编程、URL与HTTP编程以及一个简单的聊天应用的实现。通过示例代码和表格总结,帮助您更好地理解和应用Java中的网络编程,提高程序的网络通信能力。


网站公告

今日签到

点亮在社区的每一天
去签到