前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用DatagramSocket发送、接收数据(Socket之UDP套接字)

使用DatagramSocket发送、接收数据(Socket之UDP套接字)

作者头像
全栈程序员站长
发布于 2022-07-01 04:52:08
发布于 2022-07-01 04:52:08
2.9K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

17.4.2 使用DatagramSocket发送、接收数据(1)

Java使用DatagramSocket代表UDP协议的Socket,DatagramSocket本身只是码头,不维护状态,不能产生IO流,它的唯一作用就是接收和发送数据报,Java使用DatagramPacket来代表数据报,DatagramSocket接收和发送的数据都是通过DatagramPacket对象完成的。

先看一下DatagramSocket的构造器。

DatagramSocket():创建一个DatagramSocket实例,并将该对象绑定到本机默认IP地址、本机所有可用端口中随机选择的某个端口。

DatagramSocket(int prot):创建一个DatagramSocket实例,并将该对象绑定到本机默认IP地址、指定端口。

DatagramSocket(int port, InetAddress laddr):创建一个DatagramSocket实例,并将该对象绑定到指定IP地址、指定端口。

通过上面三个构造器中的任意一个构造器即可创建一个DatagramSocket实例,通常在创建服务器时,创建指定端口的DatagramSocket实例–这样保证其他客户端可以将数据发送到该服务器。一旦得到了DatagramSocket实例之后,就可以通过如下两个方法来接收和发送数据。

receive(DatagramPacket p):从该DatagramSocket中接收数据报。

send(DatagramPacket p):以该DatagramSocket对象向外发送数据报。

从上面两个方法可以看出,使用DatagramSocket发送数据报时,DatagramSocket并不知道将该数据报发送到哪里,而是由DatagramPacket自身决定数据报的目的地。就像码头并不知道每个集装箱的目的地,码头只是将这些集装箱发送出去,而集装箱本身包含了该集装箱的目的地。

下面看一下DatagramPacket的构造器。

DatagramPacket(byte[] buf,int length):以一个空数组来创建DatagramPacket对象,该对象的作用是接收DatagramSocket中的数据。

DatagramPacket(byte[] buf, int length, InetAddress addr, int port):以一个包含数据的数组来创建DatagramPacket对象,创建该DatagramPacket对象时还指定了IP地址和端口–这就决定了该数据报的目的地。

DatagramPacket(byte[] buf, int offset, int length):以一个空数组来创建DatagramPacket对象,并指定接收到的数据放入buf数组中时从offset开始,最多放length个字节。

DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port):创建一个用于发送的DatagramPacket对象,指定发送buf数组中从offset开始,总共length个字节。

当Client/Server程序使用UDP协议时,实际上并没有明显的服务器端和客户端,因为两方都需要先建立一个DatagramSocket对象,用来接收或发送数据报,然后使用DatagramPacket对象作为传输数据的载体。通常固定IP地址、固定端口的DatagramSocket对象所在的程序被称为服务器,因为该DatagramSocket可以主动接收客户端数据。

在接收数据之前,应该采用上面的第一个或第三个构造器生成一个DatagramPacket对象,给出接收数据的字节数组及其长度。然后调用DatagramSocket 的receive()方法等待数据报的到来,receive()将一直等待(该方法会阻塞调用该方法的线程),直到收到一个数据报为止。如下代码所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  // 创建一个接收数据的DatagramPacket对象 
  
  DatagramPacket packet=new DatagramPacket(buf, 256); 
  
  // 接收数据报 
  
  socket.receive(packet); 

在发送数据之前,调用第二个或第四个构造器创建DatagramPacket对象,此时的字节数组里存放了想发送的数据。除此之外,还要给出完整的目的地址,包括IP地址和端口号。发送数据是通过DatagramSocket的send()方法实现的,send()方法根据数据报的目的地址来寻径以传送数据报。如下代码所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  // 创建一个发送数据的DatagramPacket对象 
  
  DatagramPacket packet = new DatagramPacket(buf, length, address, port); 
  
  // 发送数据报 
  
  socket.send(packet); 

