为了完全透明,这是一项任务。
还有更多工作要做,但目前我只想尝试以下内容:
但是,现在,似乎信息没有被发送,或者节点B没有正确读取信息。
在我的主课堂中,我设置了这样的节点:
$connectionInfo = array( "UID"=>$uid,
"PWD"=>$pwd,
"Database"=>'YourMainDatabase'; // this database must exists
在节点A中,我这样做:
NodeA nodeA = new NodeA();
NodeB nodeB = new NodeB();
new Thread(nodeA).start();
new Thread(nodeB).start();
请注意,节点A的循环工作正常。当我用print语句测试时,它不会永远循环,并且会经历预期的文本行。
然后,在节点B的末尾:更新以显示当前节点B代码
//Open a socket for talking with NodeB
Socket mySocket = new Socket(InetAddress.getLocalHost(), portNum);
//Set up the socket's output
PrintWriter out = new PrintWriter(mySocket.getOutputStream(), true);
//Loop through the lines of the confA file, writing them to the socket
String line = bufferedReader.readLine();
while (line != null)
{
//Write the line to the socket, get the next line
out.println(line); //updated to println, this flushes and fixes another problem
out.flush();
line = bufferedReader.readLine();
}
//Close the socket
mySocket.close();
但是,in.ready()永远不会成立。我已经尝试使用while循环等待,但它永远不会发生。
我真的不确定为什么。我不知道我是否正确设置了套接字,是否正确设置了服务器,是否正确收听等等。
我只是想把B变成一个听A的服务器是最有意义的。我希望是对的。它看起来类似于我在SO上看到的其他一些例子。
感谢您的帮助。我对套接字,端口,听力和其他方面都非常不熟悉,所以如果我一开始不理解你的建议,请原谅我。我会尽力去理解它。
我没有添加整个代码,希望能让它更具可读性和清晰度,但如果您需要更多信息,请随时提出,我会尽力提供。
答案 0 :(得分:3)
服务器必须首先从ServerSocket获取Socket到客户端。
connectionSocket = mySocket.accept();
服务器线程将处于休眠状态,直到客户端使其接受connectionSocket。
然后你可以从connectionSocket中读取。 <{1}}不需要。{/ p>
由于这是一项任务,我将剩下的留给你。
顺便说一下典型的服务器会这样做:
ready
答案 1 :(得分:1)
我认为问题在于,只是意味着如果你调用一个read,它就不会阻塞。如果在grepcode上查找函数,可以看到执行的代码:
一个准备好的线程只是意味着它不会阻塞,这在你想确保你的线程不会被束缚时很有用,但是如果你有缓冲区则不会真正告诉你。
您要做的是执行readline作为阻塞调用,直到数据被消耗。如果您不希望这阻止当前线程,那么请关闭一个特定于此读数的新消费者线程,该消费者线程可以阻止。
此外,请确保您使用已关闭的套接字或刷新结束发送通信,以便在完成时向消费流指示。而且每次打开/关闭会话只需要套接字一次。