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

合集下载

Android系统中的网络通信技术及应用实践

Android系统中的网络通信技术及应用实践

Android系统中的网络通信技术及应用实践Android 系统中的网络通信技术及应用实践随着互联网技术的快速发展,网络通信已经成为我们日常生活和工作中不可或缺的一部分。

而 Android 系统中的网络通信技术也在不断发展和完善,为我们提供了更便捷、高效的网络通信方式和应用实践。

一、HTTP 通信Android 系统中最常用的网络通信协议就是 HTTP 协议。

HTTP 协议是一种客户端和服务器之间进行交互的协议,可以用来传输各种类型的数据,包括文本、图像、音频、视频等等。

在 Android 应用开发中,我们经常会使用 HTTP 协议来访问服务器,获取和上传数据。

Android 系统中 HTTP 通信的实现主要是通过HttpURLConnection 和 HttpClient 这两个类来实现的。

其中HttpURLConnection 是对 HTTP/1.1 规范的一个实现,主要用于打开和连接 HTTP 连接,发送请求和接收响应。

HttpClient 则是一个开源的 HTTP 工具包,可以用来发送 HTTP 请求,从而实现与HTTP 服务器的通信。

二、WebSocket 通信除了 HTTP 协议,WebSocket 也成为了 Android 系统中的一种常见的网络通信方式。

WebSocket 是一种基于 TCP 协议的通信协议,可以在客户端与服务器之间建立持久性的连接,双方可以随时进行数据的传输和接收。

WebSocket 相对于 HTTP 协议来说,具有更高效、更实时、更稳定的特点,因此适用于实时通信应用。

在 Android 应用开发中,我们可以使用 okhttp 和 Java-WebSocket 这两个库来实现 WebSocket 通信。

okhttp 是由 Square公司开发的一款 HTTP 和 WebSocket 客户端,可以用来进行网络请求和数据传输。

Java-WebSocket 是一个用 Java 语言编写的WebSocket 客户端和服务器端实现库,具有简单易用、轻量级、跨平台的特点。

有关TCPUDP的使用例子

有关TCPUDP的使用例子

有关TCPUDP的使用例子TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是网络通信中常用的两种传输协议。

它们在应用层之下的传输层提供了不同的传输方式和特性。

下面是关于TCP和UDP的使用例子。

1.聊天应用程序TCP协议适用于需要可靠传输的应用场景,比如聊天应用程序。

用户在手机或电脑上运行聊天应用程序,发送聊天信息给其他用户。

TCP协议确保信息按照发送的顺序接收,并且在传输过程中不会受到丢包或乱序的影响。

每个聊天消息的发送和接收都通过TCP连接完成,确保信息的可靠传输。

2.文件传输TCP协议也适用于大文件传输。

例如,用户需要通过互联网将大型文件发送给其他用户。

TCP协议保证了文件在传输过程中的完整性和准确性。

它会自动检测和纠正丢失或损坏的数据包,并确保接收方和发送方之间的数据一致性。

这种方式适用于需要确保每个数据包都到达的场景,尽管传输速度可能稍慢。

3.实时流媒体UDP协议适用于实时流媒体应用程序,如在线直播或在线游戏。

UDP提供了更低的延迟和更快的传输速率,但不提供像TCP那样的可靠性和顺序性。

在直播或游戏中,用户希望能快速看到视频或游戏画面,而不必要求每个数据包都到达和按顺序排列。

这样,UDP协议的特性更适合这类应用场景。

4.DNS(域名系统)DNS是将域名解析为IP地址的系统。

UDP协议通常用于DNS查询,因为它是一种简单的请求-响应协议。

当用户在浏览器中输入一个域名时,DNS解析请求将通过UDP协议发送到DNS服务器。

UDP快速地将请求传递给服务器,并且不需要进行复杂的连接设置,因为DNS查询通常是短暂而频繁的交互。

5.游戏中的多播UDP也可以用于多播(Multicast)应用,其中一台计算机可以将数据包发送给多个接收者。

在在线游戏中,UDP协议可用于将游戏状态信息快速广播给所有玩家。

多播可以减少网络流量,因为只有一次广播就可以到达多个接收者,而不是向每个接收者发送单独的数据包。

socket套接字的概念

socket套接字的概念

socket套接字的概念套接字(socket)是网络编程中的一个重要概念,用于在不同节点之间建立通信连接,实现数据的传输和通信的实时交互。

