java中讲讲URL的用法

URL类的实例
马克-to-win:URL(Uniform Resource Locator-----一致资源查找器)它用来指向Internet上的资源文件,比如 http://java.sun.com:8080/docs/introdiction.htm net包中的URL类提供API来访问Internet上的信息。
比如以上的URL中:马克- to-win:马克 java社区:防盗版实名手机尾号: 73203。
1)协议:http
2)IP 地址或主机名:java.sun.com
3)端口号:8080
4)实际文件路径:docs/introdiction.htm



例:2.4.1
/*no need to have network through to run the program.*/
import java.net.*;
import java.io.*;
public class TestMark_to_win {
    public static void main(String[] args) throws Exception {
        /* Class URL represents a Uniform Resource Locator, a pointer to a
         * "resource" on the World Wide Web. A resource can be something as
         * simple as a file or a directory, public URL(String spec)throws
         * MalformedURLException: Creates a URL object from the String
         * representation.
         */
        URL aURL = new URL("http://java.sun.com:8080/docs/books/"
                + "tutorial/index.html");
        System.out.println("protocol = " + aURL.getProtocol());
        System.out.println("host = " + aURL.getHost());
        System.out.println("filename = " + aURL.getFile());
        System.out.println("default port = " + aURL.getDefaultPort());
        System.out.println("port = " + aURL.getPort());
    }
}

输出结果:

protocol = http
host = java.sun.com
filename = /docs/books/tutorial/index.html
default port = 80
port = 8080




例:2.4.2

/* This program needs an open connection to run.
*/
import java.net.*;
import java.io.*;
import java.util.*;
public class TestMark_to_win {
    public static void main(String[] args) throws Exception {
        URL yahoo = new URL("https://www.oracle.com/index.html");
        /* public URLConnection openConnection() throws IOException: Returns a
         * URLConnection object that represents a connection to the remote
         * object referred to by the URL.
         */
        URLConnection yahooConnection = yahoo.openConnection();
        /* public long getLastModified() Returns the value of the last-modified
         * header field. The result is the number of milliseconds since January
         * 1, 1970 GMT.
         */
        System.out.println("content LastModified"
                + new Date(yahooConnection.getLastModified()));
        /*public InputStream getInputStream()throws IOException: Returns an
         * input stream that reads from this open connection.
         */
        // DataInputStream in = new
        // DataInputStream(yahooConnection.getInputStream());
        BufferedReader in = new BufferedReader(new InputStreamReader(
                yahooConnection.getInputStream()));
        String inputLine;
        for (int i = 0; i < 25; i++) {
            inputLine = in.readLine();
            System.out.println(inputLine);
        }
        in.close();
    }
}

输出结果:

content LastModifiedTue Mar 27 06:23:25 CST 2018


<!DOCTYPE html>

<html lang="en-US" class="no-js">

<!-- BEGIN:  Compass/HomePage3 -->

<!--  BEGIN:  Compass/HomePage3/Head-HTML -->

<head>

    <title>Oracle | Integrated Cloud Applications and Platform Services</title>
    <meta name="Title" content="Oracle | Integrated Cloud Applications and Platform Services">
  
        <meta name="Description" content="Oracle offers a comprehensive and fully integrated stack of cloud applications and platform services.">
  
    <meta name="Keywords" content="enterprise, applications, software, database, middleware, fusions, business, hardware, Oracle">  
  
  
    <meta name="robots" content="index, follow">






后序及提高:
 
我们先给大家普及一下同步和异步的概念。 引自百度百科:同步指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系。
同步(英语:Synchronization),指对在一个系统中所发生的事件(event)之间进行协调,在时间上出现一致性与统一化的现象。例如,你想将32轨的音频信号录制在两台16轨磁带机上,则这两个磁带机的磁带传送轴就需要锁定在一起,这个过程就称为同步。如果这两个设备没有进行同步,无论它们开始的时间多么一致,也会由于两台设备机械结构的差异而产生时间漂移 。


异步是指用户程序执行IO操作后便开始做自己的事情,当IO操作已经完成的时候,会得到IO完成的通知。用户程序再接着干。一点儿事儿都不耽误。

心跳,长连接,短连接的关系: 连接建立后,如果不断开连接,缺省就是“长连接”,不需要发送数据来保持连接。但网上总说要发“心跳”来维持长连接?为什么?因为有些监听所有端口的防火墙或者电脑管理软件会把超过一定时间没有数据传输的连接当作死连接,这些软件会自动将死连接断开。当有心跳时,不会被这类软件当做死连接。短连接表示当需要与目标通信时创建连接,通讯一结束立刻断开。

