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 个回复

正序浏览
ddddddddddddddddddddddddd
回复 使用道具 举报
看一看。。。。。。。。。。。
回复 使用道具 举报
byte[] buf = new byte[1024];  这句是什么意思呢。。。。
回复 使用道具 举报
{:3_47:},传说中的大牛
回复 使用道具 举报
牛逼,,,,,,,,,,,
回复 使用道具 举报
黑马,very good
回复 使用道具 举报
还没有学到,mark一个先
回复 使用道具 举报
现在还没学到,可以提前预习一下!!!!!!!!!!!!!!!!!!!ding!!!!!!!
回复 使用道具 举报
不错   顶!!!!!!!!!!!!!!!!!!!!!!!!!!!
回复 使用道具 举报
点一个赞
回复 使用道具 举报
是很全面
回复 使用道具 举报

赞一个!!!
回复 使用道具 举报
妙。。。。。。。。。。。。。。。。。。。
回复 使用道具 举报
给力。。。。。。。持续充电
回复 使用道具 举报
给力,辛苦了,谢谢啦!加油,就差最后一篇啦,撒花撒花~~~~
回复 使用道具 举报
赞!!!
回复 使用道具 举报

这个整理的也太全面了,值得学习学习
回复 使用道具 举报
赞!!!占一下楼层
回复 使用道具 举报
收藏 以后学习
回复 使用道具 举报
12345下一页
您需要登录后才可以回帖 登录 | 加入黑马