黑马程序员_Java基础_网络编程(下)_24

来源:互联网 发布:射手播放器 mac破解版 编辑:程序博客网 时间:2024/05/22 03:35

                                                  ------- android培训、java培训、期待与您交流!----------

 

导读:TCP上传图片,TCP-客户并发登陆,浏览器客户端-自定义服务端,浏览器客户端-Tomcat服务端,自定义图形界面浏览器-Tomcat服务器,URL-Connection,域名解析

 

1、网络编程(TCP上传图片)

/*

需求:上传图片。

*/

/*

客户端。

1,服务端点。

2,读取客户端已有的图片数据。

3,通过socket 输出流将数据发给服务端。

4,读取服务端反馈信息。

5,关闭。

*/

import java.io.*;

import java.net.*;

class PicClient

{

       publicstatic void main(String[] args)throws Exception

       {

              Sockets = new Socket("192.168.1.254",10007);

              FileInputStreamfis = new FileInputStream("c:\\1.bmp");

              OutputStreamout = s.getOutputStream();

              byte[]buf = new byte[1024];

              intlen = 0;

              while((len=fis.read(buf))!=-1)

              {

                     out.write(buf,0,len);

              }

              //告诉服务端数据已写完

              s.shutdownOutput();

              InputStreamin = s.getInputStream();

              byte[] bufIn = new byte[1024];

              intnum = in.read(bufIn);

              System.out.println(newString(bufIn,0,num));

              fis.close();

              s.close();

       }

}

/*

服务端

*/

class PicServer

{

       publicstatic void main(String[] args) throws Exception

       {

              ServerSocketss = new ServerSocket(10007);

              Sockets = ss.accept();

              InputStreamin = s.getInputStream();

              FileOutputStreamfos = new FileOutputStream("server.bmp");

              byte[]buf = new byte[1024];

              intlen = 0;

              while((len=in.read(buf))!=-1)

              {

                     fos.write(buf,0,len);

              }

              OutputStreamout = s.getOutputStream();

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

              fos.close();

              s.close();

              ss.close();

       }

}

 

/*

需求:上传图片。

*/

import java.io.*;

import java.net.*;

class PicClient

{

       publicstatic void main(String[] args)throws Exception

       {

              if(args.length!=1) //主函数传值,将文件路径传进程序。如果为1,相当于传入了一个参数

              {

                     System.out.println("请选择一个jpg格式的图片");

                     return;

              }

              Filefile = new File(args[0]);

              if(!(file.exists()&& file.isFile())) 

              {

                     System.out.println("该文件有问题,要么补存在,要么不是文件");

                     return;

              }

              if(!file.getName().endsWith(".jpg")) //只能传输图片文件。

              {

                     System.out.println("图片格式错误,请重新选择");

                     return;

              }

              if(file.length()>1024*1024*5) //判断文件大小,大小5M的不要。

              {

                     System.out.println("文件过大,没安好心");

                     return;

              }

              Sockets = new Socket("192.168.1.254",10007);

              FileInputStreamfis = new FileInputStream(file);

              OutputStreamout = s.getOutputStream();

              byte[]buf = new byte[1024];

              intlen = 0;

              while((len=fis.read(buf))!=-1)

              {

                     out.write(buf,0,len);

              }

              //告诉服务端数据已写完

              s.shutdownOutput();

              InputStreamin = s.getInputStream();

              byte[] bufIn = new byte[1024];

              intnum = in.read(bufIn);

              System.out.println(newString(bufIn,0,num));

              fis.close();

              s.close();

       }

}

class PicThread implements Runnable

{

       privateSocket s;

       PicThread(Sockets) //获取哪个客户端,就封装哪个客户端。

       {

              this.s= s;

       }

       publicvoid run()

       {

              intcount = 1;

              Stringip  =s.getInetAddress().getHostAddress();

              try

              {

                     System.out.println(ip+"....connected");

                     InputStreamin = s.getInputStream();

                     Filedir =  new File("d:\\pic");

                     Filefile = new File(dir,ip+"("+(count)+")"+".jpg");

                     while(file.exists())

                            file= new File(dir,ip+"("+(count++)+")"+".jpg");

//如果文件存在的话,创建一个count++的文件。

                     FileOutputStreamfos = new FileOutputStream(file);

                     byte[]buf = new byte[1024];

                     intlen = 0;

                     while((len=in.read(buf))!=-1)

                     {

                            fos.write(buf,0,len);

                     }

                     OutputStreamout = s.getOutputStream();

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

                     fos.close();

                     s.close();

              }

              catch(Exception e)

              {

                     thrownew RuntimeException(ip+"上传失败");

              }

       }

}

