Java 将文件多播到一组用户

Java 将文件多播到一组用户,java,json,Java,Json,向一组用户发送文件时遇到问题。用户可以接收服务器发送的文件,但如果小于8kb,则不会保存文件。 代码如下: 多播SocketServer import java.io.*; import java.net.*; import java.util.Scanner; public class MulticastSocketServer{ public static void main(String[] args) { String fileName; String addr

向一组用户发送文件时遇到问题。用户可以接收服务器发送的文件,但如果小于8kb,则不会保存文件。 代码如下:

多播SocketServer

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

public class MulticastSocketServer{
    public static void main(String[] args) {
    String fileName;
    String address = "235.0.0.1";
    int port = 2222;
    Scanner in = new Scanner(System.in);

    System.out.print("Please enter file name : ");
    fileName = in.next();


try (DatagramSocket serverSocket = new DatagramSocket()) {
        InetAddress addr = InetAddress.getByName(address);
        BufferedReader br = new BufferedReader(new FileReader(fileName + ".txt"));

        DatagramPacket fn = new DatagramPacket(fileName.getBytes(),fileName.getBytes().length, addr, port);
        serverSocket.send(fn); 

        DatagramPacket msgPacket = null;
        String txt = "";

        while((txt = br.readLine())!=null){
            msgPacket = new DatagramPacket(txt.getBytes(),txt.getBytes().length, addr, port);
            serverSocket.send(msgPacket); 
            System.out.println(txt);
        }
    }catch (IOException ex) {ex.printStackTrace();}
}
}
多播SocketClient

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

public class MulticastSocketClient {
 public static void main(String[] args) throws UnknownHostException {
    int port = 2222;
    String address = "235.0.0.1";
    InetAddress addr = InetAddress.getByName(address);
    byte[] buf = new byte[64];
    byte[] buf2 = null ;

    try (MulticastSocket clientSocket = new MulticastSocket(port)){
        clientSocket.joinGroup(addr);

        DatagramPacket fn = new DatagramPacket(buf, buf.length);
        clientSocket.receive(fn);
        String name = new String(buf, 0, buf.length);
        String fileName = name.trim();

        try(PrintWriter pw = new PrintWriter(new      FileWriter(fileName+"2.txt"))){

        while (true) {
            buf2 = new byte [1024];
            DatagramPacket msgPacket = new DatagramPacket(buf2, buf2.length);
            clientSocket.receive(msgPacket);
            String msg = new String(buf2,0,buf2.length);
            String txt = msg.trim();
            pw.println(txt);
            System.out.println(txt);  
        }
        }catch(FileNotFoundException ex){ex.printStackTrace();}
    } catch (IOException ex) {ex.printStackTrace();}
}

}

您永远不会退出
while(true)
循环,因为您没有任何传输流结束的机制,所以您永远不会关闭
PrintWriter
,因此它不会刷新其最终缓冲区,所以任何<4096个字符的文件都不会被刷新,因此它的长度为零

然而,您的代码有比这更糟糕的问题。你假设:

  • 文件名可容纳1024个字符
  • 输入文件的每一行可容纳1024字节
  • 首先接收文件名
  • 接收所有内容包
  • 按顺序接收所有内容包
  • 所有内容包只接收一次
  • 每个数据报的长度是1024
  • 数据是文本,而不是二进制,可以无损地转换为字符串

您正在使用UDP。这意味着大多数假设都是无效的。

你有错误吗?嗨,没有,我没有…“Scanner scan=new Scanner(fileName+“.txt”);”没有用。应该从问题中删除是的,我忘了删除它,感谢您指出了我代码中的问题,但我认为通过这行代码尝试(PrintWriter pw=new PrintWriter(new FileWriter(fileName+“2.txt”))可以帮助我自动关闭PrintWriter。。。我使用UDP是因为它是我的任务。如果你能从无限循环中走出来,它会的,但你不能。请参见编辑。如果您必须使用UDP,请正确使用它,并注意其限制,它不是流。您绝对是对的!你能告诉我如何终止循环吗?我真的很感激你的帮助help@stephenleow这要求您在设计时注意我上面列出的每一点,以及UDP是数据报协议而不是流协议这一事实。这不仅仅是一个,稍微调整代码的问题。问题解决了!!!我真傻。。。你已经给了我解决问题的提示。。。谢谢EJP!!!我无法用语言来感谢你所做的一切!