当前位置: 首页 > 面试题库 >

BufferedReader readLine方法挂起并阻止程序

阴波峻
2023-03-14
问题内容

我正在尝试使用Java学习套接字,并且成功地将数据发送到了在我自己的计算机上运行的ServerSocket。当我尝试使用readline从此套接字读取消息(以便仅回显自己发送的消息)时,程序将挂起并且不会返回。

这是代码:

public static void main(String[] args) throws UnknownHostException, IOException {

    TCPClient cli = new TCPClient("127.0.0.1", "15000");
    try {
        cli.ostream.writeUTF("Teste");
        String echo = cli.istream.readLine(); //it hangs in this line
        System.out.println(echo);
    }

TCPClient是我定义的类,因此在我的家庭作业中使用swing之前,我可以在更简单的界面上测试程序。这是代码:

public class TCPClient {

public DataOutputStream ostream = null;
public BufferedReader istream = null;

public TCPClient(String host, String port) throws UnknownHostException {
    InetAddress ip = InetAddress.getByName(host);

    try {
        Socket socket = new Socket(host, Integer.parseInt(port));

        ostream = new DataOutputStream(socket.getOutputStream());
        istream = new BufferedReader(new InputStreamReader(socket.getInputStream()));


    } catch (IOException ex) {
        Logger.getLogger(TCPClient.class.getName()).log(Level.SEVERE, null, ex);
    }

}

我的服务器很简单。建立连接后,它将进入此循环并停留在此处,直到我关闭客户端为止(由于无限循环)。之后,一些异常处理将其返回到连接开始之前的位置。

            while(true){
                String msg = istream.readLine();
                System.out.println("Arrived on server: " + msg); //just works on debug
                ostream.writeUTF("ACK: " + msg);
                ostream.flush();
            }

我看不到我在想什么。

PS:奇怪的是,如果我调试服务器,则可以看到到达那里的消息(例如,可以打印它),但是如果我只运行此代码,则不可能。这是否有我忽略的并发关系?

谢谢


问题答案:

问题是readLine尝试读取一行。在确定到达行尾之前,它不会返回行。这意味着它期望换行符或通信结束。由于服务器不发送任何换行符,也不关闭流,因此客户端将无限期等待。



 类似资料:
  • 我在使用spring WebSockets时遇到以下错误: 用例:在我们的服务器端代码中,我们有一个在数据库中搜索值的功能。如果这些值不在数据库中。它将访问servlet并获取数据。第二部分,即访问servlet并获取数据是异步调用。 因此,对于一个请求,我们必须在数据库中搜索多个内容… 示例:在request中,我们得到了一个参数channel:1这个channel映射到多个ID,比如1映射到1

  • 不确定是否有人遇到过这个问题。我正在使用带有EJB3.1的JBoss7.1应用程序服务器和带有HiberNate实现的JPA2.0。我正在使用后端Oracle 11g数据库。请参阅下面的代码。我正在使用由HTTP GET请求驱动的servlet调用我的EJB。 当我在下面的代码中注释掉 时,我的网页会永远挂起,一段时间后我会得到下面的堆栈跟踪(如果我调试,它会让我直到 persist() 方法,然

  • 问题内容: 与此问题相关,我有以下代码可订阅redispubsub队列,并使用__init__中提供的处理程序将消息提供给处理它们的类: 在上面的链接问题中,请注意,如果断开连接,则永不返回。因此,尽管我的函数可以被调用,但它实际上不会导致线程终止,因为它挂在对线程内部的调用上。 链接问题的可接受答案提到了黑客入侵redis-py的连接池。我真的不想这样做,并且有一个分支版本的redis- py(

  • 问题内容: 基本上,我看到了一个BLOCKED线程,但它具有等待的锁: 我希望能看到而不是。另一个问题表明垃圾回收是原因,但是如果是这种情况,不是所有线程都被阻塞了吗?还有其他线程是可运行的。另外,我怎么能证明是这种情况?为什么这是观察到的行为?我不想盲目假设它是垃圾收集器,只是几天后才发现它是其他东西。 ==辅助信息== 尽管我认为这与手头的问题无关,但这是上述转储来自的代码部分。 显然,在那条

  • 首先,这不是重复的: 好的,这是我的错误: 我所做的: 在VisualStudio中,我尝试拉取并更新一个分支,得到了提到的错误。谷歌搜索了一下,发现另一个git进程中的解决方案似乎正在这个存储库中运行,转到命令行(不是git bash),试图删除索引。锁定失败,转到git bash,尝试删除索引。锁,没有错误索引仍然存在(我猜它不是index.lock只是index)。去了VisualStudi

  • cPanel IP阻止程序使您可以阻止您的网站获取单个IP地址,域名或一系列IP地址。 所有试图通过阻止的IP地址访问您网站的用户将无法访问您的网站。 您可以手动拒绝使用您网站带宽或进行恶意活动的IP地址。 拒绝访问IP地址或域 要拒绝访问特定的IP地址或域名,请按照下列步骤操作 - Step 1 - 通过单击cPanel Home安全部分下的IP阻止链接打开cPanel IP阻止程序。 Step