A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始




Chapter 9 网络编程

    了解客户端和服务器端原理

    最常见的客户端:浏览器,IE/chrome。
    最常见的服务端:服务器,Tomcat。

    为了了解其原理:

    1. 自定义服务端   
    使用已有的客户端IE,了解一下客户端向服务端发了什么请求。

    代码:
  1. import java.net.ServerSocket;
  2. import java.net.Socket;
  3. import java.io.InputStream;
  4. import java.io.PrintWriter;
  5. import java.io.IOException;

  6. public class MyTomcat
  7. {
  8.         public static void main(String[] args) throws IOException {

  9.                 ServerSocket ss = new ServerSocket(9090);
  10.         
  11.                 Socket s = ss.accept();
  12.                 System.out.println(s.getInetAddress().getHostAddress() + "......connected");

  13.                 InputStream in = s.getInputStream();

  14.                 byte[] buf = new byte[1024];

  15.                 int len = in.read(buf);

  16.                 String text = new String(buf,0,len);

  17.                 System.out.println(text);

  18.                 //给客户端一个反馈信息。
  19.                 PrintWriter out = new PrintWriter(s.getOutputStream(),true);

  20.                 out.println("<font color='red' size='7'>欢迎光临</font>");

  21.                 s.close();
  22.                 ss.close();
  23.         }
  24. }
复制代码
   运行结果:



    发送的请求是:

        (请求行,请求方式:GET;请求的资源路径:/;HTTP协议版本:1.1。)
         GET / HTTP/1.1           
                  
        (请求消息头,属性名:属性值。)
        Host: localhost:9090
        Connection: keep-alive
        Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
        User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36
        Accept-Encoding: gzip, deflate, sdch
        Accept-Language: zh-CN,zh;q=0.8

    P.S.
    1、消息头中属性名及属性值的具体含义,初学者不用追究,在JavaWeb课程中将会深入讲解。
    2、HTTP是一个客户端和服务端请求和应答的标准,客户端按照HTTP的标准发送数据到服务端,服务端按照HTTP的标准解析收到的数据。很多软件都内置了此标准。


    2. 模拟一个浏览器获取信息

    代码:
  1. import java.net.Socket;
  2. import java.io.PrintWriter;
  3. import java.io.InputStream;
  4. import java.io.IOException;

  5. public class MyBrowser
  6. {
  7.         public static void main(String[] args) throws IOException {
  8.                
  9.                 Socket s = new Socket("192.168.1.100",8080);

  10.                 //模拟浏览器,向tomcat服务端发送符合http协议的请求消息。
  11.                 PrintWriter out = new PrintWriter(s.getOutputStream(),true);
  12.                 out.println("GET /myweb/1.html HTTP/1.1");
  13.                 out.println("Accept: */*");
  14.                 out.println("Host: 192.168.1.100:8080");
  15.                 out.println("Connection: close");
  16.                 out.println();
  17.                 out.println();

  18.                 InputStream in = s.getInputStream();

  19.                 byte[] buf = new byte[1024];
  20.                 int len = in.read(buf);

  21.                 String str = new String(buf,0,len);
  22.                 System.out.println(str);

  23.                 s.close();
  24.         }
  25. }
复制代码
   运行结果:

    HTTP服务端发回的应答消息:

        (应答行,HTTP的协议版本:1.1;应答状态码:200;应答状态描述信息:OK。)
        HTTP/1.1 200 OK
        (应答消息属性信息,属性名:属性值。)
        Server: Apache-Coyote/1.1
        Accept-Ranges: bytes
        ETag: W/"211-1433908112666"
        Last-Modified: Wed, 10 Jun 2015 03:48:32 GMT
        Content-Type: text/html
        Content-Length: 211
        Date: Wed, 10 Jun 2015 03:52:16 GMT
        Connection: close

    P.S.
    1、应答行中属性名及属性值的具体含义,初学者不用追究,在JavaWeb课程中将会深入讲解。

    URL&URLConnection

    URI:统一资源标示符。
    URL:统一资源定位符,也就是说根据URL能够定位到网络上的某个资源,它是指向互联网“资源”的指针。
    每个URL都是URI,但不一定每个URI都是URL。这是因为URI还包括一个子类,即统一资源名称(URN),它命名资源但不指定如何定位资源。

    示例:
  1. import java.net.URL;
  2. import java.net.MalformedURLException;
  3. import java.io.InputStream;
  4. import java.net.URLConnection;
  5. import java.io.IOException;

  6. public class URLDemo
  7. {
  8.         public static void main(String[] args) throws MalformedURLException,IOException {
  9.                
  10.                 String str_url = "http://192.168.1.100:8080/myweb/1.html?name=lisi";

  11.                 URL url = new URL(str_url);

  12.                 System.out.println("getProtocol:" + url.getProtocol());
  13.                 System.out.println("getHost:" + url.getHost());
  14.                 System.out.println("getPort:" + url.getPort());
  15.                 System.out.println("getFile:" + url.getFile());
  16.                 System.out.println("getPath:" + url.getPath());
  17.                 System.out.println("getQuery:" + url.getQuery());

  18.                 InputStream in = url.openStream();//相当于url.openConnection().getInputStream();

  19.                 byte[] buf = new byte[1024];
  20.                 int len = in.read(buf);

  21.                 String text = new String(buf,0,len);

  22.                 System.out.println(text);

  23.                 in.close();
  24.         }
  25. }
