我正在使用DatagramSocket(UDP)编码发送文件的客户端,但首先我们需要使用writeUTF()将文件名发送到服务器。客户端和服务器都编译运行没有任何错误,但似乎文件名永远不会到达服务器。知道会发生什么事吗?我发布以下代码......
谢谢:)
Client.java
...
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
for (int readNum; (readNum = fis.read(buf)) != -1;)
{
bos.write(buf, 0, readNum); //no doubt here is 0
}
// File data
byte[] data = bos.toByteArray();
DataOutputStream dos = new DataOutputStream(bos);
//file is a String with the name of the file
dos.writeUTF(file);
//Setting up DatagramSocket
DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
socket.send(packet);
...
Server.java
...
almacen = new byte[MAXNOMBREFICHERO + 2];
packet = new DatagramPacket( almacen, almacen.length );
System.out.println("\nWaiting client...");
socket.receive(packet);
dirIPClient = packet.getAddress();
clientPort = packet.getPort();
ByteArrayInputStream bais = new ByteArrayInputStream( almacen );
DataInputStream dis = new DataInputStream( bais );
filename = dis.readUTF();
...
答案 0 :(得分:0)
您将文件内容写入bos
并将其转换为字节数组。所以你现在得到了data
中的文件内容。将流转换为字节数组后,将file
写入bos
,因此不包含文件名。在将实际文件内容写入writeUTF
之前调用bos
。
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);
// file is a String with the name of the file
dos.writeUTF(file);
byte[] buf = new byte[1024];
for (int readNum; (readNum = fis.read(buf)) != -1;) {
dos.write(buf, 0, readNum);
}
// Packet data
byte[] data = bos.toByteArray();
// Setting up DatagramPacket
DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
socket.send(packet);
答案 1 :(得分:0)
您永远不会通过电汇发送dos
的内容。 dos
与bos
相关联,因此写入dos
的所有内容都将转到与byte[]
相关联的bos
。此外,您在调用bos
之前提取writeUTF
的内容...这不是实时连接;这是一次性的事情。因此,通过在提取数组内容后调用writeUTF
,可以确保file
不在该数组中。如果您拨打writeUTF
和然后,请拨打bos.toByteArray()
,您将拥有数组中的文件名(但它将在数组中排在最后,而不是第一个。)