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