class PicServer

{

       publicstatic void main(String[] args) throws Exception

       {

              ServerSocketss = new ServerSocket(10007);

              while(true)

              {

                     Sockets = ss.accept();

                     newThread(new PicThread(s)).start(); //玩多线程,服务器要玩多线程。

              }

              //ss.close();

       }

}

 

2、网络编程(TCP-客户并发登陆)

/*

客户端通过键盘录入用户名。服务端对这个用户名进行校验。

如果该用户存在,在服务端显示xxx,已登陆。并在客户端显示 xxx,欢迎光临。

如果该用户存在,在服务端显示xxx,尝试登陆。并在客户端显示 xxx,该用户不存在。最多就登录三次。

*/

import java.io.*;

import java.net.*;

class LoginClient

{

       publicstatic void main(String[] args) throws Exception

       {

              Sockets = new Socket("192.168.1.254",10008);

              BufferedReaderbufr =

                     newBufferedReader(new InputStreamReader(System.in));

              PrintWriterout = new PrintWriter(s.getOutputStream(),true);

              BufferedReaderbufIn =

                     newBufferedReader(new InputStreamReader(s.getInputStream()));

              for(intx=0; x<3; x++)

              {

                     Stringline = bufr.readLine();

                     if(line==null) //如果按下一个Ctrl+C那么就结束,不想录入了。不能把null传给服务端。

                            break;

                     out.println(line);

                     Stringinfo = bufIn.readLine();

                     System.out.println("info:"+info);

                     if(info.contains("欢迎")) 

//如果服务器发过来的信息中包含有“欢迎”字样,表示已经登陆。不用再登陆了跳出循环。

                            break;

              }

              bufr.close();

              s.close();

       }

}

class UserThread implements Runnable

{

       privateSocket s;

       UserThread(Sockets)

       {

              this.s= s;

       }

       publicvoid run()

       {

              Stringip = s.getInetAddress().getHostAddress();

              System.out.println(ip+"....connected");

              try

              {

                     for(intx=0; x<3; x++)

                     {

                            BufferedReaderbufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));

                            Stringname = bufIn.readLine();

                            if(name==null) //如果name为null的话,如果尝试的次数不足三次的话,会一直的输出null.

                                   break;

                            BufferedReaderbufr = new BufferedReader(new FileReader("user.txt"));

                            PrintWriterout = new PrintWriter(s.getOutputStream(),true);

                            Stringline = null;

                            booleanflag = false;

                            while((line=bufr.readLine())!=null)

                            {

                                   if(line.equals(name)) //判断客户端传来的用户名,我数据库中的名字是否一样。

                                   {

                                          flag= true;

                                          break;

                                   }                         

                            }

                            if(flag) //根据循环后的结果来判断,定义标记。

                            {

                                   System.out.println(name+",已登录");

                                   out.println(name+",欢迎光临");

                                   break;

                            }

                            else

                            {

                                   System.out.println(name+",尝试登录");

                                   out.println(name+",用户名不存在");

                            }

                     }

                   s.close(); //如果搞了三次还没有登进服务器,我认为你是在暴力登陆服务器,把你干掉。

              }

              catch(Exception e)

              {

                     thrownew RuntimeException(ip+"校验失败");

              }

       }

}

class LoginServer

{

       publicstatic void main(String[] args) throws Exception

       {

              ServerSocketss = new ServerSocket(10008);

              while(true)

              {

                     Sockets = ss.accept();

                     newThread(new UserThread(s)).start();

              }

       }

}

 

