用于套接字的缓冲读卡器从未准备好

时间:2017-10-08 21:43:27

标签: java sockets bufferedreader java-threads

为了完全透明,这是一项任务。

还有更多工作要做,但目前我只想尝试以下内容:

  1. 节点A从文本文件中读入
  2. 节点A使用套接字
  3. 将文本文件(减去第一行)发送到节点B.
  4. 节点B从所述套接字读入,并将其打印到控制台
  5. 但是,现在,似乎信息没有被发送,或者节点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上看到的其他一些例子。

    感谢您的帮助。我对套接字,端口,听力和其他方面都非常不熟悉,所以如果我一开始不理解你的建议,请原谅我。我会尽力去理解它。

    我没有添加整个代码,希望能让它更具可读性和清晰度,但如果您需要更多信息,请随时提出,我会尽力提供。

2 个答案:

答案 0 :(得分:3)

服务器必须首先从ServerSocket获取Socket到客户端。

connectionSocket = mySocket.accept();

服务器线程将处于休眠状态,直到客户端使其接受connectionSocket。

然后你可以从connectionSocket中读取。 <{1}}不需要。{/ p>

由于这是一项任务,我将剩下的留给你。

顺便说一下典型的服务器会这样做:

ready

答案 1 :(得分:1)

我认为问题在于,只是意味着如果你调用一个read,它就不会阻塞。如果在grepcode上查找函数,可以看到执行的代码:

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/java/io/BufferedReader.java#BufferedReader.ready%28%29

一个准备好的线程只是意味着它不会阻塞,这在你想确保你的线程不会被束缚时很有用,但是如果你有缓冲区则不会真正告诉你。

您要做的是执行readline作为阻塞调用,直到数据被消耗。如果您不希望这阻止当前线程,那么请关闭一个特定于此读数的新消费者线程,该消费者线程可以阻止。

此外,请确保您使用已关闭的套接字或刷新结束发送通信,以便在完成时向消费流指示。而且每次打开/关闭会话只需要套接字一次。