1 网络编程----UDPNo25
【Scanner scanner =new Scanner(System.in);
try {
DatagramSockets = newDatagramSocket(8888);
String line =scanner.nextLine();
byte[] bytes =line.getBytes();//把用户输入的字符串拆成字节数组
//把字节数组塞进包里,写上对方的地址和端口
try {
DatagramPacketp = new DatagramPacket(bytes, bytes.length,
InetAddress.getByName("127.0.0.1"),9999);
s.send(p);//发送包裹
s.close();
scanner.close();
DatagramSockets = new DatagramSocket(9999);
byte[] bytes = newbyte[1024];
DatagramPacket p =new DatagramPacket(bytes, bytes.length);//准备空包
s.receive(p);//接收,空包裹被填满
String str = newString(bytes,0,p.getLength()); //用字节数组的有效数据组装回字符串
System.out.println(str);
s.close();
】
2:bytes
【
DatagramSocket s =new DatagramSocket(9999);
byte[] bytes = newbyte[128];//用于存放接收数据的数组
//用于存放接收数据的空数据报包,字节数组放置其中
DatagramPacket p =new DatagramPacket(bytes, bytes.length);
s.receive(p);//接收其他收发站发来的数据,阻塞方法,收到才返回
for(int i=0;i
System.out.println(bytes[i]); //下标为0,1,2,3
}
s.close();//关闭收发站
DatagramSocket s =new DatagramSocket(8888);//在8888上建立收发站
byte[] bytes = { 1,2, 3 };//要发送的数据
//建立一个包,把要发送的数据塞进去,写上对方的地址和端口9999
DatagramPacket p =new DatagramPacket(bytes, bytes.length,
InetAddress.getByName("127.0.0.1"),9999);
s.send(p);
s.close();//关闭收发站
】
UDP UserDatagram Protocol用户数据报协议
也是传输层的一个协议,信息传输时不需要连接,不可靠,效率较高
Java进行UDP通信:
DatagramSocket相当于一个收发站(信息发送站)
构造方法:DatagramSocket(int port)在port端口上建立收发站
send(DatagramPacketp)发送数据报包
receive(DatagramPacketp)接受数据报包,阻塞方法,一旦收到对象发过来的包,这个DatagramPacket中的存放数据的字节数组就会自动填充对方发过来的信息
DatagramPacket数据报包,收发站要进行收发的包(信息接收站)
构造方法:
一、发送的包:
DatagramPacket(byte[]bytes,int len,InetAddress addr,int port)第一个参数表示字节数组形式的发送数据,第二个参数是包的长度,一般是字节数组的长度,第三个参数是接收方的地址,第四个参数接收方的端口)
二、接收的包:
DatagramPacket(byte[]bytes,int len)
第一个参数是存放接收数据的数组,第二个是接收数据的长度
getLength()获取包的有效长度
InetAddress.getByName(Stringaddress)根据字符串生成一个地址对象
getAddress()获得一个InetAddress对象,表示发送方地址,再调用这个对象的getHostAddress()获取字符串形式的地址
int getPort()获取端口号
【
DatagramSocket类:《此类表示用来发送和接收数据报包的套接字;特点:既能发送又能接收》
DatagramPacket类:《此类表示数据报包。数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。》
使用步骤:【发送端:《1、创建套接字对象 2、封装数据报包
3、发送数据报包 4、释放资源》
【接收端:《1、创建套接字对象 2、创建数据报包,用于接收数据
1、 通过receive方法接收数据并保存到数据报包中 4、释放资源》
示例代码:
发送端《
publicclass SendDemo {
public static void main(String[] args)throws Exception{
// UDP的发送端
System.out.println("UDP发送端开启.....");
// 创建Socket对象
DatagramSocket socket = newDatagramSocket();
// 创建数据报包
byte[] buf = "来自udp发送端的数据".getBytes();
DatagramPacket packet = newDatagramPacket(buf, 0, buf.length,
InetAddress.getLocalHost(),6666);
//发送数据
socket.send(packet);
//释放资源
socket.close();
System.out.println("UDP发送端关闭.....");
}
}
》
接收端《
publicclass ReceiveDemo {
public static void main(String[] args)throws Exception {
// udp接收端
System.out.println("UDP接收端开启.....");
//创建Socket对象
DatagramSocket socket = newDatagramSocket(6666);
//创建一个空的字节数组,是真正保存接收数据的容器
byte[] buf = newbyte[65536];//1024*64=65536
//创建一个空的数据报包,用于接收来自发送端的数据
DatagramPacket packet = newDatagramPacket(buf, buf.length);
//阻塞式方法,接收数据,将接收到的数据保存到指定的数据报包中
socket.receive(packet);
//从数据报包中获取数据
String ip =packet.getAddress().getHostAddress();
// packet.getData()
//接收数据
String data = new String(buf,0, buf.length);
System.out.println("接收到来自"+ip+"的数据"+data);
System.out.println("UDP接收端关闭.....");
//释放资源
socket.close();
}
}
》
】
【
publicclass UdpExercise {
public static void main(String[] args){
// TODO Auto-generated methodstub
//开启接收消息的线程
new Thread(newReceiveMsg()).start();
//开启一个发送消息的线程
new Thread(newSendMsg()).start();
}
}
//UDP接收器
class ReceiveMsg implements Runnable{
@Override
public void run() {
// TODOAuto-generated method stub
DatagramSocketsocket = null;
try {
socket =new DatagramSocket(8888);
for(;;){
byte[]buf = new byte[1024];
DatagramPacketpacket = new DatagramPacket(buf, buf.length);
socket.receive(packet);
Stringip = packet.getAddress().getHostAddress();
Stringdata = new String(buf, 0, packet.getLength());
System.out.println(ip+":"+data);
}
} catch(SocketException e) {
// TODOAuto-generated catch block
e.printStackTrace();
} catch (IOExceptione) {
// TODOAuto-generated catch block
e.printStackTrace();
}finally{
if(socket!=null){
socket.close();
socket=null;
}
}
}
}
//udp发送器
class SendMsg implements Runnable {
DatagramSocket socket = null;
@Override
public void run() {
// TODOAuto-generated method stub
try {
socket =new DatagramSocket();
BufferedReaderbr = new BufferedReader(new InputStreamReader(
System.in));
String line= null;
while((line = br.readLine()) != null) {
byte[]buf = line.getBytes();
DatagramPacketpacket = new DatagramPacket(buf, 0,
buf.length,InetAddress.getByName("192.168.95.255"),
8888);
socket.send(packet);
}
} catch (Exceptione) {
// TODOAuto-generated catch block
e.printStackTrace();
}finally{
if(socket!= null){
socket.close();
socket= null;
}
}
}
}
】