一、 网络参考模型
1、OSI参考模型和TCP/IP 参考模型
七层描述:
(1). 物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流。
(2). 数据链路层:主要将从物理层接收的数据进行MAC地址(网卡的地址)的封装与解封装。这一层工作的设备是交换机,数据通过交换机来传输。
(3). 网络层:主要将下层接收到的数据进行IP地址(例,192.168.0.1)的封装与解封装。这一层工作的设备是路由器。。
(4). 传输层:定义了一些传输数据的协议和端口号(WWW端口号80等),主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。
(5). 会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接收会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)。
(6). 表示层:主要是进行对接收的数据进行解释,加密与解密、压缩与解压缩等(也就是把计算机能够识别的东西转换成人能够识别的东西(如图片、声音等)。
(7). 应用层:主要是一些终端的应用,比如说FTP(各种文件下载)、WEB(IE浏览)、QQ之类的(可以把它理解成我们在电脑屏幕上可以看到的东西,就是终端应用)。
注:
(1).每个网卡的MAC地址都是全球唯一的。
(2).路由器实现将数据包发送到指定的地点。
(3).应用软件之间通信的过程就是层与层之间封包、解包的过程
(4).OSI参考模型虽然设计精细,但过于麻烦,效率不高,因此才产生了简化版的TCP/IP参考模型。
2、网络通信三要素:IP地址,端口号,传输协议。
(1)、IP地址:InetAdderss类
1.它是网络中的设备标识
2.不易记忆,可用主机名表示,两者存在映射关系
3.IPV4数量已经不够分配,所以产生了IPV6
4.本地回环地址:127.0.0.1 主机名:localhost
5.在没有连接互联网的情况,为了让访问本机方便,所以分配了一个默认的IP地址,也就是本地回环地址
(2)、端口号
1.用于标识进程(应用程序)的逻辑地址,不同进程的标识
2.有效端口:0~65535,其中0~1024系统使用或保留端口。
3.没有程序都有端口号用来定为应用程序
(3)、传输协议
这是通讯的规则。常见协议有:UDP、TCP。
UDP
1.将数据以及源和目的封装成数据包中,不需要建立连接
2.每个数据包的大小限制在64k内
3.因无连接,所以是不可靠的协议
4.不需要建立连接,速度快
应用案例:QQ聊天、视频聊天、对讲机、FeiQ、视频教学等在线视频都是UDP
TCP
1.建立连接,形成传输数据的通道
2.在连接中进行大数据量传输
3.通过三次握手完成连接,是可靠协议。三次握手:第一次本方发送请求,第二次对方确认连接,第三次本方确认对方连接成功。
4.必须建立连接,效率会稍低
应用案例:FTP文件传输、迅雷下载、打电话
3、java.net.InetAdderss常用网络方法
无构造函数,只能用方法返回本类对象
- static InetAddress getLocalHost();
- static String getHostName();
- static String getHostAddress();
- String toString();
- static InetAddress getByName(String host);
- static InetAddress[] getAllByName(String host);
代码演示:
- import java.net.*;
- class InetAddressDemo
- {
- public static void main(String[] args) throws Exception
- {
- InetAddress ia= InetAddress.getLocalHost();
- String name=ia.getHostName();
- String ip=ia.getHostAddress();
- System.out.println("name="+name);
- System.out.println("ip="+ip);
-
- InetAddress i=InetAddress.getByName("192.168.1.1");
- System.out.println(i.getHostAddress());
-
- InetAddress[] ina=InetAddress.getAllByName("www.sina.com.cn");
- for (InetAddress a:ina )
- {
- System.out.println(a.getHostAddress());
- System.out.println(a.getHostName());
- }
- }
- }
二、UDP协议-发送端和接收端
Socket:套接字,通信的端点。就是为网络服务提供的一种机制,通信的两端都有Socket,网络通信其实就是Socket间的通信,数据在两个Socket间通过IO传输。
1、DatagramSocket和DatagramPacket对象
(1)、DatagramSocket类常用方法
此类表示用来发送和接收数据报包的套接字。
1、构造方法
1 new DatagramSocket();//构造数据报套接字并绑定到本地主机任何端口上,发送端
2 new DatagramSocket(int port);//创建数据报套接字并绑定到本地主机上的指定端口,接收端
2、一般方法
1 void connect(InetAddress address,int port);//将套接字连接到此套接字的远程地址上
2 void send(DatagramPacket p);//从此套接字发送数据包
3 void receive(DatagramPacket p);//从此套接字接收数据包
4 InetAddress getInetAddress();//返回此套接字连接的地址
5 int getPort();//返回此套接字的端口
(2)、DatagramPacket类常用方法
此类表示数据报包
1、构造方法
1 new DatagramPacket(byte[] buf,int length,InetAddress address,int port);//构造数据报包,用来将长度为length的包发送到指定主机上的指定端口号
2 newDatatgramPacket(byte[] buf,int length);//构造 DatagramPacket
,用来接收长度为 length
的数据包
2、一般方法
1 InetAddress getAddress();//获取某台主机的ip地址
2 byte[] getData();//获取数据缓冲区的内容
3 int getLength();//获取将要发送或者接收到的数据的长度
4 int getPort();//获取某台主机的端口号
2、UDP传输发送和获取数据的步骤
UDP发送端步骤:
1)、建立UDPSocket服务
2)、提供数据,并将数据封装到数据包中
3)、通过Socket服务的send方法,将数据包发送出去
4)、关闭资源
UDP接收端步骤:
1)、定义UDPSocket服务。通常会监听一个端口号。其实就是给这个接收网络应用程序定义数字标识,方便于明确哪些数据过来哪个应该程序可以处理
2)、定义一个数据包。因为要存储接收到的字节数据。因为数据包对象中有更多功能可以提取字节数据中的不同数据信息
3)、通过Sockt服务的receive方法将接收到的数据存入已经定义好的数据包中
4)、通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上
5)、关闭资源
需求:聊天程序(双窗口模式)代码演示:
- import java.io.*;
- import java.net.*;
- class UDPSend
- {
- public static void main(String[] args)
- {
- DatagramSocket ds=null;
- BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
- try
- {
-
- ds=new DatagramSocket();
- String line=null;
- while ((line=br.readLine())!=null)
- {
- byte[] buf=line.getBytes();
-
- DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.104"),55128);
-
- ds.send(dp);
- if("over".equals(line))
- break;
- }
-
- }
- catch (Exception e)
- {
- System.out.println(e);
- }
- finally
- {
- if(ds!=null)
- try
- {
-
- ds.close();
- }
- catch (Exception e)
- {
- System.out.println("发送端关闭失败");
- }
- }
- }
- }
- class UDPReceive
- {
- public static void main(String[] args){
- DatagramSocket ds=null;
- DatagramPacket dp=null;
- try{
-
- ds=new DatagramSocket(55128);
- while (true)
- {
- byte[] buf=new byte[1024];
- dp=new DatagramPacket(buf,buf.length);
-
- ds.receive(dp);
-
- String ip=dp.getAddress().getHostAddress();
- String data=new String(dp.getData(),0,dp.getLength());
- System.out.println(ip+"......"+data);
- if(data.equals("over"))
- break;
- }
-
- }
- catch (Exception e)
- {
- System.out.println(e);
- }
- finally
- {
- if(ds!=null)
- try
- {
-
- ds.close();
- }
- catch (Exception e)
- {
- System.out.println("接收端关闭失败");
- }
- }
- }
- }
需求:聊天程序(单窗口模式-群聊)代码演示:
收数据的部分,和发数据的这两部分需要同时执行。那就需要用到多线程技术。一个线程控制收,一个线程控制发。因为收和发动作是不一致的,所以要定义两个run方法。而且这两个方法要封装到不同的类中。
- import java.io.*;
- import java.net.*;
- class UDPSend implements Runnable
- {
- private DatagramSocket ds;
- UDPSend(DatagramSocket ds){
- this.ds=ds;
- }
- public void run(){
- try
- {
-
- BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
- String line=null;
- while ((line=br.readLine())!=null)
- {
- byte[] buf=line.getBytes();
-
- DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.104"),5556);
-
- ds.send(dp);
- if("over".equals(line))
- break;
- }
- ds.close();
- }
- catch (Exception e)
- {
- System.out.println("发送失败");
- }
- }
- }
- class UDPReceive implements Runnable
- {
- private DatagramSocket ds;
- UDPReceive(DatagramSocket ds){
- this.ds=ds;
- }
- public void run(){
- try
- {
- while (true)
- {
- byte[] buf=new byte[1024];
-
- DatagramPacket dp=new DatagramPacket(buf,buf.length);
-
- ds.receive(dp);
-
- String ip=dp.getAddress().getHostAddress();
- String data=new String(dp.getData(),0,dp.getLength());
- System.out.println(ip+"......."+data);
- if("over".equals(data))
- break;
- }
- ds.close();
- }
- catch (Exception e)
- {
- System.out.println("接收端接受失败");
- }
- }
- }
- class ChatRoom
- {
- public static void main(String[] args)throws Exception{
-
- DatagramSocket send=new DatagramSocket();
- DatagramSocket receive=new DatagramSocket(5556);
-
- new Thread(new UDPSend(send)).start();
- new Thread(new UDPReceive(receive)).start();
- }
- }
三、TCP协议-客户端和服务端
客户端(Client)首先与服务端(Server)建立连接,形成通道(其实就是IO流),然后,数据就可以在通道之间进行传输,并且单个Server端可以同时与多个Client端建立连接。Socket和ServerSocket,建立客户端和服务器端。建立连接后,通过Socket中的IO流进行数据的传输。关闭socket。同样,客户端与服务器端是两个独立的应用程序。
TCP客户端
客户端需要明确服务器的ip地址以及端口,这样才可以去试着建立连接,如果连接失败,会出现异常。连接成功,说明客户端与服务端建立了通道,那么通过IO流就可以进行数据的传输,而Socket对象已经提供了输入流和输出流对象,通过getInputStream()和getOutputStream()获取即可与服务端通讯。结束后关闭Socket。客户端,通过查阅socket对象,发现在该对象建立时,就可以去连接指定主机。因为tcp是面向连接的。所以在建立socket服务时,就要有服务端存在,并连接成功。形成通路后,在该通道进行数据的传输。
TCP服务端
服务端需要明确它要处理的数据是从哪个端口进入的。当有客户端访问时,要明确是哪个客户端,可通过accept()获取已连接的客户端对象,并通过该对象与客户端通过IO流进行数据传输。当该客户端访问结束,关闭该客户端。1,建立服务端的socket服务。ServerSocket();并监听一个端口。2,获取连接过来的客户端对象。通过ServerSokcet的 accept方法。没有连接就会等,所以这个方法阻塞式的。3,客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据。并打印在控制台。4,关闭服务端。(可选)。
TCP协议因为是面向连接的。所以传输数据必须先开服务端,再开客户端。否则,客户端根本连接不上服务端。
1、Socket类中常用方法
(1)、构造方法
1 new Socket();
2 new Socket(InetAddress address,int port);//创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
3 new Socket(String host,int port);// 创建一个流套接字并将其连接到指定主机上的指定端口号。
(2)、成员方法
- void bind(SocketAddress bindpoint);
- void connect(SocketAddress endpoint);
- InetAddress getInetAddress();
- InputStream getInputStream();
- OutputStream getOutputStream();
- int getPort();
- void shutdownInput();
- void shutdownOutput();
2、ServerSocket类中常用方法
(1)、构造方法
1 new ServerSocket();//创建非绑定服务器套接字。
2 new ServerSocket(int port);//创建绑定到特定端口的服务器套接字。
(2)、成员方法
1 Socket accept();//侦听并接受到此套接字的连接。
2 InetAddress getInetAddress();// 返回此服务器套接字的本地地址。
需求:TCP协议-服务端和客户端交互代码演示:
- import java.io.*;
- import java.net.*;
- class TCPClient
- {
- public static void main(String[] args) throws Exception
- {
-
- Socket s=new Socket("192.168.1.100",5544);
-
- OutputStream out=s.getOutputStream();
- out.write("TCP,我来了!".getBytes());
- InputStream in=s.getInputStream();
- byte[] buf=new byte[1024];
- int len=in.read(buf);
- System.out.println(new String(buf,0,len));
- s.close();
- }
- }
- class TCPServer
- {
- public static void main(String[] args)throws Exception{
-
- ServerSocket ss=new ServerSocket(5544);
-
- Socket s=ss.accept();
-
- String ip=s.getInetAddress().getHostAddress();
- System.out.println(ip+".....connnect");
-
- InputStream in=s.getInputStream();
- byte[] buf=new byte[1024];
- int len=in.read(buf);
- System.out.println(new String(buf,0,len));
-
- OutputStream out=s.getOutputStream();
- out.write("收到".getBytes());
- ss.close();
-
- s.close();
- }
- }
需求:建立一个文本转换服务器。
客户端给服务端发送文本,服务单会将文本转成大写在返回给客户端。而且客户度可以不断的进行文本转换。当客户端输入over时,转换结束。
客户端:
既然是操作设备上的数据,那么就可以使用io技术,并按照io的操作规律来思考。
源:键盘录入。
目的:网络设备,网络输出流。
而且操作的是文本数据。可以选择字符流。
步骤
1,建立服务。
2,获取键盘录入。
3,将数据发给服务端。
4,后去服务端返回的大写数据。
5,结束,关资源。
都是文本数据,可以使用字符流进行操作,同时提高效率,加入缓冲。
服务端:
源:socket读取流。
目的:socket输出流。
都是文本,装饰。
- import java.io.*;
- import java.net.*;
- class TransClient
- {
- public static void main(String[] args) throws Exception
- {
- Socket s=new Socket("192.168.1.100",7788);
-
- BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
-
- PrintWriter out=new PrintWriter(s.getOutputStream(),true);
-
- BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));
- String line=null;
- while ((line=br.readLine())!=null)
- {
- out.println(line);
- if("over".equals(line))
- break;
- String info=in.readLine();
- System.out.println("info="+info);
- }
- s.close();
-
- }
- }
- class TransServer
- {
- public static void main(String[] args)throws Exception{
- ServerSocket ss=new ServerSocket(7788);
- Socket s=ss.accept();
- System.out.println(s.getInetAddress().getHostAddress()+".....connect");
-
- BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));
-
- PrintWriter out=new PrintWriter(s.getOutputStream(),true);
- String line=null;
- while ((line=in.readLine())!=null)
- {
- System.out.println(line);
- out.println(line.toUpperCase());
- if("over".equals(line))
- break;
- }
- s.close();
- ss.close();
- }
- }
需求:TCP协议上传文本文件
- import java.io.*;
- import java.net.*;
- class TCPClient
- {
- public static void main(String[] args)throws Exception
- {
- Socket s=new Socket("192.168.1.100",9999);
- BufferedReader br=new BufferedReader(new FileReader("TCPDemo.java"));
- PrintWriter out=new PrintWriter(s.getOutputStream(),true);
- BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));
- String line=null;
- while ((line=br.readLine())!=null)
- {
- out.println(line);
- }
- s.shutdownOutput();
- System.out.println(in.readLine());
- s.close();
- br.close();
- }
- }
- class TCPServer
- {
- public static void main(String[] args)throws Exception{
- ServerSocket ss=new ServerSocket(9999);
- Socket s=ss.accept();
- System.out.println(s.getInetAddress().getHostAddress()+"....connect");
- BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));
- PrintWriter pw=new PrintWriter(new FileWriter("E:\\TCPDemo.java"),true);
- PrintWriter out=new PrintWriter(s.getOutputStream(),true);
- String line=null;
- while ((line=in.readLine())!=null)
- {
- pw.println(line);
- }
- out.println("上传成功");
- s.close();
- ss.close();
- pw.close();
- }
- }
需求:TCP客户端并发上传图片代码演示:
服务端最好就是将每个客户端封装到一个单独的线程中,这样,就可以同时处理多个客户端请求。
如何定义线程呢?
只要明确了每一个客户端要在服务端执行的代码即可。将该代码存入run方法中。
- import java.io.*;
- import java.net.*;
- class PicClient
- {
- public static void main(String[] args)throws Exception{
- File file=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*4){
- System.out.println("文件过大,请切割后上传");
- return;
- }
-
- Socket s=new Socket("192.168.1.104",5555);
- FileInputStream fis=new FileInputStream(file);
- OutputStream out=s.getOutputStream();
- byte[] buf=new byte[1024];
- int len=0;
- while ((len=fis.read(buf))!=-1)
- {
- out.write(buf,0,len);
- }
- s.shutdownOutput();
- InputStream in=s.getInputStream();
- byte[] bufIn=new byte[1024];
- int num=in.read(bufIn);
- System.out.println(new String(bufIn,0,num));
- s.close();
- fis.close();
- }
- }
- class PicThread implements Runnable
- {
- private Socket s;
- PicThread(Socket s){
- this.s=s;
- }
- public void run(){
- String ip=s.getInetAddress().getHostAddress();
- System.out.println(ip+".....connect");
- try
- {
- int count=1;
-
- File file=new File("E:\\"+ip+"("+count+")"+".jpg");
-
- while(file.exists())
- file=new File("E:\\"+ip+"("+(count++)+")"+".jpg");
- InputStream in=s.getInputStream();
- FileOutputStream fos=new FileOutputStream(file);
- byte[] buf=new byte[1024];
- int len=0;
- while ((len=in.read(buf))!=-1)
- {
- fos.write(buf,0,len);
- }
- OutputStream out=s.getOutputStream();
- out.write("上传成功".getBytes());
- s.close();
- }
- catch (Exception e)
- {
- System.out.println(ip+"连接成功");
- }
- }
- }
- class PicServer
- {
- public static void main(String[] args)throws Exception{
- ServerSocket ss=new ServerSocket(5555);
- while (true)
- {
- Socket s=ss.accept();
- new Thread(new PicThread(s)).start();
- }
- }
- }
需求:客户端通过键盘录入用户名。服务端对这个用户名进行校验。最多就登录三次。
如果该用户存在,在服务端显示xxx,已登陆。
并在客户端显示 xxx,欢迎光临。
如果该用户不存在,在服务端显示xxx,尝试登陆。
并在客户端显示 xxx,该用户不存在。
- import java.io.*;
- import java.net.*;
- class LoginClient
- {
- public static void main(String[] args)throws Exception
- {
- Socket s=new Socket("192.168.1.104",6666);
- BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
-
- BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));
-
- PrintWriter out=new PrintWriter(s.getOutputStream(),true);
-
- for (int x=0;x<3 ;x++ )
- {
- String name=br.readLine();
- if(name==null)
- break;
- out.println(name);
- String info=in.readLine();
- System.out.println(info);
-
- if(info.contains("欢迎")){
- break;
- }
- }
- s.close();
- }
- }
- class LoginThread implements Runnable
- {
- private Socket s;
- LoginThread(Socket s){
- this.s=s;
- }
- public void run(){
- String ip=s.getInetAddress().getHostAddress();
- System.out.println(ip+".....connect");
- try
- {
- for (int x=0;x<3 ;x++ )
- {
-
- BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));
- String name=in.readLine();
- if(name==null)
- break;
-
- BufferedReader br=new BufferedReader(new FileReader("Userinfo.txt"));
-
- PrintWriter out=new PrintWriter(s.getOutputStream(),true);
-
- boolean flag=false;
- String line=null;
- while ((line=br.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)
- {
- System.out.println(ip+"连接失败");
- }
- }
- }
- class LoginServer
- {
- public static void main(String[] args)throws Exception{
- ServerSocket ss=new ServerSocket(6666);
- while (true)
- {
- Socket s=ss.accept();
- new Thread(new LoginThread(s)).start();
- }
- }
- }
四、客户端和服务器端原理
最常见的客户端:浏览器,IE/chrome。
最常见的服务端:服务器,Tomcat。
1. 自定义服务端
使用已有的客户端IE,了解一下客户端向服务端发了什么请求
- import java.io.*;
- import java.net.*;
- class ServerDemo
- {
- public static void main(String[] args) throws Exception
- {
- ServerSocket ss=new ServerSocket(8080);
- Socket s=ss.accept();
- PrintWriter out=new PrintWriter(s.getOutputStream(),true);
- out.println("客户端你好 ");
-
- InputStream is=s.getInputStream();
- byte[] buf=new byte[1024];
- int len=is.read(buf);
- System.out.println(new String(buf,0,len));
- ss.close();
- s.close();
- }
- }
-
-
-
-
-
-
- *;q=0
- .8
- User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like
- Gecko) Chrome/42.0.2311.152 Safari/537.36
- Accept-Encoding: gzip, deflate, sdch
- Accept-Language: zh-CN,zh;q=0.8
- */
HTTP是一个客户端和服务端请求和应答的标准,客户端按照HTTP的标准发送数据到服务端,服务端按照HTTP的标准解析收到的数据。很多软件都内置了此标准。
2. 模拟一个浏览器获取信息。
- import java.net.*;
- import java.io.*;
- public class MyBrowser
- {
- public static void main(String[] args) throws IOException {
- Socket s = new Socket("192.168.1.100",8080);
-
- PrintWriter out = new PrintWriter(s.getOutputStream(),true);
- out.println("GET /myweb/1.html HTTP/1.1");
- out.println("Accept: */*");
- out.println("Host: 192.168.1.100:8080");
- out.println("Connection: close");
- out.println();
- out.println();
- InputStream in = s.getInputStream();
- byte[] buf = new byte[1024];
- int len = in.read(buf);
- String str = new String(buf,0,len);
- System.out.println(str);
- s.close();
- }
- }
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
应答行中属性名及属性值的具体含义,初学者不用追究,在JavaWeb课程中将会深入讲解。
五、URL和URLConnection类
URI:统一资源标示符。
URL:统一资源定位符,也就是说根据URL能够定位到网络上的某个资源,它是指向互联网“资源”的指针。每个URL都是URI,但不一定每个URI都是URL。这是因为URI还包括一个子类,即统一资源名称(URN),它命名资源但不指定如何定位资源。
URL类可以建立到远程对象的连接,也就是说这里面封装了socket,可以直接获取socket流。
1、常用方法
- String getFile();
- String getHost();
- String getPath();
- int getPort();
- String getProtocol();
- String getQuery();
- URLConnection openConnection();
- InputStream openStream();
- openConnection().getInputStream()。
代码演示:
- import java.net.*;
- import java.io.*;
- class URLConnectionDemo
- {
- public static void main(String[] args) throws Exception
- {
- URL url = new URL("http://192.168.1.254:8080/myweb/demo.html");
-
- URLConnection conn = url.openConnection();
- System.out.println(conn);
-
- InputStream in = conn.getInputStream();
-
- byte[] buf = new byte[1024];
-
- int len = in.read(buf);
-
- System.out.println(new String(buf,0,len));
之所以运行结果中响应头不见了,只能看到主体数据的原因在于:URLConnection对象已经把响应头给解析了。
六、域名解析
在浏览器中输入新浪的域名,DNS解析域名成IP,然后计算机再通过获取到的IP访问新浪服务器。
域名解析,最先走是本地的hosts(C:\WINDOWS\system32\drivers\etc\hosts)文件,解析失败了,才去访问DNS服务器解析、获取IP地址。
可以通过hosts文件可以屏蔽游戏网站内容弹出。
作者:金逗逗
来源:51CTO