Java套接字无法发送system.lineseparator

Java套接字无法发送system.lineseparator,java,sockets,Java,Sockets,我一直在开发一个p2p聊天服务器系统。它工作得很好,聊天时没问题。但我也想发送文件。我所做的是从发送方读取文件,复制字符串,然后将字符串发送给接收方。然后在接收方,字符串将被写入接收方PC上的文件中。问题是字符串不接受lineseparator,这意味着它没有发送整个文件,而只是发送第一行。让我举一个例子: String st = "I have done this " ; 当我发送此字符串时,它只发送“我已完成”这一部分。现在我正在共享代码。这是消息发

我一直在开发一个p2p聊天服务器系统。它工作得很好,聊天时没问题。但我也想发送文件。我所做的是从发送方读取文件,复制字符串,然后将字符串发送给接收方。然后在接收方,字符串将被写入接收方PC上的文件中。问题是字符串不接受lineseparator,这意味着它没有发送整个文件,而只是发送第一行。让我举一个例子:

   String st = "I have done 
                this " ;
当我发送此字符串时,它只发送“我已完成”这一部分。现在我正在共享代码。这是消息发送器端:

 public class MessageTransmitter extends Thread {

String message, hostname, user;
int targetport, receivePort, key, trigger;

public MessageTransmitter() {
}

public MessageTransmitter(String message, String hostname, int targetport, int receivePort, String user, int key, int trigger) {
    this.message = message;
    this.hostname = hostname;
    this.targetport = targetport;
    this.user = user;
    this.receivePort = receivePort;
    this.key = key;
    this.trigger = trigger;

}

@Override
public void run() {

    if (trigger == 1) {

        String filePath = message;

        String[] tokens = filePath.split("[\\\\|/]");
        String filename = tokens[tokens.length - 1];





        try {
            // FileReader reads text files in the default encoding.
            FileReader fileReader
                    = new FileReader(filePath);

            // Always wrap FileReader in BufferedReader.
            BufferedReader bufferedReader
                    = new BufferedReader(fileReader);

            try {
                while ((line = bufferedReader.readLine()) != null) {

                    line2 += line;
                    line2 += System.lineSeparator();
                }
            } catch (IOException ex) {
                Logger.getLogger(MessageTransmitter.class.getName()).log(Level.SEVERE, null, ex);
            }

            try {
                // Always close files.
                bufferedReader.close();
            } catch (IOException ex) {
                Logger.getLogger(MessageTransmitter.class.getName()).log(Level.SEVERE, null, ex);
            }
        } catch (FileNotFoundException ex) {
            System.out.println("Unable to open file '"
                    + filePath + "'");
        }


        try {
            Socket s1 = new Socket(hostname, targetport);
            s1.getOutputStream().write(line2.getBytes());
            s1.close();

        } catch (IOException ex) {
            Logger.getLogger(MessageTransmitter.class.getName()).log(Level.SEVERE, null, ex);
        }



    }
这是接收机端:

   public class MessageListener extends Thread {

ServerSocket server;
int port, key, trigger;
WritableGUI gui;
String fileData;

public MessageListener(WritableGUI gui, int port, int key) {
    this.port = port;
    this.gui = gui;
    this.key = key;
    try {
        server = new ServerSocket(port);
    } catch (IOException ex) {
        Logger.getLogger(MessageListener.class.getName()).log(Level.SEVERE, null, ex);
    }
}

public MessageListener() {
    try {
        server = new ServerSocket(port);
    } catch (IOException ex) {
        Logger.getLogger(MessageListener.class.getName()).log(Level.SEVERE, null, ex);
    }
}

@Override
public void run() {

    Socket clientSocket;

    try {
        while ((clientSocket = server.accept()) != null) {
            InputStream is = clientSocket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String line = br.readLine();
            if (line != null) {
    gui.write(line);
} catch (IOException ex) {

         Logger.getLogger(MessageListener.class.getName()).log(Level.SEVERE, null, ex);          

您的逻辑中有一个基本缺陷:必须插入换行符的不是发送方。这是希望将文件写入磁盘的客户机应该做的事情

如果您的发件人使用Linux,而客户端运行的是windows,该怎么办?然后,您的解决方案将在Windows系统上使用Linux新行。不行。好吧,它确实有效,但结果不符合你的喜好

从这个意义上说:例如,您可以逐行发送文件(然后让接收者读取这些文件并添加新行)

或者:您的发件人可以在发送的字符串中插入某种占位符(例如
“$$$换行符$$$$
),然后客户端用其换行符替换所有出现的占位符


最后:请阅读有关使用StringBuilder的内容,而不是使用+运算符。

您应该一次发送一行,而不是尝试将整个文件读入内存。接收器应该一次读取一行,并在将每行写入文件之前附加本地系统的行分隔符

String st = "I have done 
            this " ;

我不知道这是什么,但它不是Java。

我甚至不认为它可以编译。例如,我不知道
line2
在您的第一节课中声明在哪里。请阅读并遵循并相应地增强您的问题。顺便说一句,如果
line2
是一个
字符串,您应该知道附加到循环中的字符串。请改用
StringBuilder
。我如何理解在大文件中放置lineseparator的位置?假设我的文件包含以下行:我是个男孩。我上学。我的学校很大。我如何理解在接收器端放置lineseparator的位置?请参阅我的更新。再说一遍:whi“逐行发送文件”的ch部分给您带来了麻烦?您已经有两个人给了您相同的建议。可能您首先消化了此输入,然后再返回更多问题。行分隔符“placeholder”通常为“\n”或“\r\n”(例如,FTP文本模式和其他协议)并且接收方看到“\n”或“\r\n”"并将其转换为其自身环境的行分隔符。此外,我看不到没有行分隔符的逐行发送的逻辑。如果发送一条非常长的行,从发送方到接收方的路径上的某个组件可能会将其拆分为多个部分,然后接收方会错误地认为它是多行。啊,谢谢对所有人来说……我实际上不明白连续传输是可以做到的。我做到了。谢谢你们的帮助。他13分钟前就得到了那个答案,但这对他没有帮助;-)@GhostCat这次帮了他:-|真的;-)