使用DatagramPacket接收数据时,会感觉DatagramPacket设计得过于烦琐。开发者只关心该DatagramPacket能放多少数据,而DatagramPacket是否采用字节数组来存储数据完全不想关心。但Java要求创建接收数据用的DatagramPacket时,必须传入一个空的字节数组,该数组的长度决定了该DatagramPacket能放多少数据,这实际上暴露了DatagramPacket的实现细节。接着DatagramPacket又提供了一个getData()方法,该方法又可以返回Datagram Packet对象里封装的字节数组,该方法更显得有些多余–如果程序需要获取DatagramPacket里封装的字节数组,直接访问传给 DatagramPacket构造器的字节数组实参即可,无须调用该方法。

当服务器端(也可以是客户端)接收到一个DatagramPacket对象后,如果想向该数据报的发送者”反馈”一些信息,但由于UDP协议是面向非连接的,所以接收者并不知道每个数据报由谁发送过来,但程序可以调用DatagramPacket的如下3个方法来获取发送者的IP地址和端口。

InetAddress getAddress():当程序准备发送此数据报时,该方法返回此数据报的目标机器的IP地址;当程序刚接收到一个数据报时,该方法返回该数据报的发送主机的IP地址。

int getPort():当程序准备发送此数据报时,该方法返回此数据报的目标机器的端口;当程序刚接收到一个数据报时,该方法返回该数据报的发送主机的端口。

SocketAddress getSocketAddress():当程序准备发送此数据报时,该方法返回此数据报的目标SocketAddress;当程序刚接收到一个数据报时,该方法返回该数据报的发送主机的SocketAddress。

getSocketAddress()方法的返回值是一个SocketAddress对象,该对象实际上就是一个IP地址和一个端口号。也就是说,SocketAddress对象封装了一个InetAddress对象和一个代表端口的整数,所以使用SocketAddress对象可以同时代表IP地址和端口。

17.4.2 使用DatagramSocket发送、接收数据(2)

下面程序使用DatagramSocket实现了Server/Client结构的网络通信。本程序的服务器端使用循环1000次来读取DatagramSocket中的数据报,每当读取到内容之后便向该数据报的发送者送回一条信息。服务器端程序代码如下。

程序清单:codes\17\17.4\UdpServer.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  public class UdpServer 
  
  { 
  
   public static final int PORT = 30000; 
  
   // 定义每个数据报的最大大小为4KB 
  
   private static final int DATA_LEN = 4096; 
  
   // 定义接收网络数据的字节数组 
  
   byte[] inBuff = new byte[DATA_LEN]; 
  
   // 以指定字节数组创建准备接收数据的DatagramPacket对象 
  
   private DatagramPacket inPacket = 
  
   new DatagramPacket(inBuff , inBuff.length); 
  
   // 定义一个用于发送的DatagramPacket对象 
  
   private DatagramPacket outPacket; 
  
   // 定义一个字符串数组,服务器端发送该数组的元素 
  
   String[] books = new String[] 
  
   { 
  
   "疯狂Java讲义", 
  
   "轻量级Java EE企业应用实战", 
  
   "疯狂Android讲义", 
  
   "疯狂Ajax讲义" 
  
   }; 
  
   public void init()throws IOException 
  
   { 
  
   try( 
  
   // 创建DatagramSocket对象 
  
   DatagramSocket socket = new DatagramSocket(PORT)) 
  
   { 
  
   // 采用循环接收数据 
  
   for (int i = 0; i < 1000 ; i++ ) 
  
   { 
  
   // 读取Socket中的数据,读到的数据放入inPacket封装的数组里 
  
   socket.receive(inPacket); 
  
   // 判断inPacket.getData()和inBuff是否是同一个数组 
  
   System.out.println(inBuff == inPacket.getData()); 
  
   // 将接收到的内容转换成字符串后输出 
  
   System.out.println(new String(inBuff 
  
   , 0 , inPacket.getLength())); 
  
   // 从字符串数组中取出一个元素作为发送数据 
  
   byte[] sendData = books[i % 4].getBytes(); 
  
   // 以指定的字节数组作为发送数据,以刚接收到的DatagramPacket的 
  
   // 源SocketAddress作为目标SocketAddress创建DatagramPacket 
  
   outPacket = new DatagramPacket(sendData 
  
   , sendData.length , inPacket.getSocketAddress()); 
  
   // 发送数据 
  
   socket.send(outPacket); 
  
   } 
  
   } 
  
   } 
  
   public static void main(String[] args) 
  
   throws IOException 
  
   { 
  
   new UdpServer().init(); 
  
   } 
  
  } 

