最新版 Java 网络编程|万字笔记

01 理解 OSI 和 TCP/IP 参考模型

1. OSI 参考模型

OSI(Open Systems Interconnection)参考模型是由国际标准化组织(ISO)开发的七层网络框架,用于标准化计算机通信功能。它从物理层到应用层逐层定义了网络通信的各个方面。

  1. 应用层(Application Layer):提供直接服务给用户的应用程序,如HTTP、FTP、SMTP等。
  2. 表示层(Presentation Layer):处理数据的格式和加密,确保发送端和接收端的数据格式一致。
  3. 会话层(Session Layer):管理和控制会话,包括建立、管理和终止会话。
  4. 传输层(Transport Layer):提供端到端的通信服务,确保数据传输的可靠性和顺序性(如TCP)。
  5. 网络层(Network Layer):处理数据包的路由和转发,如IP协议。
  6. 数据链路层(Data Link Layer):负责节点之间的数据传输和错误检测,如以太网。
  7. 物理层(Physical Layer):定义物理传输介质的特性,如电缆、光纤等。

2. TCP/IP 参考模型

TCP/IP参考模型是用于互联网的网络协议栈,由四个层次组成:

  1. 应用层:包括所有高层协议,如HTTP、FTP、SMTP等。
  2. 传输层:主要是TCP和UDP,负责数据的传输。
  3. 网络层(Internet Layer):处理数据包的路由,如IP协议。
  4. 网络接口层(Link Layer):与OSI模型的数据链路层和物理层类似,处理硬件级别的数据传输。

3. 代码案例

下面是一个简单的Java程序,展示了如何使用TCP/IP协议进行基本的客户端-服务器通信。这个案例将包括一个简单的服务器和客户端。

3.1 服务器端
import java.io.*;
import java.net.*;

public class SimpleServer {
   
    public static void main(String[] args) {
   
        try (ServerSocket serverSocket = new ServerSocket(8080)) {
   
            System.out.println("Server is listening on port 8080");
            
            while (true) {
   
                Socket clientSocket = serverSocket.accept();
                System.out.println("Client connected: " + clientSocket.getInetAddress().getHostAddress());
                
                // 获取输入流来读取客户端消息
                BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                String inputLine;
                
                // 读取并打印客户端消息
                while ((inputLine = in.readLine()) != null) {
   
                    System.out.println("Received: " + inputLine);
                    if ("exit".equals(inputLine)) {
   
                        break;
                    }
                }
                
                // 关闭连接
                clientSocket.close();
            }
        } catch (IOException e) {
   
            System.out.println("Exception caught when trying to listen on port " + 8080 + " or listening for a connection");
            System.out.println(e.getMessage());
        }
    }
}
3.2 客户端
import java.io.*;
import java.net.*;

public class SimpleClient {
   
    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()));
             BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in))) {
   
            
            String userInput;
            System.out.println("Connected to server. Type 'exit' to end the connection.");
            
            // 读取用户输入并发送到服务器
            while ((userInput = stdIn.readLine()) != null) {
   
                out.println(userInput);
                if ("exit".equals(userInput)) {
   
                    break;
                }
            }
            
        } catch (UnknownHostException e) {
   
            System.out.println("UnknownHostException: " + e.getMessage());
        } catch (IOException e) {
   
            System.out.println("IOException: " + e.getMessage());
        }
    }
}
3.3 代码解读
  • 服务器端
    • 使用 ServerSocket 监听 8080 端口。
    • 接受客户端连接后,使用 BufferedReader 读取客户端发送的消息。
    • 当接收到"exit"消息时,关闭连接。
  • 客户端
    • 连接到本地的 8080 端口。
    • 使用 PrintWriter 向服务器发送消息。
    • 使用 BufferedReader 读取用户输入并发送到服务器。
    • 当用户输入"exit"时,关闭连接。

这个例子展示了如何在 Java 中实现基本的网络通信,涉及到了 TCP/IP 模型中的传输层和应用层。通过这种方式,你可以理解网络通信的基本原理,并进一步扩展到更复杂的网络应用。

02 理解端口号

理解端口号原理的形象例子可以类比为一个大型的邮局或物流中心:

1. 端口号原理类比

想象一个超大型的邮局,这个邮局不仅处理普通邮件,还处理各种类型的包裹和货物。邮局有多个不同的部门,每个部门负责处理不同类型的邮件或货物。

  • 邮局:可以看作是你的计算机或服务器。
  • 邮箱地址:相当于 IP 地址,指出邮局的位置。
  • 部门:每个部门有不同的编号,这就是端口号。

2. 形象例子

  1. 邮局(计算机)
    • 这个邮局(你的计算机)每天处理大量的邮件和货物。
  2. 部门(端口号)
    • 部门 100(端口 100):专门处理报纸订阅。
    • 部门 80(端口 80):负责处理网站浏览请求。
    • 部门 25(端口 25):专门处理电子邮件。
    • 部门 3306(端口 3306):负责数据库连接。
  3. 邮件处理
    • 当你(客户端)发送一个请求(邮件)到这个邮局,你需要指定你想要这个邮件送到哪个部门(端口号)。
    • 例如,你想浏览一个网站,你的请求会标记为送到部门 80(HTTP 服务)。
  4. 内部处理
    • 邮局内部的工作人员(操作系统)看到邮件上的部门编号(端口号),然后将邮件(数据包)转发到相应的部门。
    • 每个部门(应用程序或服务)都有自己的处理方式。

3. 具体场景

  • 访问网站
    • 你打开浏览器访问一个网站(如www.example.com),你的请求会指定到端口80(默认HTTP端口)。
    • 服务器接收到这个请求后,知道这是要给网站浏览部门处理的。
  • 发送邮件
    • 你用邮件客户端发送一封电子邮件,邮件客户端会将邮件发送到邮局的部门25(SMTP端口)。
  • 数据库连接
    • 你的应用程序需要连接到数据库,它会尝试连接到邮局的部门3306(MySQL默认端口)。

4. 代码案例

在编程中,端口号的使用类似于:

// 创建一个服务器监听在端口8080
ServerSocket serverSocket = new ServerSocket(8080);

// 客户端连接到服务器的特定端口
<
  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江帅帅

“ 能吃个烧鸡腿么 ”

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值