网络通讯协议有不少种,目前应用最普遍的是TCP/IP协议(Transmission Control Protocal/Internet Protoal传输控制协议/英特网互联协议),它是一个包括TCP协议和IP协议,UDP(User Datagram Protocol)协议和其它一些协议的协议组。java
UDP是无链接通讯协议,即在数据传输时,数据的发送端和接收端不创建逻辑链接。在使用UDP协议传送数据时,因为UDP的面向无链接性,不能保证数据的完整性,所以在传输重要数据时不建议使用UDP协议。数组
TCP协议是面向链接的通讯协议,即在传输数据前先在发送端和接收端创建逻辑链接,而后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。在TCP链接中必需要明确客户端与服务器端,由客户端向服务端发出链接请求,每次链接的建立都须要通过“三次握手”。第一次握手,客户端向服务器端发出链接请求,等待服务器确认,第二次握手,服务器端向客户端回送一个响应,通知客户端收到了链接请求,第三次握手,客户端再次向服务器端发送确认信息,确认链接。因为TCP协议的面向链接特性,它能够保证传输数据的安全性,因此是一个被普遍采用的协议,例如在下载文件时,若是数据接收不完整,将会致使文件数据丢失而不能被打开,所以,下载文件时必须采用TCP协议。安全
前面介绍了UDP是一种面向无链接的协议,所以,在通讯时发送端和接收端不用创建链接。服务器
UDP通讯须要用到两个类——DatagramPacket类和DatagramSocket类。网络
DatagramPacket类用于封装UDP通讯中发送或者接收的数据。spa
DatagramPacket类会用到下面两个方法.net
DatagramPacket类——使用这个类的实例对象就能够发送和接收DatagramPacket数据包。对象
这个类用到下面的方法。blog
UDP协议就介绍到这,下面演示文字交互代码(因为只有一台电脑因此用的是本机地址)ip
发送端
package com.lty.wangluojianpanluru; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.Scanner; /* *实现UDP协议的发送端 * 实现封装数据的类java.net.DatagramPacket 将数据包装 * 实现数据传输的类java.net.DataGramPacket 将数据包发出去 * * 实现步骤: * 1.建立DatagramPacket对象,封装数据,接收的地址和端口 * 2.建立DatagramSocket * 3.调用DatagramSocket类方法send,发送数据包 * 4.关闭资源 * * DatagramPacket构造方法 * DatagramPacket(byte[] buf, int length, InetAddress address, int port) * * DatagramSocket构造方法: * DatagramSocket()空参数 * 方法: send(DatagramPacket d) * 文字交互案例思想 * 实现UDP发送,键盘输入的形式 * 输入完毕发给接收端 */ public class UDPsend { public static void main(String[] args) throws IOException{ Scanner sc=new Scanner(System.in); //建立DatagramSocket对象,数据包的发送和接收对象 DatagramSocket ds =new DatagramSocket(); //建立InetAddress对象,封装本身的IP地址 InetAddress inet=InetAddress.getByName("127.0.0.1"); while(true) { String message=sc.nextLine(); //建立数据包对象,封装要发送的数据,接收端IP,端口 byte[] date=message.getBytes(); DatagramPacket dp=new DatagramPacket(date,date.length,inet,5000); //调用ds对象的方法send,发送数据包 ds.send(dp); } // ds.close(); } }
接收端
package com.lty.wangluojianpanluru; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; /* * 实现UDP协议的接收端 * 实现封装数据的类java.net.DatagramPacket 将数据包接收 * 实现数据输出的类java.net.DataGramPacket 接收数据包 * * 实现步骤: * 1.建立DatagramSocket对象,绑定端口号 * 要和发送端端口号一致 * 2.建立字节数组,接收发来的数据 * 3.建立数据包对象DatagramPacket * 4.调用DatagramSocket对象方法 * received(DatagramPacket dp)接收数据,数据放在数据包中 * 5.拆包 * 发送的IP地址 * 数据包对象DatagramPacket方法getAddress()获取的是发送端的IP地址对象 * 返回值是InetAddress对象 * 接收到的字节个数 * 数据包对象DatagramPacket方法getLength() * 发送方的端口号 * 6.关闭资源 * *文字交互案例思想 * 实现UDP协议的接收端 * 永不停歇的接收端 * */ public class UDPReceive { public static void main(String[] args) throws IOException{ // 建立数据包传输对象DatagramSocket 绑定端口号 DatagramSocket ds=new DatagramSocket(5000); //建立字节数组 byte[] data = new byte[1024]; //建立数据包对象,传递字节数组 while(true) { DatagramPacket dp=new DatagramPacket(data,data.length); //调用ds对象的方法receive传递数据包 ds.receive(dp); //获取发送端的IP地址对象 String ip=dp.getAddress().getHostAddress(); //获取接收到的字节个数 int length = dp.getLength(); System.out.println(new String(data,0,length)+"....."+ip); } // ds.close(); } }
由于不管发送仍是接收都不可能只进行一次,因此会有死循环。