上面程序中的粗体字代码就是使用DatagramSocket发送、接收DatagramPacket的关键代码,该程序可以接收1000个客户端发送过来的数据。

客户端程序代码也与此类似,客户端采用循环不断地读取用户键盘输入,每当读取到用户输入的内容后就将该内容封装成DatagramPacket数据报,再将该数据报发送出去;接着把DatagramSocket中的数据读入接收用的DatagramPacket中(实际上是读入该DatagramPacket所封装的字节数组中)。客户端程序代码如下。

17.4.2 使用DatagramSocket发送、接收数据(3)

程序清单:codes\17\17.4\UdpClient.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  public class UdpClient 
  
  { 
  
   // 定义发送数据报的目的地 
  
   public static final int DEST_PORT = 30000; 
  
   public static final String DEST_IP = "127.0.0.1"; 
  
   // 定义每个数据报的最大大小为4KB 
  
   private static final int DATA_LEN = 4096; 
  
   // 定义接收网络数据的字节数组 
  
   byte[] inBuff = new byte[DATA_LEN]; 
  
   // 以指定的字节数组创建准备接收数据的DatagramPacket对象 
  
   private DatagramPacket inPacket = 
  
   new DatagramPacket(inBuff , inBuff.length); 
  
   // 定义一个用于发送的DatagramPacket对象 
  
   private DatagramPacket outPacket = null; 
  
   public void init()throws IOException 
  
   { 
  
   try( 
  
   // 创建一个客户端DatagramSocket,使用随机端口 
  
   DatagramSocket socket = new DatagramSocket()) 
  
   { 
  
   // 初始化发送用的DatagramSocket,它包含一个长度为0的字节数组 
  
   outPacket = new DatagramPacket(new byte[0] , 0 
  
   , InetAddress.getByName(DEST_IP) , DEST_PORT); 
  
   // 创建键盘输入流 
  
   Scanner scan = new Scanner(System.in); 
  
   // 不断地读取键盘输入 
  
   while(scan.hasNextLine()) 
  
   { 
  
   // 将键盘输入的一行字符串转换成字节数组 
  
   byte[] buff = scan.nextLine().getBytes(); 
  
   // 设置发送用的DatagramPacket中的字节数据 
  
   outPacket.setData(buff); 
  
   // 发送数据报 
  
   socket.send(outPacket); 
  
   // 读取Socket中的数据,读到的数据放在inPacket所封装的字节数组中 
  
   socket.receive(inPacket); 
  
   System.out.println(new String(inBuff , 0 
  
   , inPacket.getLength())); 
  
   } 
  
   } 
  
   } 
  
   public static void main(String[] args) 
  
   throws IOException 
  
   { 
  
   new UdpClient().init(); 
  
   } 
  
  } 

上面程序中的粗体字代码同样也是使用DatagramSocket发送、接收DatagramPacket的关键代码,这些代码与服务器端代码基本相似。而客户端与服务器端的唯一区别在于:服务器端的IP地址、端口是固定的,所以客户端可以直接将该数据报发送给服务器端,而服务器端则需要根据接收到的数据报来决定”反馈”数据报的目的地。

读者可能会发现,使用DatagramSocket进行网络通信时,服务器端无须也无法保存每个客户端的状态,客户端把数据报发送到服务器端后,完全有可能立即退出。但不管客户端是否退出,服务器端都无法知道客户端的状态。

当使用UDP协议时,如果想让一个客户端发送的聊天信息被转发到其他所有的客户端则比较困难,可以考虑在服务器端使用Set集合来保存所有的客户端信息,每当接收到一个客户端的数据报之后,程序检查该数据报的源SocketAddress是否在Set集合中,如果不在就将该SocketAddress添加到该Set集合中。这样又涉及一个问题:可能有些客户端发送一个数据报之后永久性地退出了程序,但服务器端还将该客户端的SocketAddress保存在Set集合中……总之,这种方式需要处理的问题比较多,编程比较烦琐。幸好Java为UDP协议提供了MulticastSocket类,通过该类可以轻松地实现多点广播。