下面我们从以下几个方面来介绍套接字的概念及其作用。

一、套接字的定义和作用套接字是一种抽象数据类型,用于表示一个网络通信的端点,可以理解为给应用程序提供了一种接口,使其能够通过网络与其他应用程序进行通信。

套接字是应用层与传输层间交互的一种方式,它提供了一种可靠的、面向连接的、双向数据传输的网络通信服务。

二、套接字的类型由于套接字在不同情况下有不同的用途,因此其类型也有所差异。

在Unix系统中,套接字一般分为以下几种类型:1. 流式套接字(SOCK_STREAM):基于TCP协议,提供面向连接的可靠数据传输服务。

它是一种面向字节流的套接字类型,可用于实现长连接。

2. 数据报套接字(SOCK_DGRAM):基于UDP协议,提供无连接的、不可靠的数据传输服务。

它是一种面向数据包的套接字类型,可用于实现短连接或者需要时间敏感的场景。

3. 原始套接字(SOCK_RAW):提供完全自由的数据包传输服务,在传输层及以下各层的数据包都可以被访问到。

它可以用于网络协议的实现及测试。

4. 信号套接字(SOCK_SEQPACKET):提供可靠的面向连接的数据传输服务,接收方只能够依次按短的数据包与发送方通信,保证数据的有序性。

三、套接字的编程接口套接字编程接口提供了开发人员在应用程序中使用网络通信技术的一套标准API,其主要包括以下几个方面:1. 套接字的创建和销毁:通过socket函数创建套接字,然后使用close 函数释放套接字资源。

2. 套接字的命名:使用bind函数将套接字与本地的IP地址和端口号进行绑定。

3. 套接字的连接:使用connect函数将套接字连接到远程主机的IP地址和端口号。

4. 数据的读取和写入:使用read和write函数进行数据的收发操作。

5. 套接字的监听:使用listen函数将套接字置于被动监听状态,等待远程客户端的连接请求。

datagramsocket 参数讲解

datagramsocket 参数讲解

datagramsocket 参数讲解
DatagramSocket是Java中的网络编程类,用于支持UDP协议的数据传输。

在使用DatagramSocket时,需要了解一些重要的参数。

1. 端口号
DatagramSocket绑定的端口号决定了它能够接收的数据报的来源端口。

通过调用DatagramSocket的构造方法,可以指定端口号。

如果没有指定,系统会自动分配一个空闲的端口号。

2. 缓冲区大小
DatagramSocket的缓冲区大小决定了它能够缓存的数据报的数量和大小。

通过调用DatagramSocket的setReceiveBufferSize()和setSendBufferSize()方法,可以设置接收缓冲区和发送缓冲区的大小。

3. 超时时间
DatagramSocket的超时时间用于控制接收数据报的等待时间。

如果在超时时间内没有收到数据报,将抛出SocketTimeoutException 异常。

可以通过调用DatagramSocket的setSoTimeout()方法来设置超时时间。

4. 允许广播
DatagramSocket默认不允许广播,如果需要在网络中进行广播,需要设置DatagramSocket的setBroadcast()方法为true。

5. 允许复用地址
如果需要在同一台计算机上运行多个DatagramSocket程序,需
要允许复用地址。

通过调用DatagramSocket的setReuseAddress()方法设置为true即可。

以上就是DatagramSocket中常用的参数,可以根据实际情况进行设置,以便更好地控制数据传输。

数据报套接字资料

数据报套接字资料

2017/10/28
Java网络程序设计
15
4.1.3 创建DatagramSocket对象
• 发送和接收数据包还需要发送和接收数据包的 数据报套接字,即DatagramSocket对象, DatagramSocket在本地机器端口监听是否有 数据到达或者将数据包发送出去。 • (1)public DatagramSocket( ) • 用本地机器上系统随机产 生的。这种构造方法没有指定端口号,可以用 在客户端。如果构造不成功则触发 SocketException异常。
2017/10/28 Java网络程序设计 14
4.1.2 DatagramPacket的常用方法
• (5)public void setPot( int port) • 设置要将此数据报发往的远程主机上的端口号。 • (6)public void setSocketAddress ( SocketAddress address) • 为此要将地数据报发往的远程主机的 SocketAddress(通常为IP地址+端口号)。
• 这三个类均位于包内
2017/10/28 Java网络程序设计 3
4.1 数据报套接字
• 数据报(Datagram)是网络层数据单元在介质上 传输信息的一种逻辑分组格式,它是一种在网络 中传播的、独立的、自身包含地址信息的消息, 它能否到达目的地、到达的时间、到达时内容是 否会变化不能准确地知道 • DatagramSocket本身只是码头,不维护状态,不 能产生I/O流,它的唯一作用就是接收和发送数据 报,Java使用DatagramPacket 来代表数据报, DatagramSocket接收和发送的数据都是通过 DatagramPacket对象完成的。

