初学java,菜鸟笔记。
我们知道在java网络编程中的udp协议下的传输实际传送的是DatagramPacket包,而包中的内容是bytearray字节序列。如果我们要传输一个long类型的数据,必须现将long类型的数据转换为bytearray序列。我们使用的方法是jdk给我们提供的数据流和过滤流。我们首先选择数据流ByteArrayOutputStream。输入数据流中的所以数据都会以byte序列的形式保存在内存中,但显然这个流的接口功能不能满足我们的需求,我们使用过滤流DataOutputStream将其封装。因为ataOutputStream流提供了writeLong()等接口,这无疑帮我们屏蔽掉了中间的实现过程,可以通过ByteArrayOutputStream对象调用toByteArray()方法获得内存中的byte序列里的序列信息。下面上简单的代码实现。首先是服务器端的实验代码UdpTestLongClient.java。
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
public class UdpTestLongClient {
public static void main(String[] args) {
try {
//Client发送一个long类型数字给服务器Server
long num = 9854L;
//首先,要发送的数据需要装入包中,而且形式是byte序列。
//自然而然的想到了使用ByteArrayOutputStream流,因为流里的数据都是byte序列。
//然后再用DataOutputStream流包装,使用DataOutputStream流的接口往里写入long型数据。
//再使用ByteArrayOutputStream的toByteArray()方法获得byte流,将其包装起来发送。
ByteArrayOutputStream bao = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bao);
dos.writeLong(num);
DatagramPacket p1 = new DatagramPacket(bao.toByteArray(), bao.toByteArray().length,new InetSocketAddress("127.0.0.1 ", 9998));
DatagramSocket s1=new DatagramSocket(9993);
s1.send(p1);
System.out.println("数据发送完成");
} catch (IOException e) {
e.printStackTrace();
}
}
}
然后是服务器端的实验代码UdpTestLongServer.java。
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpTestLongServer {
public static void main(String[] args) throws Exception {
byte[] b1=new byte[1000];
DatagramPacket p1=new DatagramPacket(b1, b1.length);
DatagramSocket s1=new DatagramSocket(9998);
System.out.println("服务器建立完成");
int count=1;
while(true){
s1.receive(p1);
//接收到包后,将包中的byte序列使用ByteArrayInputStream包装起来,在通过过滤流DataInputStream
//的接口将其读取出来。
ByteArrayInputStream bai=new ByteArrayInputStream(p1.getData());
DataInputStream dis=new DataInputStream(bai);
Long num=dis.readLong();
System.out.println("传递来的第"+count+"个long型数组是:"+num);
}
}
}
ok。