复制代码
   运行结果:

    之所以运行结果中响应头不见了,只能看到主体数据的原因在于:URLConnection对象已经把响应头给解析了。


    代码:
  1. import java.net.URL;
  2. import java.net.MalformedURLException;
  3. import java.io.InputStream;
  4. import java.net.URLConnection;
  5. import java.io.IOException;

  6. public class URLDemo
  7. {
  8.         public static void main(String[] args) throws MalformedURLException,IOException {
  9.                
  10.                 String str_url = "http://192.168.1.100:8080/myweb/1.html?name=lisi";

  11.                 URL url = new URL(str_url);

  12.                 //获取url对象的Url连接器对象。将连接封装成了对象:java中内置的可以解析的具体协议对象+socket。
  13.                 URLConnection conn = url.openConnection();

  14.                 System.out.println(conn);

  15.                 //由于URLConnection对象已经把响应头给解析了,所以,可以通过URLConnection对象获取响应头某属性名对应的属性值。
  16.                 String value = conn.getHeaderField("Content-Type");

  17.                 System.out.println(value);
  18.         }
  19. }
复制代码
   运行结果:



    常见网络结构

    1. C/S client/server
        特点:
            该结构的软件,客户端和服务端都需要编写。
            开发成本较高,维护较为麻烦。
        好处:
            客户端在本地可以分担一部分任务。例如,杀毒软件直接对本机文件进行杀毒。

    2. B/S browser/server
        特点:
            该结构的软件,只开发服务器端,不开发客户端,因为客户端直接由浏览器取代。
            开发成本相对低,维护更为简单。
        缺点:
            所有运算都要在服务端完成。

    练习:TCP协议上传图片客户端和服务端

    TCP服务端
  1. import java.io.IOException;
  2. import java.net.ServerSocket;
  3. import java.net.Socket;
  4. import java.io.InputStream;
  5. import java.io.File;
  6. import java.io.FileOutputStream;
  7. import java.io.OutputStream;
  8. import java.io.FileNotFoundException;
  9. import java.io.IOException;

  10. public class UploadPicServer
  11. {
  12.         public static void main(String[] args) throws FileNotFoundException,IOException {
  13.                
  14.                 //创建tcp的socket服务端。
  15.                 ServerSocket ss = new ServerSocket(10006);

  16.                 //获取客户端。
  17.                 Socket s = ss.accept();

  18.                 String ip = s.getInetAddress().getHostAddress();
  19.                 System.out.println(ip + "......connected");

  20.                 //读取客户端发来的数据。
  21.                 InputStream in = s.getInputStream();

  22.                 //将读取到的数据存储到一个文件中。
  23.                 File dir = new File("c:\\pic");
  24.                 if(!dir.exists()){
  25.                         dir.mkdirs();
  26.                 }
  27.                 File file = new File(dir,ip + ".bmp");
  28.                 FileOutputStream fos = new FileOutputStream(file);

  29.                 byte[] buf = new byte[1024];
  30.                
  31.                 int len = 0;

  32.                 while((len = in.read(buf)) != -1){
  33.                         fos.write(buf,0,len);
  34.                 }

  35.                 //获取socket输出流,将上传成功字样发给客户端。
  36.                 OutputStream out = s.getOutputStream();

  37.                 out.write("上传成功".getBytes());

  38.                 fos.close();
  39.                 s.close();
  40.                 ss.close();
  41.         }
  42. }
复制代码

    TCP客户端
  1. import java.net.Socket;
  2. import java.io.FileInputStream;
  3. import java.io.OutputStream;
  4. import java.io.InputStream;
  5. import java.net.UnknownHostException;
  6. import java.io.IOException;
  7. import java.io.FileNotFoundException;

  8. public class UploadPicClient
  9. {
  10.         public static void main(String[] args) throws UnknownHostException,IOException,FileNotFoundException{
  11.         
  12.                 //1. 创建客户端socket。
  13.                 Socket s = new Socket("192.168.1.100",10006);

  14.                 //2. 读取客户端要上传的图片文件。
  15.                 FileInputStream fis = new FileInputStream("c:\\0.bmp");

  16.                 //3. 获取socket输出流,将读到图片数据发送给服务端。
  17.                 OutputStream out = s.getOutputStream();

  18.                 byte[] buf = new byte[1024];

  19.                 int len = 0;

  20.                 while((len = fis.read(buf)) != -1){
  21.                         out.write(buf,0,len);
  22.                 }

  23.                 //告诉服务端说:这边的数据发送完毕。让服务端停止读取。
  24.                 s.shutdownOutput();

  25.                 //读取服务端发回的内容。
  26.                 InputStream in = s.getInputStream();
  27.                 byte[] bufIn = new byte[1024];

  28.                 int lenIn = in.read(buf);
  29.                 String text = new String(buf,0,lenIn);
  30.                 System.out.println(text);

  31.                 fis.close();
  32.                 s.close();
  33.         }
  34. }