套接字通信过程

套接字通信过程

套接字(Socket)通信是一种网络通信协议,它允许不同的计算机或设备之间进行数据交换。

套接字通信的过程可以分为以下几个步骤:1. 建立连接:首先,双方需要通过某种方式(如TCP协议、UDP协议等)建立通信连接。

这个过程需要指定通信的端口号、IP地址等信息,以确保双方可以找到彼此并进行通信。

2. 发送数据:一旦建立了连接,就可以开始发送数据了。

发送方需要将数据打包成适当的数据格式,并通过套接字发送到对方。

这个过程需要遵循一定的数据传输协议,以确保数据能够正确地被对方接收。

3. 接收数据:对方收到数据后,会将其解包并返回给发送方。

这个过程需要保证数据的完整性,以避免数据丢失或损坏。

4. 关闭连接:当通信结束后,双方需要关闭连接以释放资源。

关闭连接的方式可以是主动断开连接,也可以是等待对方断开连接。

下面是一个简单的套接字通信过程的示例:(1)客户端程序创建一个套接字并连接到服务器。

(2)客户端程序向服务器发送一条消息,消息包含一些数据和请求。

(3)服务器接收到消息后,将其解析并执行相应的操作,然后将结果返回给客户端程序。

(4)客户端程序接收到结果后,将其打包成适当的数据格式并发送回给服务器。

(5)服务器收到消息后,将其解包并存储起来,然后关闭连接。

需要注意的是,套接字通信的过程可能会涉及到多线程、异步通信等复杂的问题,需要根据具体的应用场景和需求进行设计和实现。

此外,为了保证通信的安全性和可靠性,还需要考虑使用加密算法、身份验证、数据校验等技术手段。

总之,套接字通信是一种非常灵活和强大的网络通信方式,它可以让不同的计算机或设备之间进行高效的数据交换和协作。

在实际应用中,需要根据具体的需求和场景选择合适的套接字协议和实现方式,以确保通信的可靠性和安全性。

datagramsocket方法

datagramsocket方法

datagramsocket方法DatagramSocket类是Java中用于实现UDP套接字的类,它提供了一系列方法来实现UDP通信。

下面我会从不同角度来介绍DatagramSocket类的方法。

1. 构造方法,DatagramSocket类提供了多个构造方法,其中包括DatagramSocket()、DatagramSocket(int port)、DatagramSocket(int port, InetAddress address)等。

这些构造方法允许我们创建DatagramSocket实例,并可以指定端口和地址等参数。

2. 发送数据,DatagramSocket类提供了send()方法来发送DatagramPacket数据包。

我们可以通过创建DatagramPacket对象,然后调用DatagramSocket的send()方法来发送数据。

3. 接收数据,通过DatagramSocket类的receive()方法可以接收DatagramPacket数据包。

这个方法会阻塞直到接收到数据包。

4. 设置超时,DatagramSocket类的setSoTimeout()方法允许我们设置接收数据时的超时时间,这样可以避免无限期地等待数据到达。

5. 关闭连接,使用DatagramSocket类的close()方法可以关闭DatagramSocket实例,释放相关的资源。

6. 获取本地端口,通过getLocalPort()方法可以获取DatagramSocket实例所绑定的本地端口。

7. 获取远程地址和端口,DatagramSocket类的getInetAddress()和getPort()方法可以用来获取远程主机的地址和端口。

8. 设置广播,DatagramSocket类的setBroadcast()方法可以设置是否允许发送广播数据包。

总的来说,DatagramSocket类提供了一系列方法来实现UDP通信的各种操作,包括发送和接收数据、设置超时、关闭连接等。

datagrampacket用法

datagrampacket用法

DatagramPacket是Java中用于网络通信的一种数据包,主要应用于UDP协议的通信。

以下是DatagramPacket的主要用法:
1. 创建DatagramPacket对象:DatagramPacket类提供了两个构造函数,一个用于接收数据,一个用于发送数据。

