java 如何用datagramsocket 传输字符串数组

传输一个String我懂,把String转换为字符数组再传输,但是字符串数组该怎么办呢?
PS:我想把好几个字符串一次性传过去,于是想用字符串数组,但是不知道该怎么做,谢谢各位大神

可以把数组所有的字节拼装放入一个byte【】中传递。示例代码:

 public class Main {
    public static void main(String[] args) {
        String[] datas = {"hello","world","I"};
        try {
            //待发送的数据
            byte[] dataToSend = toByteArray(datas,"utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

    public static byte[] toByteArray(String[] datas,String charset) throws UnsupportedEncodingException{
        byte[] result = new byte[0];
        if(datas==null||datas.length==0){
            return result; 
        }

        if(charset==null||"".equals(charset)){
            charset = "utf-8";
        }

        //存储数组中每个元素的byte[]字节数据
        List<byte[]> list = new ArrayList<byte[]>();
        //统计字节总长度
        int length = 0;
        for(String data:datas){
            byte[] byteArray = data.getBytes(charset);
            length+=byteArray.length;
            list.add(byteArray);
        }

        //将字符数组的字符串统一放入一个byte字节数组中
        result = new byte[length];
        int index = 0;
        for(int i = 0;i<list.size();i++){
            byte[] byteArray = (byte[])list.get(i);
            int byteLength = byteArray.length;
            System.arraycopy(byteArray, 0, result, index, byteLength);
            index+=byteLength;
        }

        return result;
    }
}

UDP协议是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket,但这两个Socket之间并没有虚拟链路,这两个Socket只是发送、接收数据报的对象,Java提供了DatagramSocket对象作为基于UDP协议的Socket,使用DatagramPacket代表DatagramSocket发送、接收的数据报。
DatagramSocket本身只是码头,不维护状态,不能产生IO流,它的唯一作用就是接受和发送数据报,Java使用DatagramPacket来代表数据报,DatagramSocket接收和发送的数据都是通过DatagramPacket对象完成的。

下面是一个完整的实例,服务器可以发送一个String数组给客户端:

1.UdpServer.java

import java.net.*;
import java.io.*;

public class UdpServer
{
public static final int PORT = 30000;
// 定义每个数据报的最大大小为4K
private static final int DATA_LEN = 4096;
// 定义接收网络数据的字节数组
byte[] inBuff = new byte[DATA_LEN];
// 以指定字节数组创建准备接受数据的DatagramPacket对象
private DatagramPacket inPacket =
new DatagramPacket(inBuff , inBuff.length);
// 定义一个用于发送的DatagramPacket对象
private DatagramPacket outPacket;
// 定义一个字符串数组,服务器发送该数组的的元素
String[] books = new String[]
{
"红楼梦",
"西游记",
"水浒传",
"三国演义"
};
public void init()throws IOException
{
try(
// 创建DatagramSocket对象
DatagramSocket socket = new DatagramSocket(PORT))
{
// 采用循环接受数据
for (int i = 0; i < 1000 ; i++ )
{
// 读取Socket中的数据,读到的数据放入inPacket封装的数组里。
socket.receive(inPacket);
// 判断inPacket.getData()和inBuff是否是同一个数组
System.out.println(inBuff == inPacket.getData());
// 将接收到的内容转成字符串后输出
System.out.println(new String(inBuff
, 0 , inPacket.getLength()));
// 从字符串数组中取出一个元素作为发送的数据
byte[] sendData = books[i % 4].getBytes();
// 以指定字节数组作为发送数据、以刚接受到的DatagramPacket的
// 源SocketAddress作为目标SocketAddress创建DatagramPacket。
outPacket = new DatagramPacket(sendData
, sendData.length , inPacket.getSocketAddress());
// 发送数据
socket.send(outPacket);
}
}
}
public static void main(String[] args)
throws IOException
{
System.out.println("请按回车:");
new UdpServer().init();
}
}

2.UdpClient.java

import java.net.*;
import java.io.*;
import java.util.*;

public class UdpClient
{
// 定义发送数据报的目的地
public static final int DEST_PORT = 30000;
public static final String DEST_IP = "127.0.0.1";
// 定义每个数据报的最大大小为4K
private static final int DATA_LEN = 4096;
// 定义接收网络数据的字节数组
byte[] inBuff = new byte[DATA_LEN];
// 以指定字节数组创建准备接受数据的DatagramPacket对象
private DatagramPacket inPacket =
new DatagramPacket(inBuff , inBuff.length);
// 定义一个用于发送的DatagramPacket对象
private DatagramPacket outPacket = null;
public void init()throws IOException
{
try(
// 创建一个客户端DatagramSocket,使用随机端口
DatagramSocket socket = new DatagramSocket())
{
// 初始化发送用的DatagramSocket,它包含一个长度为0的字节数组
outPacket = new DatagramPacket(new byte[0] , 0
, InetAddress.getByName(DEST_IP) , DEST_PORT);
// 创建键盘输入流
Scanner scan = new Scanner(System.in);
// 不断读取键盘输入
while(scan.hasNextLine())
{
// 将键盘输入的一行字符串转换字节数组
byte[] buff = scan.nextLine().getBytes();
// 设置发送用的DatagramPacket里的字节数据
outPacket.setData(buff);
// 发送数据报
socket.send(outPacket);
// 读取Socket中的数据,读到的数据放在inPacket所封装的字节数组里。
socket.receive(inPacket);
System.out.println(new String(inBuff , 0
, inPacket.getLength()));
}
}
}
public static void main(String[] args)
throws IOException
{
new UdpClient().init();
}
}

更多教程请关注我的博客!