udp服务器 是发文件吗,从UDP服务器发送文件时出现问题

我正在用Java编写一个小的UDP服务器。 当服务器收到命令('GET_VIDEO')时,他读取一个文件('video.raw'),然后将其发送给客户端。我的问题是,从服务器发送的字节数不等于在客户端接收的字节数,我的测试失败。这里是服务器代码:从UDP服务器发送文件时出现问题

public class ServerMock {

public static void main(String[] args) throws Exception {

byte[] buff = new byte[64];

DatagramPacket packet = new DatagramPacket(buff, buff.length);

DatagramSocket socket = new DatagramSocket(8080);

System.out.println("Server started at 8080 ...");

while (true) {

socket.receive(packet);

new ServerMock.ThreadVideo(socket, packet).run();

}

}

public static class ThreadVideo implements Runnable {

private DatagramPacket packet;

private DatagramSocket socket;

public ThreadVideo(DatagramSocket socket, DatagramPacket packet) {

this.packet = packet;

this.socket = socket;

}

public void run() {

String cmd = new String(packet.getData(), 0, packet.getLength());

if (cmd.equals("GET_VIDEO")) {

try {

read_and_send_video(this.packet.getAddress());

} catch (IOException e) {

e.printStackTrace();

}

} else {

System.out.println("S:Exiting ....");

System.exit(0);

}

}

private void read_and_send_video(InetAddress address)

throws IOException {

File file = new File("./video/video.raw");

FileInputStream fis = new FileInputStream(file);

DatagramPacket pack;

int size = 0;

byte[] buffer = new byte[64000];

ByteBuffer bb = ByteBuffer.allocate(4);

bb.order(ByteOrder.BIG_ENDIAN);

while (true) {

size = fis.read(buffer);

System.out.println("Size = " + size);

// Envoi du contenu du fichier

pack = new DatagramPacket(buffer, buffer.length, address,

packet.getPort());

socket.send(pack);

if (size == -1) {

break;

}

}

String cmd = "END_VIDEO";

pack = new DatagramPacket(cmd.getBytes(), cmd.getBytes().length,

address, packet.getPort());

socket.send(pack);

}

}

}

这里是我的客户端代码:

public void client(int timeout, String message)

throws SocketTimeoutException, SocketException {

try {

File file = new File("./video/tmp.raw");

FileOutputStream fos = new FileOutputStream(file);

File filein = new File("./video/video.raw");

InetAddress address = InetAddress.getByName(host);

byte[] data = message.getBytes();

byte[] buffer = new byte[64000];

DatagramSocket socket = new DatagramSocket();

socket.setSoTimeout(timeout);

DatagramPacket packet = new DatagramPacket(data, data.length,

address, port);

socket.send(packet);

DatagramPacket rpacket = new DatagramPacket(buffer, buffer.length);

while (true) {

socket.receive(rpacket);

if (rpacket.getLength() <= 9) {

String cmd = new String(rpacket.getData(), 0,

rpacket.getLength());

if (cmd.equals("END_VIDEO")) {

System.out.println("C:Fin de transmission");

break;

}

}

fos.write(rpacket.getData());

}

System.out.println("video.raw ->" + filein.length());

System.out.println("tmp.raw -> " + file.length());

Assert.assertTrue(file.length() == filein.length());

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (UnknownHostException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

每个人都可以帮助我解决这个问题。 有些朋友建议我使用ByteBuffer类,ByteOrder类,但我不知道如何使用它们,因为我不知道服务器读取文件时真正读取了多少字节。 什么是最好的方式来实现这一

感谢

2011-03-09

Dimitri

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值