TCP设计内部包含了心跳信号。 但是这个心跳信号和平台相关,且默认关闭。我们尽量不要依赖这个功能。

udp用于传输视频流,音频流或传感器流等,少传数据没事。大不了花屏,沙沙声等。如需确认对方还在线,则也需心跳。有时在你的手机上可以设置一个指示灯,如对方在线,可让等亮着,如不在线了,可让灯灭着。比如有时心情不好,即使在线,也不说话。所以没数据,但有心跳。

bio,nio和AIO区别:
马克-to-win:我们这章讲的io,实际上是bio,即blocked io(阻塞式io)。sun公司推出bio以后,用户马上就反应,这种bio在多用户时效率比较低。sun公司在1.4版本马上推出了nio,所谓的new io和后来的AIO(异步IO)。

AIO异步非阻塞IO:
   在此种模式下,用户进程只需要发起一个IO操作然后立即返回,等IO操作真正的完成 以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,因为真正的IO读取或者写入操作已经由 内核完成了。

这么看貌似异步应该比同步的效率高,但是实际性能测下来,并不一定是这样。因为异步要想完成,需要一些额外的线程去工作,这一定会花费额外的资源。

马克-to-win:后来在实际的工作当中,人们发现nio好是好,但使用起来非常困难。有的工程师花了半年以上的时间,终于把自己的nio系统磨合的非常精湛了。突然发觉java界又出了一个新的东西,叫做netty。就是有人觉得nio不好使,把他封装成了一个新技术叫netty。那些使用nio的工程师大呼太坑人了。后来很多人就转向了netty。使了一段时间,发觉业内又出了一个新的东西叫vert.x。这个技术是又把netty封装了一下。里面还有一些aio的东西。这就是java行业状况。更新换代非常快。 

我们的策略是把bio学好,基础打牢,之后什么在当时找工作时流行学什么。这就是我的前沿课程有几十门的原因。




作业:
1) 查找某个www.microsoft.com的IP地址。
2)检查http://www.microsoft.com:8080/docs/books/属性。
3)把www.263.com的内容前三行存在一个文件中。
4)用Socket和datagram, 同时实现密码验证。

课外作业:
5)医院系统:肚子疼可能是什麽病?感冒?结石?(在服务器端有一文件存着这些信息)
6)请做一个Web服务器,客户端能打印出一个html文件。

大作业:
编写仿安卓的网络异步回调底层实现代码(AsynNetUtils和handler等),思路:网上有很多异步回调代码,但都是在同一台机器上,找不到在不同机器之间如何异步回调?这里提供一个思路,客户端在主线程发送完消息以后,(启动一额外线程去监听端口动向,当有数据进来时,就回调自己的某一方法即可)同时主线继续该干什么干什么。编写时可参考我参考目录下的网页。

项目一:
做一个类似百度后端爬虫的程序。
在bat3 家巨头公司中,腾讯和阿里的程序的理念并不难理解,阿里主要是电子商务网站,我们在后面的网站学习当中,可以模仿制作类似这样的项目。腾讯的聊天儿程序我们可以在后面的课外阅读当中看到。最后只剩下百度的后台爬虫程序,貌似比较难做。我们这个项目的目标就是做这件事。爬虫的原理是这样的,给定一个网页,我们通过解析,发现里面有五个url,先把这五个url放在未完成url队列里,我们可以按照宽度搜索的算法,把第一个url网页下载下来,把他里面的六个 url再放在未完成url队列里,处理过的url放在数据库中,把那个url的标题和关键字甚至内容也都存下来。当用户在浏览器中输入关键字时,你就在数据库中找到符合关键字的url,把它返回回来,当用户点击你的url时,用户就可以进入网页了。




项目2:
做一个类似于tomcat的服务器。在客户端的窗口里敲入192.168.1.4:8888/servlet1 mark就能执行另外一台机器上,我们监听8888端口的服务器程序,它会用反射方法执行bin目录下的servlet1的doGet方法接受mark作为输入参数,且返回hello mark作为返回值返回到客户端机器上。
拓展思考,如果输入参数是一段代码的话,你的doGet方法,完全可以上一章的发明自己语言一样,把代码写入到一个文件当中,运行它,这就是后门的原理。我们的课程不讨论后门的制作,但通过我上面对后门原理的提及,我们重点要讲的是对后门的防范。如果你的公司把程序外包出去,外包程序员设计一个后门,他紧接着可以再制作一段木马,于是就可以肆意妄为了。对后门的防范,比如他可以在doGet当中,加上一个参数判断,比如当有mark这个参数值时,才运行他那个后门程序。正常的谁也不会用这个参数。360等防病毒软件,也会认为你这个程序,就是正常的用户逻辑,也查不出来。所以最后的结论是,如果想防后门,唯有进行源代码级别行行筛查。才能彻底杜绝后门。接着咱们讲木马。最新的木马完全可以用纯javascript编写。javascript完全正规的放在网页当中。不用额外下载任何东西。结论,要想防木马,所以尽量不要访问非正规网站。但如果一个正规网站被黑客破解,把网页中间加了一段儿javascript。那你就只能自认倒霉了。


