首页 > 编程语言 >Java网络编程

Java网络编程

时间:2024-05-28 09:33:53浏览次数:21  
标签:DatagramPacket Java Socket 编程 网络 服务器 new out 客户端

Java网络编程是Java编程中一个非常重要的领域,它为程序员提供了构建网络应用程序的能力。在当今互联网时代,网络应用程序无处不在,从简单的客户端-服务器通信到复杂的分布式系统,Java网络编程都扮演着关键角色。

网络模型

在探讨Java网络编程之前,让我们先了解一下计算机网络的基本模型。计算机网络通常采用客户端-服务器模型或对等模型。

客户端-服务器模型是最常见的网络模型,其中服务器提供资源或服务,而客户端则请求和使用这些资源或服务。例如,当您使用Web浏览器访问网站时,浏览器就是客户端,而Web服务器则充当服务器的角色。

对等模型中,每个节点都是平等的,它们可以相互发送和接收数据,没有明确的客户端或服务器角色。这种模型常用于文件共享、即时通信等应用程序中。

网络协议

计算机网络依赖于各种协议来实现数据传输和通信。协议定义了数据在网络中的传输方式、格式和规则。Java网络编程支持多种网络协议,包括TCP/IP协议族中的TCP和UDP协议。

TCP(传输控制协议)是一种面向连接的可靠协议,它在传输数据之前需要建立连接,并提供流量控制、拥塞控制和数据重传等机制,确保数据的完整性和顺序性。TCP适用于需要可靠传输的应用程序,如文件传输、电子邮件等。

UDP(用户数据报协议)是一种无连接的不可靠协议,它直接将数据发送到目标地址,不需要建立连接。UDP通常用于需要实时性和效率的应用程序,如在线游戏、视频流等。

Socket编程

Socket是Java网络编程中最基本和最常用的概念。Socket提供了一种通用的机制,用于在应用程序之间进行双向通信。

在Java中,Socket由java.net.Socket类和java.net.ServerSocket类表示。Socket类用于客户端程序,用于与服务器建立连接并进行通信。ServerSocket类用于服务器程序,用于监听和接受来自客户端的连接请求。

下面是一个简单的TCP客户端-服务器示例:

服务器端代码:

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

