黑马程序员——学习日记8

时间:2022-12-08 21:53:22

网络编程——UDP协议

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

 UDP传输:

  发送端和接收端是两个独立运行的程序,

  两者谁先启动,有没有启动都无所谓,

  因为不需要建立连接,在我看来就像一厢情愿似的。

  既然这样也就可以用在多线程里面,而且不用同步。

  

  Socket:

  Socket就是为网络服务提供的一种机制。

  通信的两端都有Socket

  网络通信其实就是Socket间的通信

  数据在两个Socket间通过IO传输

  

  DatagramSocket类:数据包套接字类

  既能发送数据包又能接收数据包

  构造方法:

  DatagramSocket();//创建数据包套接字对象并随机绑定到本机上一个可用端口上,建议发送端使用

  DatagramSocket(int port);//创建数据包套接字对象并绑定到本机指定端口上,建议接收端使用

  常用方法:

  close();//关闭socket服务

  send(DatagramPacket dp);//发送数据包对象

  receive(DatagramPacket dp);//用数据包对象接收数据,阻塞式方法

  

  DatagramPacket类:数据包类

  构造方法:

  DatagramPacket(byte[] buf,int length);//用于接收的数据包对象

  DatagramPacket(byte[] buf,intlength,InetAddress address,int port);//用于发送的数据包对象

  常用方法:

  StringgetData();//获取具体数据内容

  InetAddress getAddress();//获取发送方的IP地址对象

  intgetPort();//获取发送方的端口号

  

  UDP发送端的建立步骤:

  1、创建UDP的socket服务,使用到DatagramSocket类的构造方法

  2、创建数据包对象,将数据的内容、接收方的IP地址对象和端口号封装进去,

     使用DatagramPacket类的构造方法

  3、通过socket服务将数据包发送出去

  4、关闭socket服务

  

  下面代码是给本机发送数据,

  因为IP地址对象里面封装的IP地址是本机的IP地址192.168.0.100,

  若是改成192.168.0.255就变成广播了,

  就是给所有192.168.0.1~192.168.0.254的IP地址发送数据。

  192.168.0.0是不能使用为IP地址的,它表示的是192.168.0.xxx这个IP地址号段。


示例:

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

public class UDPSendDemo_1 {

/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
System.out.println("发送端开启");
//1、创建UDP的socket服务,使用到DatagramSocket类的构造方法
DatagramSocket ds=new DatagramSocket();

/*
* 2、创建数据包对象,将数据内容、接收方的IP地址对象和端口号封装进去,
* 使用DatagramPacket类的构造方法
*/
String s="UDP发送端来了。。。。。";
byte[] buf=s.getBytes();
DatagramPacket dp=
new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.0.100"),10000);

//3、通过socket服务将数据包发送出去
ds.send(dp);

//4、关闭socket服务
ds.close();
}
}

 UDP接收端的建立步骤:

  1、创建UDP的socket服务,使用DatagramSocket类的构造方法,注意要指定好端口号

  2、创建数据包对象,将字节数组封装进去,用于接收传来的数据,使用DatagramPacket类的构造方法

  3、通过socket服务将数据接收到数据包对象里

  4、数据包对象对数据进行解析,获取包括具体数据内容,发送方的IP地址对象和端口号等信息

  5、关闭socket服务


示例:

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

public class UDPReceDemo_1 {

/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
System.out.println("接收端开启");
//1、创建UDP的socket服务,使用DatagramSocket类的构造方法,注意要指定好端口号
DatagramSocket ds=new DatagramSocket(10000);

//2、创建数据包对象,将字节数组封装进去,用于接收传来的数据,使用DatagramPacket类的构造方法
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);

//3、使用socket服务将数据接收到数据包对象里
ds.receive(dp);//阻塞式方法,如果没有内容发来则一直等待。

//4、数据包对象对数据进行解析,获取包括具体数据内容,发送方的IP地址对象和端口号等信息
//获取具体数据内容
byte[] strBuf=dp.getData();
String s=new String(strBuf,0,dp.getLength());
//获取ip地址对象,然后调用getHostAddress方法获取ip地址
String ip=dp.getAddress().getHostAddress();
//获取发送方的端口号
int port=dp.getPort();
System.out.println(ip+":"+port+":"+s);

//5、关闭socket服务
ds.close();
}
}

先开启接收端,在开启发送端,两个代码运行结果如下图

发送端方面:

黑马程序员——学习日记8

接收端方面:

黑马程序员——学习日记8