我正在研究一个简单的模型对等网络系统。引导服务器应该提供一个文本文件,其中包含连接到节点的IP列表,以帮助每个节点发现更多对等体。但是,它不会像应该的那样编写文件,我不明白为什么。这是我到目前为止所做的:
package network;
import java.net.*;
import java.io.IOException;
import java.io.*;
import javax.swing.JOptionPane;
public class PeerBootstrapServer
{
public static void main(String[] args) throws IOException
{
String peerFilePath = JOptionPane.showInputDialog("Please provide a peer list path:");
File file = new File(peerFilePath);
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
BufferedReader reader = new BufferedReader(new FileReader(file));
ServerSocket listener = new ServerSocket(8088);
try
{
while(true)
{
Socket socket = listener.accept();
try
{
String peer = socket.getInetAddress().getHostAddress();
boolean isRecognized = false;
for(String line; (line = reader.readLine()) != null; )
{
if(line == peer)
{
isRecognized = true;
}
}
if(isRecognized == false)
{
writer.newLine();
writer.write(peer);
}
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
for(String line; (line = reader.readLine()) != null; )
{
out.println(line);
}
}
finally
{
socket.close();
}
}
}
finally
{
listener.close();
reader.close();
writer.close();
}
}
}
非常感谢任何帮助和/或提示!
答案 0 :(得分:0)
原因是在读取输入流的第一个循环之后,您到达它的末尾,然后当您执行第二个循环时,reader.readLine()
只返回null
。
你必须在第二次循环之前调用reset()
。 e.g。
reader.reset();
for(String line; (line = reader.readLine()) != null; )
{
out.println(line);
}
EDIT
在您的情况下,为每个连接打开读者和作者可能更好,而不是一劳永逸。如果您需要首先阅读查找然后发送内容,同样的想法。