Skip to content

网络通信

网络通信是指通过计算机网络来交换信息的过程。在 Java 中,网络通信可以通过 TCP 和 UDP 协议实现,涉及到许多网络协议和基本概念。

网络程序设计基础

局域网与因特网

  • 局域网(LAN):指在一个小范围内的网络,通常用于一个家庭、办公室或学校等环境。局域网内的计算机通过共享设备(如交换机、路由器)连接,通信延迟较小,数据传输速度较快。
  • 因特网(Internet):是一个全球范围内的计算机网络,由许多局域网、广域网以及其他网络互联而成。因特网的规模远大于局域网,通信延迟较大,且数据传输速度不稳定。

网络协议

网络协议是计算机网络中,通信双方按照约定的规则和标准交换数据的协议。例如:

  • TCP/IP 协议:是因特网的核心协议,提供可靠的数据传输。
  • HTTP 协议:用于浏览器与服务器之间传输网页数据。
  • FTP 协议:用于文件传输。
  • DNS 协议:用于域名解析。

协议定义了数据如何封装、如何传输、如何保证数据完整性和可靠性。

端口和套接字

端口(Port):端口是网络通信中标识不同进程的数字标识符。在计算机中,每个服务或程序通过端口与其他程序进行通信。常见端口号:

  • HTTP:80
  • HTTPS:443
  • FTP:21
  • 邮件:25

套接字(Socket):是网络通信中,应用程序与操作系统之间进行数据交换的接口。通过套接字,应用程序可以访问网络中的其他主机和端口。套接字包括 IP 地址和端口号。

TCP 程序设计基础

TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的协议,确保数据按顺序传输且不会丢失。

InetAddress 类

InetAddress 类表示一个 IP 地址,它可以用来表示主机的 IP 地址或者域名。通过 InetAddress 类可以获取计算机的 IP 地址、主机名等信息。

示例:

java
import java.net.*;

public class InetAddressExample {
    public static void main(String[] args) throws UnknownHostException {
        InetAddress address = InetAddress.getByName("www.google.com");
        System.out.println("Host name: " + address.getHostName());
        System.out.println("IP address: " + address.getHostAddress());
    }
}

ServerSocket 类

ServerSocket 类用于创建一个 TCP 服务器端,监听客户端的连接请求。服务器端通过 accept() 方法接受客户端的连接。

示例:

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

public class ServerExample {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8080);  // 在端口 8080 上监听
        System.out.println("服务器正在等待连接...");

        Socket socket = serverSocket.accept();  // 等待客户端连接
        System.out.println("客户端连接成功");

        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String message = in.readLine();
        System.out.println("客户端发来消息: " + message);

        socket.close();
        serverSocket.close();
    }
}

TCP 网络程序

客户端代码:

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

public class ClientExample {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("localhost", 8080);  // 连接服务器

        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        out.println("Hello, Server!");  // 发送消息

        socket.close();
    }
}

运行顺序:

  1. 启动服务器端程序。
  2. 启动客户端程序,客户端会向服务器发送消息。
  3. 服务器接收消息并显示。

UDP 程序设计基础

UDP(用户数据报协议)是一种无连接的协议,相比 TCP,它没有保证数据可靠传输、顺序和完整性,但传输速度更快,适合实时应用。

DatagramPacket 类

DatagramPacket 类用于表示发送或接收的 UDP 数据包。它包含数据、数据的长度、目的地地址和端口号。

示例代码:

java
import java.net.*;

public class DatagramPacketExample {
    public static void main(String[] args) throws Exception {
        String message = "Hello, UDP!";
        byte[] buffer = message.getBytes();
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName("localhost"), 9876);
    }
}

DatagramSocket 类

DatagramSocket 类用于发送和接收 UDP 数据报。与 Socket 类不同,DatagramSocket 不需要建立连接。

发送端示例代码:

java
import java.net.*;

public class UDPSender {
    public static void main(String[] args) throws Exception {
        DatagramSocket socket = new DatagramSocket();
        String message = "Hello, UDP!";
        byte[] buffer = message.getBytes();
        
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName("localhost"), 9876);
        socket.send(packet);
        
        socket.close();
    }
}

接收端示例代码:

java
import java.net.*;

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

UDP 网络程序

  • UDP 发送端:使用 DatagramSocket 发送数据包到指定地址和端口。
  • UDP 接收端:使用 DatagramSocket 接收数据包并处理。
编程洪同学服务平台是一个广泛收集编程相关内容和资源,旨在满足编程爱好者和专业开发人员的需求的网站。无论您是初学者还是经验丰富的开发者,都可以在这里找到有用的信息和资料,我们将助您提升编程技能和知识。
专业开发
高端定制
售后无忧
站内资源均为本站制作或收集于互联网等平台,如有侵权,请第一时间联系本站,敬请谅解!本站资源仅限于学习与参考,严禁用于各种非法活动,否则后果自行负责,本站概不承担!