1.UDP
发送数据
-
UDP
通信原理UDP
协议是一种不可靠的网络协议,它在通信的两端各建立一个Socket
对象,但是这两个Socket
只是发送,接收对象;因此对于基于UDP
协议的通信双方而言,没有所谓的客户端和服务器的概念。Java
提供了DatagramSocket
类作为基于UDP
协议的Socket
-
UDP
发送数据- 发送数据的步骤
- 创建发送端的
Socket
对象(DatagramSocket
)DatagramSocket()
- 创建数据,并把数据打包
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
- 调用
DatagramSocket
对象的方法发送数据void send(DatagramPacket p)
- 关闭发送端
void close()
- 创建发送端的
- 发送数据的步骤
代码:
package Study09;
import java.io.IOException;
import java.net.*;
/*`UDP`发送数据
- 发送数据的步骤
- 创建发送端的Socket对象(DatagramSocket)
- 创建数据,并把数据打包
- 调用DatagramSocket对象的方法发送数据
- 关闭发送端*/
public class SendDemo {
public static void main(String[] args) throws IOException {
//- 创建发送端的Socket对象(DatagramSocket)
//DatagramSocket() 构造数据报套接字并将其绑定到本地主机上的任何可用端口。
DatagramSocket datagramSocket = new DatagramSocket();
//- 创建数据,并把数据打包
//DatagramPacket(byte[] buf, int length, InetAddress address, int port)
// 构造一个数据包,发送长度为 length的数据包到指定主机上的指定端口号。
byte[] bys = "hello,UDP,我来啦".getBytes();
// int length = bys.length;
// InetAddress address = InetAddress.getByName("10.6.9.0");
// int port = 10086;
// DatagramPacket dp = new DatagramPacket(bys,length,address,port);
DatagramPacket dp = new DatagramPacket(bys,bys.length,InetAddress.getByName("10.6.9.0"),10086);
//- 调用DatagramSocket对象的方法发送数据
//void send(DatagramPacket p) 从此套接字发送数据报包。
datagramSocket.send(dp);
//- 关闭发送端
//void close() 关闭此数据报套接字。
datagramSocket.close();
}
}
2.UDP
接收数据
接收数据的步骤
-
创建接收端的
Socket
对象(DatagramSocket
)DatagramSocket(int port)
-
创建一个数据包,用于接收数据
DatagramPacket(byte[] buf, int length)
-
调用
DatagramSocket
对象的方法接收数据void receive(DatagramPacket p)
-
解析数据包,并把数据在控制台显示
byte[] getData()
int getLength()
-
关闭接收端
void close()
代码示例:
package Study09;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/*接收数据的步骤
- 创建接收端的`Socket`对象(`DatagramSocket`)
- 创建一个数据包,用于接收数据
- 调用`DatagramSocket`对象的方法接收数据
- 解析数据包,并把数据在控制台显示
- 关闭接收端*/
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
//- 创建接收端的`Socket`对象(`DatagramSocket`)
//DatagramSocket(int port) 构造数据报套接字并将其绑定到本地主机上的指定端口。
DatagramSocket datagramSocket = new DatagramSocket(10086);
//- 创建一个数据包,用于接收数据
//DatagramPacket(byte[] buf, int length) 构造一个 DatagramPacket用于接收长度为 length数据包。
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);
//- 调用`DatagramSocket`对象的方法接收数据
//void receive(DatagramPacket p) 从此套接字接收数据报包。
datagramSocket.receive(dp);
//- 解析数据包,并把数据在控制台显示
//byte[] getData() 返回数据缓冲区。
// byte[] data = dp.getData();
// //int getLength() 返回要发送的数据的长度或接收到的数据的长度。
// int getLength = dp.getLength();
// String dataString = new String(data,0,getLength);
System.out.println("数据是:"+new String(dp.getData(),0,dp.getLength()));
//- 关闭接收端
datagramSocket.close();
}
}
3.UDP
通信程序练习
按照下面的要求实现程序
UDP
发送数据:数据来自键盘录入,直到输入的数据是886,发送数据结束UDP
接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收
代码:
//发送端
package Study10;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
/*`UDP`发送数据:数据来自键盘录入,直到输入的数据是886,发送数据结束*/
public class SendDemo {
public static void main(String[] args) throws IOException {
//建立发送端Socket
DatagramSocket ds = new DatagramSocket();
while (true){
//键盘录入数据
Scanner sc = new Scanner(System.in);
String dataString = sc.nextLine();
byte[] bys = dataString.getBytes();
//打包数据
DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("10.6.9.0"),10086);
//发送数据
ds.send(dp);
//结束循环
if (dataString.equals("886")){
break;
}
}
ds.close();
}
}
//接收端
package Study10;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/*`UDP`接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收*/
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
//创建接收端Socket
DatagramSocket ds = new DatagramSocket(10086);
//死循环接收数据
while (true) {
//创建接收包数据
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);
//接收数据
ds.receive(dp);
//解析数据并在控制台输出数据
byte[] bytes = dp.getData();
String dataString = new String(bytes,0,dp.getLength());
System.out.println("数据是:"+dataString);
// if (dataString.equals("886")){
// ds.close();
// break;
// }
}
}
}