• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Java高级特性UDP协议的Socket编程

武飞扬头像
杨小白学java
帮助3

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对象数据发送出去。

  1.  
    public static void main(String[] args) {
  2.  
    InetAddress ia;
  3.  
    DatagramSocket ds=null;
  4.  
    try {
  5.  
    //获取指定主机IP地址
  6.  
    ia = InetAddress.getByName("localhost");
  7.  
    String str="你好,我想咨询一个问题。";
  8.  
    System.out.println("我说:" str);
  9.  
    byte[] bytes=str.getBytes();
  10.  
    //创建DatagramPacket对象,打包数据:将指定长度的数据发送到指定主机上的指定端口
  11.  
    DatagramPacket dp=new DatagramPacket(bytes, bytes.length, ia, 8880);
  12.  
    //创建DatagramSocket类,向服务器发送数据
  13.  
    ds=new DatagramSocket();
  14.  
    //发送数据
  15.  
    ds.send(dp);
  16.  
     
  17.  
    //接收接收方发送的信息
  18.  
    byte[] buf=new byte[1000];
  19.  
    DatagramPacket dpReceive=new DatagramPacket(buf, 1000);
  20.  
    //接收信息
  21.  
    ds.receive(dpReceive);
  22.  
    //显示接收到的信息
  23.  
    String reply=new String(dpReceive.getData(), 0, dpReceive.getLength());
  24.  
    System.out.println(dpReceive.getAddress().getHostAddress() "说:" reply);
  25.  
    } catch (UnknownHostException e) {
  26.  
    e.printStackTrace();
  27.  
    } catch (SocketException e) {
  28.  
    e.printStackTrace();
  29.  
    } catch (IOException e) {
  30.  
    e.printStackTrace();
  31.  
    }finally{
  32.  
    ds.close();
  33.  
    }
  34.  
     
  35.  
    }
学新通

接收方实现步骤:

1)创建DatagramPacket对象,准备接收封装的数据。

2)创建DatagramSocket对象,接收数据保存于DatagramPacket对象中。

3)利用DatagramPacket对象处理数据。

  1.  
    public static void main(String[] args) {
  2.  
    //创建DataPackage对象,准备接收数据包
  3.  
    byte[] bytes=new byte[1000];
  4.  
    DatagramPacket dp=new DatagramPacket(bytes, bytes.length);
  5.  
    DatagramSocket ds=null;
  6.  
    try {
  7.  
    //创建DatagramSocket对象,在指定端口上接收数据
  8.  
    ds=new DatagramSocket(8880);
  9.  
    //接收数据
  10.  
    ds.receive(dp);
  11.  
    //显示接收的数据
  12.  
    String mess=new String(dp.getData(), 0, dp.getLength());
  13.  
    System.out.println(dp.getAddress().getHostAddress() "说:" mess);
  14.  
     
  15.  
    //向发送方发送响应信息
  16.  
    String reply="你好,我在,请咨询!";
  17.  
    System.out.println("我说:" reply);
  18.  
    //创建DatagramPacket对象,打包数据发送到客户端
  19.  
    DatagramPacket dpto=new DatagramPacket(reply.getBytes(), reply.getBytes().length, dp.getSocketAddress());
  20.  
    //发送数据
  21.  
    ds.send(dpto);
  22.  
    } catch (SocketException e) {
  23.  
    e.printStackTrace();
  24.  
    } catch (IOException e) {
  25.  
    e.printStackTrace();
  26.  
    }finally{
  27.  
    ds.close();
  28.  
    }
  29.  
    }
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfiafce
系列文章
更多 icon
同类精品
更多 icon
继续加载