1.UDP的编程
Class DatagramSocket
- java.lang.Object
-
- java.net.DatagramSocket
DatagramSocket(int port)
构造数据报套接字并将其绑定到本地主机上的指定端口。
DatagramSocket(int port, InetAddress laddr)
创建一个数据报套接字,绑定到指定的本地地址。
Class DatagramPacket
- java.lang.Object
-
- java.net.DatagramPacket
DatagramPacket(byte[] buf, int length)
构造一个
DatagramPacket
用于接收长度的数据包
length
。
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
构造用于发送长度的分组的数据报包
length
指定主机上到指定的端口号。
DatagramPacket(byte[] buf, int length, SocketAddress address)
构造用于发送长度的分组的数据报包
length
指定主机上到指定的端口号。
我们来模拟一下短信的发送和接收:
package UDP;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
*
* 服务端
* 1、创建服务端 +端口
* 2、准备接受容器
* 3、封装成 包
* 4、接受数据
* 5、分析数据
* 6、释放
*
* @author Wang
*
*/
public class MyServer {
public static void main(String[] args) throws IOException {
//1、创建服务端 +端口 设置端口号为8888
DatagramSocket server = new DatagramSocket(8888);
//2、准备接受容器
byte[] container = new byte[1024];
//3、封装成 包 DatagramPacket(byte[] buf, int length)
DatagramPacket packet = new DatagramPacket(container,container.length);
//4、接受数据
server.receive(packet);
//处理数据
byte[] data = packet.getData();
int length = packet.getLength();
System.out.println(new String(data,0,length));
//释放资源
server.close();
}
}
package UDP;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketException;
/**
* 客户端
* 1、创建客户端 +端口
* 2、准备数据
* 3、打包(发送的地点 及端口)
* 4、发送
* 5、释放
*
* @author Wang
*
*/
//他和服务器端的步骤基本是一致的
public class MyClient {
public static void main(String[] args) throws IOException {
//1、创建客户端 +端口
DatagramSocket client = new DatagramSocket(111);
//2、准备数据 我们来一个字符串
String message = "我就是想变得更强";
//我们还要将字符串转变为byte数组才能发送
byte[] info = message.getBytes();
//打包(发送的地点 及端口) //我们用这个构造器的原因就是因为InetAddress他没有构造器 不能直接创键对象
DatagramPacket packet = new DatagramPacket(info,info.length,new InetSocketAddress("localhost",8888));
//4、发送
client.send(packet);
//5、释放
client.close();
}
}
我们在这里来写一个可以保存数据类型的传输;
/**
*
* 我们来写一个 可以传输数据类型的
* 我们一想到保留数据的类型 如果是基本数据类型的引用类型我们就可以使用Data的流
* 如果是对象的话就使用 Object
* 我们在客户端传入数据的时候 就是准备数据阶段要把准备的数据转化为字节数组 在这里我们利用上面的流把他们的数据类型也封装到里面
*
* @author Wang
*
*/
/**
*
* 我们在服务器端只需要把从包里读出来的数据把他转化为相应的类型就OK
* 就是在数据处理那一步改一下就行了
*
* @author Wang
*
*/
package UDP;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
/**
*
* 我们来写一个 可以传输数据类型的
* 我们一想到保留数据的类型 如果是基本数据类型的引用类型我们就可以使用Data的流
* 如果是对象的话就使用 Object
* 我们在客户端传入数据的时候 就是准备数据阶段要把准备的数据转化为字节数组 在这里我们利用上面的流把他们的数据类型也封装到里面
*
* @author Wang
*
*/
public class Client01 {
public static void main(String[] args) throws IOException {
//1、创建客户端 +端口
DatagramSocket client = new DatagramSocket(111);
//2、准备数据 我们来一个字符串
double num = 99.9;
//我们还要将字符串转变为byte数组才能发送
byte[] info = convert(num);
//打包(发送的地点 及端口) //我们用这个构造器的原因就是因为InetAddress他没有构造器 不能直接创键对象
DatagramPacket packet = new DatagramPacket(info,info.length,new InetSocketAddress("localhost",8888));
//4、发送
client.send(packet);
//5、释放
client.close();
}
public static byte[] convert(double num) throws IOException {
byte[] data = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.writeDouble(num);
dos.flush();
data = baos.toByteArray();//注意这里获取写入数据的方法 baos.toByteArray()
dos.close();
return data;
}
}
package UDP;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
*
* 我们在服务器端只需要把从包里读出来的数据把他转化为相应的类型就OK
* 就是在数据处理那一步改一下就行了
*
* @author Wang
*
*/
public class Server01 {
public static void main(String[] args) throws IOException {
//1、创建服务端 +端口 设置端口号为8888
DatagramSocket server = new DatagramSocket(8888);
//2、准备接受容器
byte[] container = new byte[1024];
//3、封装成 包 DatagramPacket(byte[] buf, int length)
DatagramPacket packet = new DatagramPacket(container,container.length);
//4、接受数据
server.receive(packet);
//处理数据
double num = convert(packet.getData());
System.out.println(num);
//释放资源
server.close();
}
public static double convert(byte[] data) throws IOException {
ByteArrayInputStream bis = new ByteArrayInputStream(data);
DataInputStream dis = new DataInputStream(bis);
double num = dis.readDouble();
dis.close();
return num;
}
}