复制代码
    运行结果:





    练习:TCP协议服务端多线程技术

    代码:

    UploadTask.java
  1. import java.net.Socket;
  2. import java.io.InputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.File;
  5. import java.io.OutputStream;

  6. public class UploadTask implements Runnable
  7. {
  8.         private Socket s;

  9.         public UploadTask(Socket s){
  10.                 this.s = s;
  11.         }

  12.         public void run(){

  13.                 int count = 0;

  14.                 String ip = s.getInetAddress().getHostAddress();
  15.                 System.out.println(ip + "......connected");

  16.                 try{
  17.                         InputStream in = s.getInputStream();

  18.                         File dir = new File("c:\\pic");
  19.                         if(!dir.exists()){
  20.                                 dir.mkdirs();
  21.                         }
  22.                         File file = new File(dir,ip + ".bmp");

  23.                         //如果文件已经存在于服务端。
  24.                         while(file.exists()){
  25.                                 file = new File(dir,ip + "(" + (++count) + ").bmp");
  26.                         }

  27.                         FileOutputStream fos = new FileOutputStream(file);

  28.                         byte[] buf = new byte[1024];
  29.                         
  30.                         int len = 0;

  31.                         while((len = in.read(buf)) != -1){
  32.                                 fos.write(buf,0,len);
  33.                         }

  34.                         OutputStream out = s.getOutputStream();

  35.                         out.write("上传成功".getBytes());

  36.                         fos.close();
  37.                         s.close();
  38.                 }catch(Exception e){
  39.                         e.printStackTrace();
  40.                 }
  41.         }
  42. }
复制代码

    UploadServerDemo.java
  1. import java.io.IOException;
  2. import java.net.ServerSocket;
  3. import java.net.Socket;
  4. import java.io.InputStream;
  5. import java.io.File;
  6. import java.io.FileOutputStream;
  7. import java.io.OutputStream;
  8. import java.io.FileNotFoundException;
  9. import java.io.IOException;

  10. public class UploadPicServer
  11. {
  12.         public static void main(String[] args) throws FileNotFoundException,IOException {
  13.                
  14.                 ServerSocket ss = new ServerSocket(10006);

  15.                 while(true){
  16.                         Socket s = ss.accept();
  17.                         new Thread(new UploadTask(s)).start();
  18.                 }

  19.                 //ss.close();
  20.         }
  21. }
复制代码

    常见客户端和服务端

    最常见的客户端:
        浏览器:IE。
    最常见的服务端:
        服务器:Tomcat。

    服务器处理客户端的请求,并且返回响应信息。

    P.S.
    关于Tomcat的内部机制等知识将会在JavaWeb课程中做为重点讲解,同学们在这里了解即可。
   
~END~



~爱上海,爱黑马~


88 个回复

倒序浏览
给力,辛苦了,谢谢啦!加油,就差最后一篇啦,撒花撒花~~~~
回复 使用道具 举报
给力,顶。。。
回复 使用道具 举报
太给力了,这么多,也花了很多功夫啊!
回复 使用道具 举报
老师的帖子很给力
回复 使用道具 举报
学习,,,
回复 使用道具 举报
New_PS 中级黑马 2015-6-10 22:33:49
7#
学习了,给力!
回复 使用道具 举报
表示还没有学到
回复 使用道具 举报
竹子 中级黑马 2015-6-11 07:34:53
9#
老师辛苦,资料真全
回复 使用道具 举报
好好奥!赞一个!学习的榜样!
回复 使用道具 举报
真是太牛了
回复 使用道具 举报
赞一个!!!
回复 使用道具 举报
真是太牛
回复 使用道具 举报
阳哥给力啊!
回复 使用道具 举报
厉害 太给力了 !
回复 使用道具 举报
很详细,很全
回复 使用道具 举报
继续顶阳哥,希望阳哥更新能再给力点
回复 使用道具 举报
太给力了 顶起来
回复 使用道具 举报
赞一个!!!
回复 使用道具 举报
表示还没有学到哪里,到时候肯定要仔细看看。
回复 使用道具 举报
12345下一页
您需要登录后才可以回帖 登录 | 加入黑马