Socket之UDP套接字

UDP套接字:UDP套接字的使用是通过DatagramPacket类和DatagramSocket类,客户端和服务器端都是用DatagramPacket类来接收数据,使用DatagramSocket类来发送数据。

UDP客户端:也是主要执行三个步骤。

1.创建DatagramSocket实例;

2.使用DatagramSocket类的send()和receive()方法发送和接收DatagramPacket实例;

3.最后使用DatagramSocket类的close()方法销毁该套接字。

下面是例子,它主要执行三个步骤,

1.向服务器发送信息;

2.在receive()方法上最多阻塞等待3秒钟,在超时前若没有收到响应,则重发请求(最多重发5次);

3.关闭客户端。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//UDPEchoClientTimeout.java

import java.net.DatagramSocket;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.io.IOException;
import java.io.InterruptedIOException;

public class UDPEchoClientTimeout {

	private static final int TIMEOUT = 3000;   // 设置超时为3秒
	private static final int MAXTRIES = 5;     // 最大重发次数5次
	
	public static void main(String[] args) throws IOException {
	
	    if ((args.length < 2) || (args.length > 3)) { // Test for correct # of args
	      throw new IllegalArgumentException("Parameter(s): <Server> <Word> [<Port>]");
	    }
	    InetAddress serverAddress = InetAddress.getByName(args[0]); // 服务器地址
	    // Convert the argument String to bytes using the default encoding
	    //发送的信息
	    byte[] bytesToSend = args[1].getBytes();
	
	    int servPort = (args.length == 3) ? Integer.parseInt(args[2]) : 7;
	
	    DatagramSocket socket = new DatagramSocket();
	
	    socket.setSoTimeout(TIMEOUT); // 设置阻塞时间
	
	    DatagramPacket sendPacket = new DatagramPacket(bytesToSend, // 相当于将发送的信息打包
	        bytesToSend.length, serverAddress, servPort);
	
	    DatagramPacket receivePacket =                              // 相当于空的接收包
	        new DatagramPacket(new byte[bytesToSend.length], bytesToSend.length);
	
	    int tries = 0;      // Packets may be lost, so we have to keep trying
	    boolean receivedResponse = false;
	    do {
	      socket.send(sendPacket);          // 发送信息
	      try {
	        socket.receive(receivePacket); // 接收信息
	
	        if (!receivePacket.getAddress().equals(serverAddress)) {// Check source
	          throw new IOException("Received packet from an unknown source");
	        }
	        receivedResponse = true;
	      } catch (InterruptedIOException e) { // 当receive不到信息或者receive时间超过3秒时,就向服务器重发请求
	        tries += 1;
	        System.out.println("Timed out, " + (MAXTRIES - tries) + " more tries...");
	      }
	    } while ((!receivedResponse) && (tries < MAXTRIES));
	
	    if (receivedResponse) {
	      System.out.println("Received: " + new String(receivePacket.getData()));
	    } else {
	      System.out.println("No response -- giving up.");
	    }
	    socket.close();
	}
}

例子只是简单的向指定的服务器发送信息,并将发送的信息由服务器返回给指定客户端。

UDP服务器端:典型的UDP服务器要执行三个步骤,

1.创建一个指定了本地端口的DatagramSocket实例;

2.使用DatagramSocket的receive()方法接收一个来自客户端的DatagramPacket实例,而这个DatagramPacket实例在客户端创建时就包含了客户端的地址,这样我们就知道回复信息要发送到哪里了;

3.使用DatagramSocket类的send()和receive()方法来发送和接收DatagramPacket实例。