课外阅读:
以下的例子,是一个服务器对多个客户端。我们的客户端程序可以运行很多遍,代表多个客户。

/*in this frame work, many clients can access the server with many thread and many socket using only one port,
bbb client use bbb socket with bbb thread, by default, one port can accept 50 socket. */


import java.net.ServerSocket;
import java.io.*;
import java.net.Socket;

public class ThreadServers {

public static void main(String[] args) {
try {
/* public ServerSocket(int port)
throws IOExceptionCreates a server socket, bound to the specified port.
The maximum queue length for incoming connection indications (a request to connect) is set to 50. If a connection indication
arrives when the queue is full, the connection is refused.


public ServerSocket(int port,int backlog)
throws IOException Creates a server socket and binds it to the specified local port number, with the specified backlog.
The maximum queue length for incoming connection indications (a request to connect) is set to the backlog parameter. If a connection
indication arrives when the queue is full, the connection is refused.

*/
ServerSocket ss = new ServerSocket(8089);
for(;;){
/* here this ServerSocket can accept unlimited client socket.every time after
it accept one, it just come back from the loop, and block here on accept statement.
a new client corresponds to a new socket */
Socket s = ss.accept();
/* this reader get data from socket, then print in the console.
a new client corresponds to a new thread */
ReadThread reader = new ReadThread(s);
// WriteThread writer = new WriteThread(s);

/* WriteThread get the input from console, then write it to the network. */
reader.start();
/*in this case, we have to comment out the following statement because if there
are two clients, if we type in characters in the console, which clients do we
type in to send out to? so the example is made easier not to server to send
out, to make it work, you can make the server to pop up two windows, then one window
corresponds to one client, in window, if you type in some characters, you send them to this client. */
// writer.start();
}
}
catch (IOException ex) {
ex.printStackTrace();
}
}

}

 




以下是客户端程序:

import java.net.Socket;
import java.net.*;
import java.io.*;

public class ThreadClients {

public static void main(String[] args) {
Socket s = null;
try {
/*a new client corresponds to a new socket*/
s = new Socket("localhost", 8089);
/* this reader get data from socket, then print out in the console. */
/* WriteThread get the input from console, then write it to the network. */
// ReadThread reader = new ReadThread(s);
/*a new client corresponds to a new thread*/
WriteThread writer = new WriteThread(s);
// reader.start();
writer.start();
}
catch (Exception ex) {
ex.printStackTrace();
}


}

}

 

/*this reader get data from socket, then print in the console. */


import java.net.Socket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.*;

public class ReadThread extends Thread {
private Socket socket;
public ReadThread(Socket socket) {
this.socket = socket;
}
public void run(){
try {
BufferedReader in = new BufferedReader
(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
while(true){
String line = in.readLine();
out.println(line+" coming back from server");
System.out.println(line);
}
}
catch (IOException ex) {
ex.printStackTrace();
}
}
}

 

/*WriteThread get the input from console, then write it to the network.*/




import java.net.Socket;
import java.io.PrintWriter;
import java.io.*;

public class WriteThread extends Thread {
private Socket socket;
public WriteThread(Socket socket) {
this.socket = socket;
}
public void run(){
try {
/*PrintWriter(OutputStream out, boolean autoFlush)
Create a new PrintWriter from an existing OutputStream.
public PrintWriter(Writer out,boolean autoFlush) Create a new PrintWriter.
autoFlush - A boolean; if true, the println() methods will flush the output buffer */
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader inn = new BufferedReader
(new InputStreamReader(socket.getInputStream()));
BufferedReader in =new BufferedReader(new InputStreamReader(System.in));
for(;;){
String line = in.readLine();
out.println(line);
String linen = inn.readLine();
System.out.println(linen);

}
}
catch (IOException ex) {
}
}
}

 
when run,start server, then start several clients.