java 使用DatagramPacket在服务器和客户端上传递long型数字

    初学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。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值