学习总结1

来源:互联网 发布:js onkeydown 编辑:程序博客网 时间:2024/06/01 10:15

学习总结1 

IOsocket实践,编写简单web服务器。

 

已经完成了自学视频教程的前两个部分,正好用老师在socket课程最后留下的作业—“编写web服务器”,来总结和强化一下前段时间学习的内容。

 

首先利用学过的知识探索一下web浏览器的工作原理吧,我们知道new你的ServerSocket对象就可以创建一个对外开放的端口,然后通过accept方法就可以得到这个链接的Socket对象了。在通过toString方法吧Socket的信息打印出来看看效果。想法很简单现在动手试试吧。

编写代码如下:

import java.io.*;

import java.net.*;

 

public class testsocket1 {

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

       int port = 8080;

       ServerSocket ss = null;

     Socket s = null;

            ss= new ServerSocket(port);

           s = ss.accept();//拿到本次链接对象

           System.out.println(s.toString());//打印出S的字符串形式

           s.close();

           }

}

 

说下过程吧,OK开始运行,程序停住了,那就一定是运行到accept方法了。现在打开ie,地址栏里输入127.0.0.18080回车。Ie显示找不到服务器。回头再看程序,有结果了:

Socket[addr=/127.0.0.1,port=3989,localport=8080]

addr就是来访的ip地址,port就是本次链接中对方的端口。拿到对方信息了但是还不够,因为我还不能断定这是不是对方的浏览器发送过来的消息或者是别的请求。(例如:telnet链接8080端口也会得到同样结果)接下来就要设法读取http头信息了。在原有代码中加入SocketgetInputStream方法再从得到的inputStream中得到我们需要的头信息。

import java.io.*;

import java.net.*;

public class testsocket1 {

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

       int port = 8080;

       ServerSocket ss = null;

       Socket s = null;

       String sr = null;

       byte[] b = new byte[1024];

       InputStream ips = null;

       int len = 0 ;

 

ss = new ServerSocket(port);

          

       s = ss.accept();//得到本次链接对象

          

       ips = s.getInputStream();//拿到sinputstream

      

       len = ips.read(b);//inputstream存入数组

      

       System.out.println(new String(b,0,len));//把拿到的头信息打印出来看看结果

s.close();

          

    }

 

}

 

同上次一样,程序停在accept上,在ie中输入地址127.0.0.1:8080回车,结果马上出来了:

GET / HTTP/1.1

Accept: image/gif,image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash,application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword,application/QVOD, application/QVOD, */*

Accept-Language: zh-tw,sa;q=0.5

Accept-Encoding: gzip, deflate

User-Agent: Mozilla/4.0(compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)

Host: 127.0.0.1:8080

Connection: Keep-Alive 

这都是啥呀?不管了,反正是各种信息和请求。HTTP/1.1一定是他的http版本。现在get是干什么的看不太清楚,好那再来,在浏览器打http://127.0.0.1:8080/toudou.html。好 再看程序。

GET /toudou.html HTTP/1.1

Accept: */*

Accept-Language:zh,sa;q=0.7,zh-tw;q=0.3

Accept-Encoding: gzip, deflate

User-Agent: Mozilla/4.0(compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR3.0.04506.30; .NET4.0C)

Host: 127.0.0.1:8080

Connection: Keep-Alive

 

看出来了吧,就是浏览器要求的得到的网页名字路径啥的。现在完全可以编一小段代码判断一下这部分内容然后返回相应的网页,但是,但是嘛,俺只是做个试验了解原理。所以就随便回一个吧。现在的思路是这样随便给他穿回去点东西浏览器能显示出啥来。直接用soutputstream发过去,

 

import java.io.*;

import java.net.*;

 

public class testsocket1 {

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

       int port = 8081;

       ServerSocket ss = null;

       Socket s = null;

       String sr = null;

       byte[] b = new byte[1024];

       InputStream ips;

       OutputStream ops;

       DataOutputStream dop;

       int len = 0 ;

 

      

       ss = new ServerSocket(port);

          

       s = ss.accept();

          

       ips = s.getInputStream();

       ops = s.getOutputStream();

dop = new DataOutputStream(ops);//OutputStream不能传Sting 所以用//DataOutputStream包装

       dop.writeBytes("<html><head>112233</head><body>hello!!!!!!</body></html>");//一个简单的小网页O(_)O~

       len = ips.read(b);

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

ips.close();

       dop.close();

s.close();

           }

}

好了

 

结果出来了。 112233hello!!!!!!

 

然后再加个死循环和线程就可以持续提供web服务了,不管实现多复杂的功能其核心还是实现与客户端浏览器的数据传输。我就我在这一个问题上在多费时间了,下面还有重要的东西要学习呢。

 

就到这里吧。

原创粉丝点击