Java高级特性UDP协议的Socket编程
1 DatagramPacket类和DatagramSocket类
1.1概述
1.1.1 基于TCP协议和基于UDP协议的区别
基于TCP的网络通信是安全的,双向的,再建立双向连接之后,才能通信传输数据,如带电话;
基于UDP的网络通信的只需要指明对方地址,然后将数据送出去,并不会事先建立好连接。这样的网络通信是不安全的,所以只应用在如聊天系统、咨询系统等场合下。
1.1.2 数据报
1)数据报是表示通信的一种报文类型,使用数据报进行通信时无需事先建立连接,它是基于UDP协议进行的;
2)DatagramPacket类和DatagramSocket类这两个类可以使用数据报实现通信;
3)DatagramPacket类起到容器的作用,将传输的数据封装成数据报,DatagramSocket类用于发送或接收数据报;
4)DatagramSocket类提供send()方法和receive()方法,用于通过套接字发送和接收数据报。
1.2 DatagramPacket类
1)构造方法
客户端要向外发送数据,首先必须创建一个DatagramPacket对象,再使用DatagramSocket对象发送。
DatagramPacket(byte[ ] data,int size) 构造DatagramPacket对象,封装长度为size的数据报
DatagramPacket(byte[ ] buf,int length,InetAddress address,int port) 构造DatagramPacket对象,封装长度为length的数据报并发送到指定主机的指定端口
2)常用方法
1.3 DatagramSocket类
1)构造方法
DatagramSocket类不产生输入/输出流,它的唯一作用就是发送和接收数据报。
DatagramSocket() 创建一个DatagramSocket对象,并将其与本地主机任何可用的
端口绑定
DatagramSocket(int port) 创建一个DatagramSocket对象,并将其与本地主机指定的
端口绑定
2)常用方法
void connect(InetAddress address,int port)//将当前DatagramSocket对象连接到指定地址的指定端口
void close()//关闭当前DatagramSocket对象
void disconnect()//断开当前DatagramSocket对象的连接
int getLocalPort()//获取当前DatagramSocket对象绑定的本地主机的端口号
void send(DatagramPacket dp)//发送指定数据报
void receive(DatagramPacket dp)//接收数据报。数据报是存放在DatagramPacket对象中的
2 实现客户咨询
基于UDP通信的两个端点是平等的,也就是说通信的两个程序关系是对等的,没有主次之分,甚至它们的代码都可以完全是一样的,这一点要与基于TCP协议的Socket编程区分开来。
基于UDP协议的Socket网络编程一般按照以下4个步骤进行:
1)利用DatagramPacket对象封装数据报;
2)利用DatagramSocket对象发送数据报;
3)利用DatagramSocket对象接收数据报;
4)利用DatagramPacket对象处理数据报。
模拟客户咨询功能,实现发送方发送咨询问题,接收方接收并显示发送来的咨询问题。
发送方实现步骤:
1)获取本地主机的InetAddress对象。
2)创建DatagramPacket对象,封装要发送的信息。
3)利用DatagramSocket对象将DatagramPacket对象数据发送出去。
-
public static void main(String[] args) {
-
InetAddress ia;
-
DatagramSocket ds=null;
-
try {
-
//获取指定主机IP地址
-
ia = InetAddress.getByName("localhost");
-
String str="你好,我想咨询一个问题。";
-
System.out.println("我说:" str);
-
byte[] bytes=str.getBytes();
-
//创建DatagramPacket对象,打包数据:将指定长度的数据发送到指定主机上的指定端口
-
DatagramPacket dp=new DatagramPacket(bytes, bytes.length, ia, 8880);
-
//创建DatagramSocket类,向服务器发送数据
-
ds=new DatagramSocket();
-
//发送数据
-
ds.send(dp);
-
-
//接收接收方发送的信息
-
byte[] buf=new byte[1000];
-
DatagramPacket dpReceive=new DatagramPacket(buf, 1000);
-
//接收信息
-
ds.receive(dpReceive);
-
//显示接收到的信息
-
String reply=new String(dpReceive.getData(), 0, dpReceive.getLength());
-
System.out.println(dpReceive.getAddress().getHostAddress() "说:" reply);
-
} catch (UnknownHostException e) {
-
e.printStackTrace();
-
} catch (SocketException e) {
-
e.printStackTrace();
-
} catch (IOException e) {
-
e.printStackTrace();
-
}finally{
-
ds.close();
-
}
-
-
}
接收方实现步骤:
1)创建DatagramPacket对象,准备接收封装的数据。
2)创建DatagramSocket对象,接收数据保存于DatagramPacket对象中。
3)利用DatagramPacket对象处理数据。
-
public static void main(String[] args) {
-
//创建DataPackage对象,准备接收数据包
-
byte[] bytes=new byte[1000];
-
DatagramPacket dp=new DatagramPacket(bytes, bytes.length);
-
DatagramSocket ds=null;
-
try {
-
//创建DatagramSocket对象,在指定端口上接收数据
-
ds=new DatagramSocket(8880);
-
//接收数据
-
ds.receive(dp);
-
//显示接收的数据
-
String mess=new String(dp.getData(), 0, dp.getLength());
-
System.out.println(dp.getAddress().getHostAddress() "说:" mess);
-
-
//向发送方发送响应信息
-
String reply="你好,我在,请咨询!";
-
System.out.println("我说:" reply);
-
//创建DatagramPacket对象,打包数据发送到客户端
-
DatagramPacket dpto=new DatagramPacket(reply.getBytes(), reply.getBytes().length, dp.getSocketAddress());
-
//发送数据
-
ds.send(dpto);
-
} catch (SocketException e) {
-
e.printStackTrace();
-
} catch (IOException e) {
-
e.printStackTrace();
-
}finally{
-
ds.close();
-
}
-
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfiafce
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01