记一次Java中BufferReader类readLine()的Debug

本文记录了一次在Java项目中使用BufferedReader的readLine()方法时遇到的并发问题。在多线程环境下,由于BufferedReader的非线程安全性,导致线程同步问题,具体表现为线程读取文件到末尾后,其他线程接收到空指针异常。通过Debug定位到问题源头,了解到readLine()方法在无数据时会阻塞,且在文件结束时会抛出异常。解决方案是确保线程安全或者避免在并发情况下使用同一BufferedReader实例。此外,还揭示了HTTP请求中可能出现的 favicon.ico 请求,增加了对网络请求行为的理解。
摘要由CSDN通过智能技术生成

先说BUG出现在哪里

最近在做计算机网络的结课设计,选题是一个简易的Web Server,我选择用Java实现。
运行之后,访问Server的主页,页面正常返回,但是会在console上输出一个奇异的null!?在这里插入图片描述
很明显有线程没有正确的运行完所有代码,中途遇到差错没有完成HTTP的这次通信
如果是小规模的并发,在个人电脑上运行也不会有很大影响,页面也正常运行了。
不过如果是大规模的并发,这可能会造成效率的低下,所以我们在并发编程的时候要注意每一个细节,因为项目上线运行,细节一旦放大,可能会带来很多麻烦。

源码贴上

package httpServer;
import java.io.*;
import java.net.Socket;
/*
 1. @author Xianjiaming
 2. @StudentID 2017141491010
 3. @version v20191123
 4. */
public class communicateThread extends Thread {
   
    private Socket client; //客户端的套接字
    //构造函数
    communicateThread(Socket s){
   
        client = s;
    }
    //获取请求URL
    private String getResourcePath(String s){
   
        //结合HTTP请求报文来看,第一行为请求方法+请求URL+HTTP协议版本(以空格分隔),故第一行第二个位置为请求URL
        String str = s.split(" ")[1].substring(1);
        //默认加载主页
        if(str.equals("")){
   
            str = "index.html";
        }
        return str;
    }
    //把请求的文件写进输出流
    private void sendFile(PrintStream out, File file){
   
        try{
   
            DataInputStream in = new DataInputStream(new FileInputStream(file));
            int len = (int)file.length();
            byte buf[] = new byte[len];
            //把文件写到buf缓冲区里
            in.readFully(buf);
            in.close();
            //把buf写到out输出流里
            out.write(buf,0,len);
            //冲刷并关闭输出流
            out
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值