UDP:发送端send ——DatagramSocket 对象
接受端receive——DatagramSocket 对象
import java.io.BufferedReader;
import java.io.IOException;import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import collection.InputStreamReader;
/**
* udp的发送端
* @author Administrator
* 1:建立udp的socket服务
2:将要发送的数据封装成数据包
3:通过udp的socket服务,将数据包发送出
4:关闭资源
*/
public class UDPsend {
/**
* DatagramSocket socket对象
* 构造
* DatagramSocket() 构造数据报套接字并将其绑定到本地主机上任何可用的端口。
DatagramSocket(int port) 创建数据报套接字并将其绑定到本地主机上的指定端口。
方法:
public void send(DatagramPacket p);发送数据包,参数类型为:DatagramPacket
DatagramPacket数据包对象
构造 DatagramPacket(byte[] buf, int length, InetAddress address, int port)
需要发送的数据, 发送的数据长度, 接收端ip对象, 接收端的端口号
构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
* @throws IOException
*/
public static void main(String[] args) throws IOException{
//1创建socket服务
DatagramSocket ds=new DatagramSocket(2000);
//2封装数据(打包)
byte[] data="哈哈朋友您们好e ij e ij".getBytes();
InetAddress ip=InetAddress.getByName("172.16.0.162");
DatagramPacket dp=new DatagramPacket(data,data.length,ip,10000);
//3通过DatagramSocket对象的方法发送封装好的数据
ds.send(dp);
// 4关闭资源
ds.close();
}
}
/**
* udp的接收端
* @author Administrator
*
*/
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UDPRecive {
/**构造:
* DatagramSocket(int port) ;//创建DatagramSocket接收端的对象,指定端口号
*
* 方法:
* void receive(DatagramPacket p) 从此套接字接收数据报包 ,参数类型:数据包的对象DatagramPacket
*
* DatagramPacket
* 构造
* DatagramPacket(byte[] buf, int length) 用来接收长度为 length 的数据包。
* 方法
* int getLength() 返回将要发送或接收到的数据的长度。
* InetAddress getAddress() 返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。
* int getPort() ; 返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。
* @param args
* @throws IOException
*/
public static void main(String[] arags) throws IOException{
//创建接受端DatagramSocket 的对象,指定端口
DatagramSocket ds=new DatagramSocket(10000);
//创建DatagramPacket接受数据包对象
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
//创建Socket对象的receive方法,接受数据包
ds.receive(dp);
//拆包
int length=dp.getLength();
InetAddress ip=dp.getAddress();
int port=dp.getPort();
System.out.println("发送端的ip对象"+ip+" 端口号"+port);
System.out.println("数据"+new String(buf,0,length));
//关闭资源
ds.close();
}
}
UDP实现无限聊天
/*
* 实现UDP协议 发送端
* 1. 创建数据包对象,封装数据,IP,端口号 DatagramPacket
* 2. 创建数据包Socket投递对象 DatagramSocket
* 3. 投递对象方法send发生数据包
* 4. 关闭资源
*
* 要求: 发送的数据,必须是键盘输入来的(禁止使用Scanner)
* System.in+转换流+缓冲区readerLine
* 输入一行,发送一行 循环,死循环
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UDPchatSend{
public static void main(String[] args) throws IOException{
//创建Socket服务
DatagramSocket ds=new DatagramSocket(10890);
//键盘录入
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String line=null;
while((line=br.readLine())!=null){
//创建数据包对象,封装数据,IP,端口号,datagramSocket
byte[] by=line.getBytes();
InetAddress ip=InetAddress.getByName("172.16.0.162");
DatagramPacket dp=new DatagramPacket(by,by.length,ip,20000);
//发送对象方法send发送数据包
ds.send(dp);
if("886".equals(line)){
break;
}
}
//关闭资源
ds.close();
}
}
/*
* UDP的接收端
* 1. 创建接收对象DatagramSocket , 传递端口
* 2. 创建数据包对象DatagramPacket, 接收字节数组
* 3. 接收对象DatagramSocket方法 receive接收数据包--线程阻塞效果,等着接收,如果没有发送,永久等待
* 4. 使用DatagramPacket方法,进行拆包
* 5. 关闭资源
*/
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UDPreceiveChat {
public static void main(String[] args) throws IOException{
//1创建接受端指定的DatagramSocket的对象,指定端口号
DatagramSocket ds=new DatagramSocket(10000);
//2创建DatagramPacket接受数据包对象
byte[] bu=new byte[1024];
while(true){
DatagramPacket dp=new DatagramPacket(bu,bu.length);
//3通过Socket对象的receive方法,接受数据包
ds.receive(dp);
//4拆包
int length=dp.getLength();//获取真实接受的数据的长度
int port=dp.getPort();//获取真实的端口
String ip=dp.getAddress() .getHostAddress();//获取真实ip地址
String message=new String(bu,0,length);
if("886".equals(message)){
System.out.println(".."+ip+" "+port+"下线");
break;
}else{
System.out.println(message+".."+port+".."+ip);
}
}
//关闭资源
ds.close();
}
}