NO.1 JAVA网络编程之B/S浏览器服务器模型的文件位置问题

服务器端的代码如下: (初步代码)

package WEBjava.B_S_webMod;

import java.io.*;

import java.net.*;

public class B_S_server_TCP {

       public static void main(String[] args) throws Exception{

                     //创建一个服务器ServerSocket,并且和系统要指定的端口号

                     ServerSocket server = new ServerSocket(8989);

                   //使用accept()方法来监听并且获取到请求的客户端对象(浏览器)的请求信息

                     Socket whichSocket = server.accept();

                 //使用Socket对象中的方法getInputStream(),获取网络字节输入流(准备把浏览器发来的请求输入到程序中)

                   InputStream itps = whichSocket.getInputStream();

                 //使用网络字节输入流InputStream类的对象中的方法read()来读取客户端(浏览器)发来的信息

                  byte[] bytes = new byte[1024];

                   int len = 0;

                   while((len = itps.read(bytes)) != -1 ){

                    System.out.println(new String(bytes,0,len)); 

                       }

                     whichSocket.close();

                    server.close();

             }

}

接下来运行服务器代码,在浏览器地址栏输入http://127.0.0.1:8989/WEBjava/B_S_webMod/web/index.html

运行结果如下图,

这是服务器端显示浏览器发来的请求信息

此时证明这个URL是可以找到指定服务器的


之后接着补充代码,实现网页回传功能,完整版代码如下

package WEBjava.B_S_webMod;

/**

* 这是一个浏览器和服务器的网络编程模型。客户端是任意的浏览器,就不用写了,但是服务器要有所变化

  当浏览器在地址栏输入URL时,会向服务器发出请求数据,服务器收到数据后就要处理数据并且向浏览器返回网页文件

  因此服务器这边要先把写好的网页文件准备好(就是把网页文件夹复制到同一个包下)

接下来开始创建BS版本的TCP服务器

**/

import java.io.*;

import java.net.*;

public class B_S_server_TCP {

  public static void main(String[] args) throws Exception{

     ServerSocket server = new ServerSocket(8989);

     Socket whichSocket = server.accept();

     InputStream itps = whichSocket.getInputStream();


/**

*     在浏览器的地址栏里输入URL: http://127.0.0.1:8989/WEBjava/B_S_webMod/web/index.html

  因为是本机,所以是127.0.0.1 端口号        储存网页文件的目录

  此时浏览器会发来http协议的请求报文

  其中报文请求行为:GET /WEBjava/B_S_webMod/web/index.html HTTP/1.1

  这也是最关键的一部分信息

*/ 

//那么实际上我们只需要获取到浏览器发来的请求行这一行数据就够了,其他行的信息也就不用读完

  //所以把原本的上面的read()方法的代码删掉,重新写一个更加高效的代码



    //把itps 这个网络字节输入流对象转换为字符缓冲输入流

    BufferedReader br = new BufferedReader(new InputStreamReader(itps));

    //把客户端请求信息的第一行读取出来,GET /WEBjava/B_S_webMod/web/index.html HTTP/1.1

    String line = br.readLine()

    //把读取出来的信息进行切割,只要中间部分,  /WEBjava/B_S_webMod/web/index.html

    String[] arr = line.split(" ");

    //把路径前面的/去掉  进行截取  WEBjava/B_S_webMod/web/index.html

    String htmlPath = arr[1].substring(1);

    //创建一个本地字节输入流,构造方法中绑定要读取的html路径

    FileInputStream fipts = new FileInputStream(htmlPath);

    //使用Socket中的方法getOutputStream()获取网络字节输出流OutputStream对象

    OutputStream otps = whichSocket.getOutputStream();


  //接下来写下三行固定的代码 ~~~~~~这和Http协议相关

    //1  写入HTTP协议的响应头,固定写法

    otps.write("HTTP/1.1 200 OK\r\n".getBytes());

    //2  写下服务器响应的第二行信息

    otps.write("Content-Type:text/html\r\n".getBytes());

    //3  必须写入空行  ,  要不然浏览器不能解析

    otps.write("\r\n".getBytes())  ;

    //一读一写复制文件,把服务器读取的html文件回写到客户端

    int len = 0 ;

    byte[] bytes = new byte[1024];

    while((len = fipts.read(bytes)) != -1){

    otps.write(bytes,0,len);

    }


    //释放资源

    fipts.close();

    whichSocket.close();

    server.close();

  }

}

运行结果如下图:

出现了异常

问题解决:

思路1:因为一开始的代码运行结果是服务器端可以收到浏览器发来的请求,这说明找到到服务器而已

      但完整版代码运行则出现系统找不到指定路径异常,这说明URL写错了,或者URL在被服务器程序分析时写错了

尝试1:再次检查服务器端解析请求信息的代码

检查完代码,在截取完路径htmlPath后添加了一行

System.out.println(htmlPath); 

结果1:输出结果没有错误,浏览器URL输入什么路径,这边htmlPath也能正确提取路径


思路2:根据以上信息,推测应该是浏览器输入的URL路径本身出错

尝试2:这次把URL改成了

http://127.0.0.1:8989/E:/Java/testdemo/demo1/bin/WEBjava/B_S_webMod/web/index.html

原本是

http://127.0.0.1:8989/WEBjava/B_S_webMod/web/index.html 

结果2:这次成功访问到了html页面文件了


成功访问


解决完上述问题,又有新的问题:为啥一定要用绝对路径作为URL来访问才可以成功呢?

现实情况是不能让用户输入这么多内容的,如何才能使用相对的URL来访问呢?

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335