黑马程序员技术交流社区
标题:
UDP 发送接受消息
[打印本页]
作者:
fmi110
时间:
2015-8-11 17:00
标题:
UDP 发送接受消息
UDP
/*
UDP:User Datagram protocol 用户数据报协议
特点:将数据和源和目的封装成数据包,不需要建立连接
每个数据的大小限制在64k
不需要建立连接,速度快
是不可靠传输协议
Socket:
Socket就是为网络服务提供的一种机制。通信的两端都有Socket.
网络通信其实就是两个Socket建的通信,数据在两个Socket间通过IO传输
UDP传输:
DatagramSocket(用来发送和接收数据包的套接字)
DatagramPacket(数据报包)
流程:
1 建立udp的socket服务
2 将发送数据封装至DatagramPacket
3 通过udp的Socket服务将包发送出去
4 关闭服务
*/
/*
DatagramSocket:
构造方法:
DatagramSocket(int port); 绑定本地端口
DatagramSocket(int port,InetAddress addr); 绑定本地端口 和 本地ip 地址
DatagramSocket(SocketAddress addr); 绑定本地SocketAddress地址(ip地址和端口)
InetSocketAddress(InetAddress addr, int port);根据 IP 地址和端口号创建套接字地址
方法:
bind(SocketAddress addr); //绑定地址和端口
close();
connect(InetAddress addr,int port);
connect(SocketAddress addr);
disconnect(); //断开连接
boolean isBound(); 是否绑定
boolean isClose();
boolean isConnected();
receive(DatagramPacket p); 从此套接字接收数据包
send(DatagramPacket p); 从此套接字发送数据包
DatagramPacket
构造函数:
DatagramPacket(byte[] buf, int length)
构造 DatagramPacket,用来接收长度为 length 的数据包
DatagramPacket(byte[] buf,int offset,int len,InetAddress addr,int port);
构造数据包,长度为len,目的主机时 addr ,端口号是 port
DatagramPacket(byte[] buf,int offset,int len,SocketAddress saddr);
构造数据包,长度为len,目的主机时 saddr
方法:
InetAddress getAddress();
byte[] getData(); 返回数据包内的数据
void setData(byte[] buf); 设置数据包的数据信息
int getPort(); 返回远程主机的端口号
setAddress();
setPort();
setSocketAddress();
*/
import java.net.*;
class UdpSendDemo
{
public static void main(String[] args) throws Exception
{
//1 建立DatagramSocket,并指定端口
DatagramSocket dss = new DatagramSocket(9999);
//2 建立数据包,并将发送数据装包
String msg = "我是发送包,叮叮叮。。。";
byte[] buf = msg.getBytes();
DatagramPacket dp =
new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.31.248"),10000);
//3 发送数据包
// dss.send(dp);
// buf = ("发送数据的长度:"+buf.length).getBytes();
// dp.setData(buf,0,buf.length);
dss.send(dp);
//4 关闭服务
dss.close();
System.out.println("Hello World!");
}
}
class UdpReceiveDemo
{
public static void main(String[] args) throws Exception
{
DatagramSocket ds = new DatagramSocket(10000);
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
ds.receive(dp);//阻塞式
String ip = dp.getAddress().getHostAddress(); //获取发送包的主机的地址
String name = dp.getAddress().getHostName();//获取远端主机名
int port = dp.getPort();
int len = dp.getLength();//获取接受到的数据的长度
byte[] buf1 = dp.getData();//获取信息
System.out.println("自动创建的缓冲数组的长度:"+buf1.length);
String msg = new String(buf,0,dp.getLength());
System.out.println("远端主机:"+name+": "+ip+" :"+msg+" port: "+port+" length: "+len);
ds.close();
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2