下面是例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//UDPEchoServer.java
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPEchoServer {

	private static final int ECHOMAX = 255; // 发送或接收的信息最大字节数
	
	public static void main(String[] args) throws IOException {
	
	    if (args.length != 1) { // Test for correct argument list
	      throw new IllegalArgumentException("Parameter(s): <Port>");
	    }
	
	    int servPort = Integer.parseInt(args[0]);
	
	    DatagramSocket socket = new DatagramSocket(servPort);
	    DatagramPacket packet = new DatagramPacket(new byte[ECHOMAX], ECHOMAX);
	
	    while (true) { // 不断接收来自客户端的信息及作出相应的相应
	      socket.receive(packet); // Receive packet from client
	      System.out.println("Handling client at " + packet.getAddress().getHostAddress() + " on port " + packet.getPort());
	      socket.send(packet); // 将客户端发送来的信息返回给客户端
	      packet.setLength(ECHOMAX); 
		 // 重置packet的内部长度,因为处理了接收到的信息后,数据包的内部长度将被                                                       
		 //设置为刚处理过的信息的长度,而这个长度可能比缓冲区的原始长度还要短,
		 //如果不重置,而且接收到的新信息长于这个内部长度,则超出长度的部分将会被截断,所以这点必须注意到。
	    }
	    /* NOT REACHED */
	}
}

例子只是简单地将客户端发送过来的信息再回复给客户端,服务器端会不断地receive来自客户端的信息,如果receive不到任何客户端请求,则将会进入阻塞状态,直到receive到有客户端请求位置。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/131381.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
java dategramsocket_Java使用DatagramSocket
Java使用DatagramSocket代表UDP协议的Socket,DatagramSocket本身只是码头,不维护状态,不能产生IO流,它的唯一作用就是接收和发送数据报,Java使用DatagramPacket来代表数据报,DatagramSocket接收和发送的数据都是通过DatagramPacket对象完成的。
全栈程序员站长
2022/06/27
3310
DatagramPacket与DatagramSocket 详解
  a.DatagramPacket与DatagramSocket位于java.net包中