4、网络编程(浏览器客户端-自定义服务端

/*

演示客户端和服务端。

1,

客户端:浏览器 (telnet)

服务端:自定义。

2,(见第5个)

客户端:浏览器。

服务端:Tomcat服务器。(Tomcat能提供服务,说明里面封装了ServerSocket)

3,(见第6个)

客户端:自定义。(图形界面)

服务端:Tomcat服务器。

*/

import java.net.*;

import java.io.*;

class ServerDemo

{

       publicstatic void main(String[] args) throws Exception

       {

              ServerSocketss = new ServerSocket(11000);

              Sockets = ss.accept();

              System.out.println(s.getInetAddress().getHostAddress());

              InputStreamin = s.getInputStream();

              byte[]buf = new byte[1024];

              intlen = in.read(buf);

              System.out.println(newString(buf,0,len));

              PrintWriterout = new PrintWriter(s.getOutputStream(),true);

              out.println("<fontcolor='red' size='7'>客户端你好</font>");

              s.close();

              ss.close();

       }

}

  • 在浏览器的地址栏上输入:http://192.168.1.254.11000。则可以向本机的服务器发请求。服务器收到请求的话,会向浏览器返回信息:“客户端你好”。
  • tomcat服务器整天就干这个事,整天用PrintWriter,用out将数据全部打到客户端去,而浏览器牛就牛在浏览器能解析。
  • tel是windows中给我们提供的一个远程登陆的一个工具,它可以用来连接网络中的任意一台主机。在DOC命令下连接,连接之后,可以对于这台主机进行命令性的配置(路由器,交换机等)。简单理解,telnet是一个客户端软件。在DOC下,它可以把<font color='red' size='7'>客户端你好</font>原样显示出来,因为HTML的代码,它解析不了。

 

5、网络编程(浏览器客户端-Tomcat服务端)

  • 玩服务器要先明确端口,要不然你连不上。Tomcat的端口为8080

Tomcat有什么好处,它可以读取你自定义的资源(网页)。

  • 自己定义一个html文件放在http://192.168.1.254/myweb/目录下。

<html>

       <body>

              <h1>这是我的主页</h1>

              <fontsize=5 color=red>欢迎光临</front>

              <div>

                     主页示例</br>

                     主页示例</br>

                     主页示例</br>

              </div>

       </body>

</html>

  • 在应用层有一个公用的HTTP传输协议,这是一个公用的规则。浏览器厂商要想和不同服务器的厂商进行数据交互的话,他们都必须尊从一个规则就可以。

 

6、网络编程(自定义浏览器-Tomcat服务端)

  • import java.io.*;

import java.net.*;

class MyIE

{

       publicstatic void main(String[] args) throws Exception

       {

              Sockets = new Socket("192.168.1.254",8080);

              PrintWriterout = new PrintWriter(s.getOutputStream(),true);

              out.println("GET/myweb/demo.html HTTP/1.1");

              out.println("Accept:*/*"); //什么都支持。

              out.println("Accept-Language:zh-cn");

              out.println("Host:192.168.1.254:11000");

              out.println("Connection:closed");

              out.println();

              out.println();

              BufferedReaderbufr = new BufferedReader(new InputStreamReader(s.getInputStream()));

              Stringline = null;

              while((line=bufr.readLine())!=null)

              {

                     System.out.println(line);

              }

              s.close();

       }

}

  • /*

http://192.168.1.254:11000/myweb/demo.html,这句话的意思是,用HTTP协议向主机192.168.1.254的端口11000发送请求。请求资源路径是myweb,资源是demo.html.

 

下面内容是浏览器向服务器发送的请求:(请求消息头)

GET /myweb/demo.html HTTP/1.1

Accept: application/x-shockwave-flash,image/gif, image/x-xbitmap, image/jpeg, i

mage/pjpeg, application/vnd.ms-excel,application/vnd.ms-powerpoint, application

/msword, application/QVOD,application/QVOD,

Accept-Language: zh-cn

Accept-Encoding: gzip, deflate

User-Agent: Mozilla/4.0 (compatible; MSIE6.0; Windows NT 5.1; SV1; .NET CLR 2.0

.50727)

Host: 192.168.1.254:11000

Connection: Keep-Alive

*/

  • GET是一种请求方式。
  • 目前HTTP协议有两个版本的,一个是1.0,一个是1.1
  • Accept代表告诉服务器,我(浏览器)能接受什么样的数据。flash,gif,bmp,jpg,excel,PPT,word,快播等。如果服务器发过来的数据浏览器不支持,则浏览器要安装一个软件。
  • Accept-Language:zh-cn.浏览器告诉服务器,我是简体中文版。
  • Accept-Encoding:告诉服务器,我支持的封装形式。

先在新浪这一端把你的数据给压缩了,比如说要给你几百K的数据,一压缩变成了几十K,速度会很快(提高了传输效率)。到了这边,你再解压缩就行了。

  • User-Agent:这是用户的一些信息。
  • Host:我想访问你192.168.1.254的11000端口。(一台服务器可以装多台的主机要访问哪一个主机一定要明确一下)
  • Connection:KeepAlive保持存活。(如果为closed,表示你把数据发给我就结束。)
  • 请求消息头的第一行是请求行,最下面是一个空行(必须有一个空行,隔开消息头和数据体),空行的下面是请求数据体。
  • 浏览器向Tomcat发什么东西,我们都知道了,我们也可以搞一个。
  • 响应消息头:由Tomcat服务器发过来的。

HTTP/1.1 200 OK     (200代表响应状态码,代表成功,描述信息。)

Server:Apache-Coyote/1.1    (服务器是Apache的)

ETag:W/”243-1295838676765”

Last-Modidied: (文件是什么时候被修改的)

Content-Type:text/html     (我给你发是一个,html文本)

Content-Length:243         (字节长度)

Date:

Connection:close

 

<html>

       <body>

              <h1>这是我的主页</h1>

              <fontsize=5 color=red>欢迎光临</front>

              <div>

                     主页示例</br>

                     主页示例</br>

                     主页示例</br>

              </div>

       </body>

</html>

  • 这里收到的数据是和浏览器是一样的。

 

7、网络编程(自定义图形界面浏览器-Tomcat服务器)

  • 浏览器这个软件,它强大就强大在,它里面挂了n多个内置的解析的引擎(html解析引擎,css解析引擎,javascript解析引擎)。我们的软件走的是传输层,而浏览器走的是应用层,我们把传输层的数据都拿过来了,而浏览器把,HTTP有关协议封装的信息给拆掉了。
  • import java.awt.*;

import java.awt.event.*;

import java.io.*;

import java.net.*;

class MyIEByGUI

{

       privateFrame f;

       privateTextField tf;

       privateButton but;

       privateTextArea ta;

       privateDialog d;

       privateLabel lab;

       privateButton okBut;

       MyIEByGUI()

       {

              init();

       }

       publicvoid init()

       {

              f= new Frame("my window");

              f.setBounds(300,100,600,500);

              f.setLayout(new FlowLayout());

              tf= new TextField(60);

              but= new Button("转到");

              ta= new TextArea(25,70);

              d= new Dialog(f,"提示信息-self",true);

              d.setBounds(400,200,240,150);

              d.setLayout(newFlowLayout());

              lab= new Label();

              okBut= new Button("确定");

              d.add(lab);

              d.add(okBut);

              f.add(tf);

              f.add(but);

              f.add(ta);

              myEvent();

              f.setVisible(true);

       }

       privatevoid  myEvent()

       {

              okBut.addActionListener(newActionListener()

              {

                     publicvoid actionPerformed(ActionEvent e)

                     {

                            d.setVisible(false);

                     }

              });

              d.addWindowListener(newWindowAdapter()

              {

                     publicvoid windowClosing(WindowEvent e)

                     {

                            d.setVisible(false);

                     }

              });

              tf.addKeyListener(newKeyAdapter()

              {

                     publicvoid keyPressed(KeyEvent e)

                     {

                            try

                            {

                                          if(e.getKeyCode()==KeyEvent.VK_ENTER)

                                   showDir();

                            }

                            catch(Exception ex)

                            {

                            }

                     }

              });

              but.addActionListener(newActionListener()

              {

                     publicvoid actionPerformed(ActionEvent e)

                     {

                            try

                            {

                                   showDir();

                            }

                            catch(Exception ex)

                            {

                            }

                     }

              });

              f.addWindowListener(newWindowAdapter()

              {

                     publicvoid windowClosing(WindowEvent e)

                     {

                            System.exit(0);   

                     }

              });

       }

       privatevoid showDir()throws Exception

       {

              ta.setText("");

              Stringurl = tf.getText(); //http://192.168.1.254:8080/myweb/demo.html

              intindex1 = url.indexOf("//")+2; //找到索引的位置,即192中1的位置。

              intindex2 = url.indexOf("/",index1); //从index1的位置向后面找”/”,”/”的索引就是index2.

              Stringstr = url.substring(index1,index2);  //截取子串。

              String[]arr = str.split(":"); //用分隔符,进行分隔获得主机地址和端口。

              Stringhost = arr[0];

              intport = Integer.parseInt(arr[1]);

              Stringpath = url.substring(index2); //获取资源路径。

              //ta.setText(str+"...."+path);

              Sockets = new Socket(host,port);

              PrintWriterout = new PrintWriter(s.getOutputStream(),true);

              out.println("GET"+path+" HTTP/1.1");

              out.println("Accept:*/*");

              out.println("Accept-Language:zh-cn");

              out.println("Host:192.168.1.254:11000");

              out.println("Connection:closed");

              out.println();

              out.println();

              BufferedReaderbufr = new BufferedReader(new InputStreamReader(s.getInputStream()));

              Stringline = null;

              while((line=bufr.readLine())!=null)

              {

                     ta.append(line+"\r\n"); //将从服务器发过来的数据,添加到文本区域,并添加回车。

              }

              s.close();

       }

       publicstatic void main(String[] args)

       {

              newMyIEByGUI();

       }

}

 

8、网络编程(URL-Connection)

  • java.net中的类URL,类 URL 代表一个统一资源定位符,它是指向互联网“资源”的指针。URI(UniformResource Identifiers)的范围要比URL要大,虽然都是代表统一的定位符。书本后面的条形码也是唯一的,它也是URI的范畴。
  • 构造方法:

Ø URL(String spec):根据 String 表示形式创建 URL 对象。(整个的封装)

Ø URL(String protocol, String host, int port,String file):根据指定 protocol、host、port 号和 file 创建 URL 对象。(分开封装)

  • URL中的get方法,也是在截取字符串,它帮你封装完了之后,你就不用管了,它用起来要方便的多。
  • import java.net.*;

class URLDemo

{

       publicstatic void main(String[] args) throws MalformedURLException

       {

              URLurl = newURL("http://192.168.1.254/myweb/demo.html?name=haha&age=30");

    //用?进行信息的分隔,用&进行多信息的连接,信息都是以键值对的形式存在的。。

              System.out.println("getProtocol():"+url.getProtocol());

              System.out.println("getHost():"+url.getHost());

              System.out.println("getPort():"+url.getPort()); //如果发请求的时候没有指定端口,getPort()返回的值是-1;

              System.out.println("getPath():"+url.getPath()); //只获取路径。

              System.out.println("getFile():"+url.getFile()); //除了获取路径,还获取参数。

              System.out.println("getQuery():"+url.getQuery()); //拿是是?后面的键值对参数。有些时候,你向服务端提交的时候,需要带着客户端的一些特定的信息。这个时候就用加参数的形式,把参数提交到服务端去。

              /*intport = getPort();

              if(port==-1)

                     port= 80;  //如果返回值不是-1那么就用设定的端口,如果端口是-1,就用浏览器的默认端口80。

              getPort()==-1

              */

       }

}

/*

 String getFile():获取此 URL 的文件名。

 String getHost():获取此 URL 的主机名(如果适用)。

 String getPath():获取此 URL 的路径部分。

 intgetPort():获取此 URL 的端口号。

 String getProtocol():获取此 URL 的协议名称。

 String getQuery():获取此 URL 的查询部

*/

  • 通过URL可以把url信息封装成Socket对象,Socket对象走的是传输层。URLConnection openConnection():返回一个 URLConnection 对象,它表示到 URL所引用的远程对象的连接。也就是说只要调用这个方法,就可以连接到一台主机。获取这个主机的连接对象。
  • java.net中的类URLConnection,public abstract class URLConnectionextends Object中一个抽象的类,它有两个直接的子类:HttpURLConnection,JarURLConnection.
  • InputStream getInputStream():返回从此打开的连接读取的输入流。(这方法一猜就是Socket的方法)
  • OutputStream getOutputStream():返回写入到此连接的输出流。
  • import java.net.*;

import java.io.*;

class URLConnectionDemo

{

       publicstatic void main(String[] args) throws Exception

       {

              URLurl = new URL("http://192.168.1.254:8080/myweb/demo.html");

              URLConnectionconn = url.openConnection();

      //它在内部帮你做了连接动作,封装在了内部,并且是带着协议来封装的。这个时候已经连出去了,不用写Socket了。以前我们玩Socket是在传输层,现在它把Socket封装在内部,用的是HTTP封装,而在我们是在应用层。

              System.out.println(conn);

              InputStreamin = conn.getInputStream();

              byte[]buf = new byte[1024];

              intlen = in.read(buf);

              System.out.println(newString(buf,0,len));

       }

}

 

  • 这个时候服务器端发过来的数据,经过传输层,到达应用层。在应用层运用HTTP协议进行解包后,拆掉了响应头中的响应信息。最终显示在了显示器上。
  • //第七个代码中showDir()的替代方法。这个更简单。

private void showDir() throws Exception

{

       ta.setText("");

       StringurlPath = tf.getText();//http://192.168.1.254:8080/myweb/demo.html

       URLurl = new URL(urlPath);

       URLConnectionconn = url.openConnection();

       InputStreamin = conn.getInputStream();

       byte[]buf = new byte[1024];

       intlen = in.read(buf);

       ta.setText(newString(buf,0,len));

}

  • URL中的另一个方法,InputStreamopenStream():打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。(相当先连接,再开流openConnection().getInputStream())。
  • 如果先建立连接的话,里面可以有更多的方法可以用。可以往服务器中再发一些东西都可以,甚至可以解析它的头。如String getContentType():返回 content-type 头字段的值。等。

 

9、网络编程(小知识点)

  • Socket类有一个空的构造函数,Socket()。可以通过void connect(SocketAddress endpoint):将此套接字连接到服务器。SocketAddressendpoint和InetAddress有什么区别呢?java.net中的类SocketAddress是一个抽象的类,它的子类InetSocketAddress,实现 IP 套接字地址(IP 地址 + 端口号)。
  • ServerSocket 中的一个构造方法:ServerSocket(intport, int backlog):利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。backlog - 队列的最大长度(能同时连到服务器的客户端的最大的个数,别的人还连进来必须有一个人断线,他才能连进来)。这是ServerSocket的指定队列的特点,最大连接数的特点。

 

10、网络编程(域名解析)

  • 浏览器在写入一个网址的时候它到底做了什么事情?
  • 浏览器在解析完http://192.168.1.254:8080/myweb/demo.html后,要先看它是什么协议,看完这个协议后,它会启用相对应的协议并解析后面相对应的主机和端口,把主机和端口封装成Socket。我们写的时候,写的是www.sina.com.cn,当写主机名的时候,要把它翻译成主机的地址,才能去访问这个主机。想要将主机名翻译成IP地址,需要域名解析。DNS。DNS把地址给返回给客户端,客户机再向这个解析出来的地址发请求,发到8080端口上。用的是电信的宽带,你不配置DNS的话,它默认走的就是电信的DNS服务器。如果你配置的话,要走你指定的DNS服务器。当然找联通的DNS也可以,但是谁离我近我找谁。如果访问美国的DNS的话,我可能请求时间过长超时,没有解析成功,该页就无法显示。
  • http://127.0.0.1:8080和http://localhost:8080,我没有走公网。为什么127.0.0.1和localhost是一样的呢?其实127和localhost的映射关系就是本机上。c:\windows\systems\drivers\etc\hosts中有一个映射关系:127.0.0.1    localhost。可以在这里面把localhost改成自己想要的名字。一个地址也可以对应多个名字,可以再在文件中加一个127.0.0.1 www.sina.com.cn(这样的话就不走DNS服务器了)。当我们在访问网络主机的时候,它先找的是本地,这样的话速度就会快了一些。看看本地的文件hosts中有没有对应的地址。本地没有的话,再往外面去找。
  • 有些收费软件它总去自己的网站上去更新。一更新发现那个注册码不是最新的,它会告诉你这个软件不让你用。软件一启动的话,它会自动向某个网站发请求。可以在host文件中做一些手脚,那么这个软件一启动,它再向网站上更新的话,走127.0.0.1这个地址,更新失败,不让他更新。
  • 在上网的时候有些网站总是配合一些广告页面,这些广告页面,和一些恶意的代码或者病毒,为了不再受恶意软件的侵害,360等软件就在hosts文件中配置了这些文件的映射表,全映射到本地来,连不出去。
  • 如果直接输入一个IP地址的话,就不走DNS了。只有写主机名的时候,才走这个映射关系。先走本地文件,再走网络DNS,没查着则该页不可显示。

 

                                                      ------- android培训、java培训、期待与您交流!----------  

0 0
原创粉丝点击