接收数据的构造函数需要一个byte数组和一个int长度,将接收到的数据放入byte数组中,从指定的偏移量开始,最多放length个字节。

发送数据的构造函数需要一个byte数组,一个int偏移量,一个int长度,一个InetAddress 对象和一个int端口号,用于创建一个用于发送的DatagramPacket对象。

2. 设置和获取数据:DatagramPacket类提供了setData()、getData()、setLength()、getLength()、setPort()和getPort()方法,用于设置和获取数据包中的数据、长度、端口号等信息。

3. 发送和接收数据:使用DatagramSocket类的方法send()和receive(),可以将DatagramPacket对象发送到指定地址和端口的远程主机,也可以从指定端口接收来自远程主机的DatagramPacket对象。

需要注意的是,使用DatagramSocket和DatagramPacket进行网络通信时,需要先建立套接字(DatagramSocket)对象,然后使用DatagramPacket对象作为传输数据的载体。

同时,由于UDP协议是无连接的协议,因此两方都需要先建立一个DatagramSocket对象,才能进行通信。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

使用DatagramSocket发送、接收数据(Socket之UDP套接字)用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,intport):以一个包含数据的数组来创建DatagramPacket对象,创建该DatagramPacket对象时还指定了IP地址和端口--这就决定了该数据报的目的地。

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

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

当Client/Server程序使用UDP协议时,实际上并没有明显的服务器端和客户端,因为两方都需要先建立一个DatagramSocket对象,用来接收或发送数据报,然后使用DatagramPacket 对象作为传输数据的载体。

通常固定IP地址、固定端口的DatagramSocket对象所在的程序被称为服务器,因为该DatagramSocket可以主动接收客户端数据。

在接收数据之前,应该采用上面的第一个或第三个构造器生成一个DatagramPacket对象,给出接收数据的字节数组及其长度。

然后调用DatagramSocket的receive()方法等待数据报的到来,receive()将一直等待(该方法会阻塞调用该方法的线程),直到收到一个数据报为止。

如下代码所示:// 创建一个接收数据的DatagramPacket对象DatagramPacket packet=new DatagramPacket(buf, 256); // 接收数据报socket.receive(packet);在发送数据之前,调用第二个或第四个构造器创建DatagramPacket对象,此时的字节数组里存放了想发送的数据。

除此之外,还要给出完整的目的地址,包括IP地址和端口号。

发送数据是通过DatagramSocket的send()方法实现的,send()方法根据数据报的目的地址来寻径以传送数据报。

如下代码所示:// 创建一个发送数据的DatagramPacket对象DatagramPacket packet = new DatagramPacket(buf, length, address, port); // 发送数据报socket.send(packet);使用DatagramPacket接收数据时,会感觉DatagramPacket 设计得过于烦琐。

开发者只关心该DatagramPacket能放多少数据,而DatagramPacket是否采用字节数组来存储数据完全不想关心。

但Java要求创建接收数据用的DatagramPacket时,必须传入一个空的字节数组,该数组的长度决定了该DatagramPacket能放多少数据,这实际上暴露了DatagramPacket的实现细节。

接着DatagramPacket又提供了一个getData()方法,该方法又可以返回DatagramPacket对象里封装的字节数组,该方法更显得有些多余--如果程序需要获取DatagramPacket里封装的字节数组,直接访问传给DatagramPacket构造器的字节数组实参即可,无须调用该方法。

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

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

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

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

getSocketAddress()方法的返回值是一个SocketAddress对象,该对象实际上就是一个IP地址和一个端口号。

也就是说,SocketAddress对象封装了一个InetAddress对象和一个代表端口的整数,所以使用SocketAddress对象可以同时代表IP地址和端口。

/art/201203/322542.htm17.4.2 使用DatagramSocket发送、接收数据(2)下面程序使用DatagramSocket实现了Server/Client结构的网络通信。

本程序的服务器端使用循环1000次来读取DatagramSocket中的数据报,每当读取到内容之后便向该数据报的发送者送回一条信息。

服务器端程序代码如下。

程序清单:codes\17\17.4\UdpServer.javapublic 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 voidinit()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(newString(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 { newUdpServer().init(); } }上面程序中的粗体字代码就是使用DatagramSocket发送、接收DatagramPacket的关键代码,该程序可以接收1000个客户端发送过来的数据。

相关文档
最新文档