全栈程序员站长
2022/08/18
8690
UDP 无连接上机案例3.4
张哥编程
2024/12/19
950
UDP 无连接上机案例3.4
Socket套接字(网络编程万字总结-附代码)
传输层、网络层、数据链路层、物理层 都是通过OS+硬件来提供服务的,而应用层要享受OS提供的网络服务,需要通过OS提供的服务窗口(Socket)来享受服务。
VIBE
2022/12/30
8270
Socket套接字(网络编程万字总结-附代码)
【Netty】UDP协议使用学习
TCP协议已经尽可能的支持了并发 所以大部分还是使用的TCP协议 除非网络很差的情况下使用UDP
冷环渊
2022/05/01
1.5K0
【JavaEE】网络编程socket
可靠传输/ 不可靠传输: 网络上存在的"异常情况"是非常多的,无论使用什么样的软硬件的技术手段无法100%保证网络数据能够从A一定传输到。此处谈到的"可靠传输",尽可能的完成数据传输。虽然无法确保数据到达对方,至少可以知道,当前这个数据对方是不是收到了。 此处谈到的可靠传输,主要指的是发的数据到没到,发送方能够清楚的感知到。
E绵绵
2025/03/20
1331
【JavaEE】网络编程socket
UDP网络编程
进行数据传输时,首先将传输的数据定义成数据报(Datagram),在数据报中指明数据将要到达的Socket(主机地址和端口号),然后再将数据发送出去。
拾点阳光
2018/09/28
7070
Socket和DatagramSocket的区别[通俗易懂]
DatagramSocket使用的UDP连接,客户端不需要先连接数据,可以直接发送给指定服务端。
全栈程序员站长
2022/07/01
9210
【java网络】IO编程
Prequirement 在继续阅读这篇文章之前,请务必先阅读前面这篇Java IO概述,因为Java把所有的IO都统一成流(Stream)了。 TCP/IP协议栈。知道IP、端口、DNS、Socket、URL、TCP、UDP、HTTP等网络相关知识。 IP地址: InetAddress java.net.InetAddress类是Java对IP地址(包括IPv4和IPv6)的封装。一般来说,它同时包含主机名(hostname)和IP地址。 1. 创建方式(工厂方法) public static InetA
程序员互动联盟
2018/03/16
1.4K0
Socket编程
IP(Internet Protocol),网络之间互连的协议,IP地址是区分不同计算机的唯一标识
张哥编程
2024/12/19
1370
【Java 网络编程】UDP API 简介 ( DatagramSocket | DatagramPacket )
DatagramSocket 类简介 : 负责 UDP 数据的发送和接收 , 该类没有合并到 Socket API 中 , 因为在 Socket 协议中 , 必须要存在服务器端与客户端 , 在 UDP 中 , DatagramSocket 既是服务器又是客户端 , 其不需要监听端口 , 也不需要建立连接 ;
韩曙亮
2023/03/27
4360
【JavaEE初阶】深入理解网络编程—使用UDP协议API实现回显服务器
接着上面,小编提到这里的DatagramPacket是一个输出型参数,和前面实现文件IO的操作类似的,这里的就是一个UDP数据报,是接收和发送数据的基本单位;
用户11288949
2024/10/21
1270
【JavaEE初阶】深入理解网络编程—使用UDP协议API实现回显服务器
Java Review(三十八、网络编程)
计算机网络是指两台或更多的计算机组成的网络,在同一个网络中,任意两台计算机都可以直接通信,因为所有计算机都需要遵循同一种网络协议。
三分恶
2020/07/16
9650
Java基础之UDP协议和TCP协议简介及简单案例的实现
写在前面的废话:马上要找工作了,做了一年的.net ,到要找工作了发现没几个大公司招聘.net工程师,真是坑爹呀。哎,java就java吧,咱从头开始学呗,啥也不说了,玩命撸吧,我真可怜啊。
CherishTheYouth
2019/07/30
9060
Java基础之UDP协议和TCP协议简介及简单案例的实现
网络编程——UDP编程
计算机网络是指两台或更多的计算机组成的网络,在同一个网络中,任意两台计算机都可以直接通信,因为所有计算机都需要遵循同一种网络协议。因此,为了把计算机网络接入互联网,就必须使用TCP/IP协议。
全栈程序员站长
2022/10/05
1.3K0
网络编程——UDP编程
Java 网络编程详解
TCP/IP (Transmission Control Protocol/Internet Protocol) 的简写,中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是lnternet最基本的协议、Internet国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的。
timerring
2023/05/11
8900
Java 网络编程详解
Java中利用DatagramPacket与DatagramSocket进行通讯的示例
先运行Receiver工程,正在阻塞等待接收发送方发送的消息,总共接收到了5个消息,每个消息间隔5秒钟
全栈程序员站长
2022/08/22
4030
【Java_21】TCP、UDP
一、网络编程 1. 软件架构 ① B/S * Brower / Server ---> 浏览器 / 服务器 例如:淘宝网 ② C/S * Client / Server ---> 客户端 / 服务端 例如:QQ 2. 网络通信 ① 七层模型 * 数据链路层 ---> 物理层 ---> 网络层 ---> 传输层 ---> 会话层 ---> 表现层 ---> 应用层 ② 网络通信三要素 * 通信协议(TCP、UDP):去教室的方式 * i
用户8250147
2021/02/04
5690
Java中的UDP通信
Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。与TCP协议不同,UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。在发送数据前,需要进行封包操作(使用 DatagramPacket 类),才能发送和接收数据(使用 DatagramSocket 类)。
头发还在
2023/10/16
2670
Java中的UDP通信
tcp/ip协议, http协议,socket通讯demo,socket和http的区别,socket和http优势,socket和http适用范围,流、帧、包、位的区别
  HTTP协议:简单对象访问协议,对应于应用层 ,HTTP协议是基于TCP连接的 tcp协议: 对应于传输层 ip协议: 对应于网络层   TCP/IP是传输层协议,主袭要解决数据如何在网络中传输;而HTTP是应用层协议,主要解决如何包装数据。 Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,才能使用度TCP/IP协议。
zhangjiqun
2024/12/16
3640
tcp/ip协议, http协议,socket通讯demo,socket和http的区别,socket和http优势,socket和http适用范围,流、帧、包、位的区别
推荐阅读
相关推荐
java dategramsocket_Java使用DatagramSocket
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验