m0_60945429 2022-01-21 19:27 采纳率: 87%
浏览 12
已结题

javasocket错误readLine()

我写了个socket服务端,但是编译出错,说第26行错了,我也不知道怎么改
请问哪错了,谢谢

import java.awt.*;
import java.net.*;
import java.io.*;

public class a {
    public static void main(String[] args) throws InterruptedIOException {
        try {//建立socket
            Frame a = new Frame("serversocket");
            a.setVisible(true);
            a.setSize(50, 50);
            a.setBounds(0, 0, 100, 100);
            ServerSocket s1 = new ServerSocket(8000);//注:如果服务器在内网需要端口映射
            Socket x = s1.accept();
            System.out.println("服务已开启");
            //读取客户端的信息
            BufferedReader g = new BufferedReader(new InputStreamReader(x.getInputStream(), StandardCharsets.UTF_8));
            String str ;
            while ((str = g.readLine())!=null) {//就是这里
                System.out.println(str);
            }
                System.out.println(str);
                Button a1 = new Button(str);
                a1.setBounds(0, 0, 500, 500);
                a.add(a1);

                x.close();
                s1.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

  • 写回答

1条回答 默认 最新

  • CTimet 2022-01-25 15:47
    关注

    Java API网站是个好东西。这个 BufferedReader 的readLine方法在API网站上的解释是这样的:

    img


    可以据此推断,如果这个readLine要想出错,那一定是出现了IO错误。这种错误大多数时候是由于信息不存在导致的。观察你的源代码。可以发现,信息来源是x.getInputStream()

    img


    可以发现。这个方法本身也会抛出IO异常。所以很可能这个IO错误是从这里传递过来的。
    我们继续研究API文档。这里注意一下这两句话:

    img


    img


    还记得读取调用有几次吗?除了这一次,后面还会通过readLine方法进行一次读取。也就是说,如果”如果套接字上没有缓冲的字节,或者所有缓冲的字节都被读取消耗了“那么后面readLine便会产生IO异常。同样,这两句话都把错误的矛头指向了套接字。然后我们再来研究你的代码。很明显,这个Socket的对象变量x来自ServerSocket对象s1方法accept()所返回的值。我们继续用API文档查询这个方法与ServerSocket的构造器

    img


    img


    很明显。对这个IO错误进行溯源,发现这个错误产自这个ServerSocket的构造器,然后经过一顿传递,最后被readLine抛出。这里的意思是当打开套接字错误时发生IO错误。那么你就应该考虑考虑8000端口是否被占用的问题了。
    OK,以上就是我对你源码的分析了。我不知道我的分析是否正确,但是我尽力了。学会使用API文档,有时候确实能帮你一把。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 2月2日
  • 已采纳回答 1月25日
  • 创建了问题 1月21日

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog