传输一个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();
}
}
更多教程请关注我的博客!