我一直在开发一个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);
答案 0 :(得分:1)
您的逻辑存在一个根本缺陷:发件人不是必须插入换行符。那就是想要将文件写入磁盘的客户端应该这样做。
如果您的发件人使用Linux,而客户端正在运行Windows,该怎么办?然后,您的解决方案将在Windows系统上使用Linux换行符。无法工作。嗯,它确实有效,但结果不符合你的喜好。
从这个意义上说:你可以逐行发送文件(然后让接收者读取并添加新行)。
或者:您的发件人可以插入某种占位符(例如"$$$NEWLINE$$$
到发送的字符串中。然后客户端用它的换行符。
最后:请阅读有关使用StringBuilder的信息,而不是使用+运算符。
答案 1 :(得分:1)
您应该一次发送一行,而不是尝试将整个文件读入内存。接收方应该一次读取一行,并在将每一行写入文件之前附加本地系统的行分隔符。
String st = "I have done
this " ;
我不知道这是什么,但它不是Java。