public class EchoServer {
    public static void main(String[] args) {
        try {
            // 创建服务器Socket,监听8000端口
            ServerSocket serverSocket = new ServerSocket(8000);
            System.out.println("Server started, listening on port 8000");

            while (true) {
                // 等待客户端连接
                Socket clientSocket = serverSocket.accept();
                System.out.println("New client connected: " + clientSocket.getInetAddress().getHostAddress());

                // 创建输入流和输出流
                BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

                // 读取客户端发送的消息
                String message = in.readLine();
                System.out.println("Received message from client: " + message);

                // 将消息原样返回给客户端
                out.println("Echo: " + message);

                // 关闭连接
                clientSocket.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端代码:

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

public class EchoClient {
    public static void main(String[] args) {
        try {
            // 创建客户端Socket,连接到本机的8000端口
            Socket socket = new Socket("localhost", 8000);

            // 创建输入流和输出流
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

            // 向服务器发送消息
            out.println("Hello, Server!");

            // 读取服务器响应
            String response = in.readLine();
            System.out.println("Server response: " + response);

            // 关闭连接
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这个示例中,服务器程序创建一个ServerSocket对象,监听8000端口。当有新的客户端连接请求时,服务器接受连接并创建一个Socket对象,用于与客户端进行通信。

客户端程序创建一个Socket对象,并连接到本机的8000端口。然后,客户端和服务器都创建输入流和输出流,用于发送和接收数据。

在示例中,客户端向服务器发送一条"Hello, Server!"消息,服务器接收到消息后将其原样返回给客户端。最后,双方都关闭了连接。

这只是一个简单的示例,展示了如何使用Java Socket编程进行TCP通信。在实际应用中,您可以根据需求进行扩展和优化,例如实现多线程服务器、使用非阻塞I/O等。

UDP编程

除了TCP之外,Java也支持UDP协议的网络编程。与TCP不同,UDP是一种无连接的协议,数据的传输是不可靠的,但速度更快,适用于对实时性要求较高的应用程序。

在Java中,UDP编程使用java.net.DatagramSocketjava.net.DatagramPacket类。DatagramSocket用于发送和接收数据报,而DatagramPacket则封装了要发送或接收的数据。

下面是一个简单的UDP客户端-服务器示例:

服务器端代码:

import java.net.*;

public class UDPServer {
    public static void main(String[] args) {
        try {
            // 创建服务器DatagramSocket,监听9000端口
            DatagramSocket serverSocket = new DatagramSocket(9000);
            byte[] receiveData = new byte[1024];

            System.out.println("UDP Server started, listening on port 9000");

            while (true) {
                // 创建DatagramPacket用于接收数据
                DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);

                // 接收客户端发送的数据
                serverSocket.receive(receivePacket);

                // 获取客户端地址和端口
                InetAddress clientAddress = receivePacket.getAddress();
                int clientPort = receivePacket.getPort();

                // 打印接收到的数据
                String message = new String(receivePacket.getData(), 0, receivePacket.getLength());
				System.out.println("Received message from " + clientAddress.getHostAddress() + ":" + clientPort + ": " + message);
				
				// 准备回送数据
				String responseMessage = "Echo: " + message;
				byte[] sendData = responseMessage.getBytes();
				
				// 创建DatagramPacket用于发送数据
				DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, clientAddress, clientPort);
				
				// 回送数据给客户端
				serverSocket.send(sendPacket);
				}
			} catch (Exception e) {
				e.printStackTrace();
		}
	}
}

客户端代码:

import java.net.*;

public class UDPClient {
    public static void main(String[] args) {
        try {
            // 创建客户端DatagramSocket
            DatagramSocket clientSocket = new DatagramSocket();

            // 准备要发送的数据
            String message = "Hello, Server!";
            byte[] sendData = message.getBytes();

            // 创建DatagramPacket用于发送数据
            InetAddress serverAddress = InetAddress.getByName("localhost");
            int serverPort = 9000;
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverAddress, serverPort);

            // 发送数据
            clientSocket.send(sendPacket);

            // 准备接收数据
            byte[] receiveData = new byte[1024];
            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);

            // 接收服务器响应
            clientSocket.receive(receivePacket);

            // 打印服务器响应
            String response = new String(receivePacket.getData(), 0, receivePacket.getLength());
            System.out.println("Server response: " + response);

            // 关闭Socket
            clientSocket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在这个示例中,服务器程序创建一个DatagramSocket对象,用于监听9000端口。当有数据报到达时,服务器接收数据并打印出来。然后,服务器准备一个响应消息,并通过另一个DatagramPacket对象将响应发送回客户端。

客户端程序也创建一个DatagramSocket对象,用于发送和接收数据报。首先,客户端准备一个"Hello, Server!"消息,并将其封装到一个DatagramPacket对象中,然后发送到服务器的IP地址和端口。接下来,客户端等待并接收服务器的响应,最后打印出响应消息。

和TCP编程类似,这只是一个简单的UDP编程示例。在实际应用中,您可能需要考虑数据报的丢失、重复和乱序等问题,并采取相应的措施进行处理。

URL编程

除了Socket编程之外,Java还提供了对URL和URI的支持,方便程序员访问和操作网络资源。

java.net.URL类用于表示统一资源定位符(URL),它提供了访问和操作Web资源的方法。java.net.URI类则用于表示统一资源标识符(URI),它提供了解析和构造URI的方法。

下面是一个简单的示例,演示如何使用URL类访问网络资源:

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

public class URLExample {
    public static void main(String[] args) {
        try {
            // 创建URL对象
            URL url = new URL("https://www.example.com");

            // 打开URL连接
            URLConnection connection = url.openConnection();

            // 获取响应码
            int responseCode = ((HttpURLConnection) connection).getResponseCode();
            System.out.println("Response Code: " + responseCode);

            // 如果响应码为200(OK),则读取网页内容
            if (responseCode == HttpURLConnection.HTTP_OK) {
                BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String line;
                StringBuilder content = new StringBuilder();

                while ((line = reader.readLine()) != null) {
                    content.append(line);
                    content.append(System.lineSeparator());
                }

                System.out.println("Web Page Content:");
                System.out.println(content.toString());

                reader.close();
            } else {
                System.out.println("Failed to retrieve web page.");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这个示例中,我们首先创建一个URL对象,表示要访问的网址。然后,我们打开URL连接并获取响应码。如果响应码为200(OK),则表示请求成功,我们可以读取网页内容。否则,我们将打印出错误消息。

读取网页内容的过程是使用BufferedReader逐行读取InputStream,并将每一行内容追加到StringBuilder中。最后,我们打印出整个网页内容。

除了访问Web资源之外,URL类还提供了其他一些有用的方法,例如获取协议、主机名、端口号、文件路径等信息。还可以使用URLConnection类设置请求头、上传数据等。

标签:DatagramPacket,Java,Socket,编程,网络,服务器,new,out,客户端
From: https://blog.csdn.net/qq_41256535/article/details/139224076

相关文章

  • 滑动窗口-java
    主要通过单调队列来解决滑动窗口问题,得到滑动窗口中元素的最大值和最小值。目录前言一、滑动窗口二、算法思路1.滑动窗口 2.算法思路3.代码详解三、代码如下1.代码如下2.读入数据3.代码运行结果总结前言主要通过单调队列来解决滑动窗口问题,得到滑动窗口中......
  • JAVA------基础篇
    java基础1.JDKJDK:javadevelopmentkitJRE:javaruntimeenvironmentJDK包含JREjava跨平台:因为java程序运行依赖虚拟机,虚拟机需要有对应操作系统的版本,而jre中有虚拟机。当你想要在Linux系统下运行,则需要安装对应的虚拟机,及对应的jdk版本,而对应的jdk版本中的jre有对......
  • 网络安全
    一、网络安全概述在早期的互联网(也是一种计算机网络)中数据都是明文传输的,例如直接使用http协议。但由于越来越多的商业和政府的数据也都在互联网传输,直接使用明文传输,相当于让数据在网络中裸奔,而且其他可以直接窃取数据并伪造数据,特别不安全。此时,网络安全就受到重视。计算机网......
  • 《计算机网络微课堂》4-5 静态路由配置及其可能产生的路由环路问题
    ‍本节课我们介绍静态路由配置及其可能产生的路由环路问题,静态路由配置是指用户或网络管理员使用路由器的相关命令,给路由器人工配置路由表,这种人工配置方式简单,开销小,但不能及时适应网络状态(流量、拓扑等)的变化,一般只在小规模网络中。采用使用静态路由配置,可能出现以下导致产生......
  • 《计算机网络微课堂》4-4 IP数据报的发送和转发过程
    本节课我们介绍IP数据报的发送和转发过程。IP数据报的发送和转发过程包含以下两部分,一部分是主机发送IP数据报,另一部分是路由器转发IP数据报。需要说明的是为了将重点放在TCP协议站的网际层,发送和转发IP数据报的过程上,在本节课的举例中,我们将忽略使用ARP协议来获取......
  • 《计算机网络微课堂》4-3 IPv4地址
    开始讲IP地址。‍4.3.1IPv4地址概述本节课我们介绍IPv4地址的基本概念:在TCPIP体系中,IP地址是一个最基本的概念,我们必须把它弄清楚IPv4地址就是给因特网上的一台主机或路由器的每一个接口,分配一个在全世界范围内是唯一的32比特的标识符IP地址,由因特网名字和数字......
  • 《计算机网络微课堂》第四章 网络层
    4-1网络层概述从本节课开始,我们进入第4章网络层的学习。本节课我们对网络层进行概述。网络层的主要任务是实现网络互连,进而实现数据包在各网络之间的传输,如图所示。这些异构型网络,如果只是需要各自内部通信,他们只要实现各自的物理层和数据链入层即可,但是如果需要将这些异构......
  • 《计算机网络微课堂》4-2 网络层提供的两种服务
    本节课我们介绍网络层提供的两种服务,一种是面向连接的虚电路服务,另一种是无连接的数据报服务。‍我们首先来看面向连接的蓄电路服务,如图所示,这是一个小型的互联网,这是主机中的五层原理体系结构。虚电路服务的核心思想是:可靠通信,应由网络自身来保证当两台计算机进行通信时,应......
  • 《计算机网络微课堂》4-8 网际控制报文协议ICMP
    本节课我们介绍网际控制报文协议ICMP(InternetControlMessageProtocol):‍为了更有效的转发IP数据报和提高交付成功的机会,在网际层使用了网际控制报文协议ICMP主机或路由器使用ICMP协议来发送差错报告报文和询问报文ICMP报文被封装在IP数据报中发送ICMP差错报告......
  • 《计算机网络微课堂》4-7 IPv4数据报的首部格式
    本节课我们介绍IPv4数据报的首部格式,为了简单起见,之后我们将IPv4数据报简称为IP数据报,而不指出、版本号。IP数据报的首部格式及其内容是实现IP协议主要功能的基础,因此我们有必要搞清楚这部分内容,如图所示:​​这是IP数据报的首部格式,它由20字节的固定部分和最大40......