1、Java在线算法编程基础,计算机网络 通信网络,网络通信协议与通信数据处理 网络协议应用 网络数据应用 网络通信编程 通信编程高级控制,网络协议应用 telnet Pop3 Smtp ftp Rmi,网络数据应用 迅雷 电驴 QQ webpage,网络通信编程 Berckly winsock,通信编程高级控制,URL URL类 URLConnection,Java网络编程 应用层编程,Instructor : Teaching Assistants: ?,Java网络编程 - Fall 2007 URL - 10,主要内容,61 HTTP协议 62 Web服务器的实现 63 Servlet 6
2、4 URL编程,Java网络编程 - Fall 2007 URL - 11,主要内容,61 HTTP协议 62 Web服务器的实现 63 Servlet,Lets go to .,Java网络编程 - Fall 2007 URL - 12,什么是HTTP协议,HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP协议的详细内容请参考RFC2616。 HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、URI、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个
3、状态行作为响应,相应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。,Java网络编程 - Fall 2007 URL - 13,HTTP请求实例,telnet localhost 8080 GET /index.html HTTP/1.1 Accept:*?* Accept-Language: zh-cn User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) Host:192.168.0.119 Connection: Keep-Alive (回车) (回车),主机与端口,请
4、求类型 (方法),URL,协议版本号,空行表示请求数据结束,Java网络编程 - Fall 2007 URL - 14,HTTP响应实例,HTTP/1.1 200 OK Server: Apache-Coyote/1.1 ETag: W/“7406-1168909194000“ Last-Modified: Tue, 16 Jan 2007 00:59:54 GMT Content-Type: text/html Content-Length: 7406 Date: Sun, 11 Nov 2007 13:28:12 GMT (回车) ,提示请求成功,服务器信息,实体类型,实体长度,实体内容(
5、网页),Java网络编程 - Fall 2007 URL - 15,HTTP协议的工作方式,TCP,HTTP请求报文,HTTP响应报文,IE、,Apache、,Java网络编程 - Fall 2007 URL - 16,HTTP请求报文,HTTP报文共有两种通用类型:请求报文,响应报文。 请求报文:包括请求行、首部,以及有时出现的主体。如图,Java网络编程 - Fall 2007 URL - 17,请求行,包括请求类型、空格、URL、空格以及HTTP版本。 请求类型:此字段定义了几种不同方法的报文。 常用的几种方法: 1:GET:客户要从服务器读取文档时使用。 2:HEAD:当客户想得到关于
6、文档的某些信息但并不是要这个文档时使用。 3:POST:当客户要给服务器提供某些信息时使用。,Java网络编程 - Fall 2007 URL - 18,请求行,统一资源定位符(URL):4要素:方法、主机、端口、路径 。 方法:用来读取文档的协议。 主机:放置信息的计算机。计算机常使用”WWW”开始的别名。 端口:服务器的端口号,可选。 路径:放置文件的路径名。,Java网络编程 - Fall 2007 URL - 19,HTTP响应报文,包括状态行、首部、有时包括主体。如图,Java网络编程 - Fall 2007 URL - 20,状态行,包括HTTP版本、空格、状态码、空格、状态短语。
7、 状态码: 100系列:提供信息的; 200系列:指示成功的请求; 300系列:把客户重定向到另一个URL; 400系列:指示客户端差错; 500系列:指示服务器端差错。,Java网络编程 - Fall 2007 URL - 21,状态行,状态短语:用来解释状态码。,Java网络编程 - Fall 2007 URL - 22,主要内容,61 HTTP协议 62 Web服务器的实现 63 Servlet,Lets go to .,Java网络编程 - Fall 2007 URL - 23,HTTP服务器的工作流程,绑定80端口,监听客户端(通常是浏览器)的TCP连接; 当有客户端来连接时,创建套
8、接字,准备接收客户端发来的请求报文; 分析请求报文,并根据分析结果发送响应报文和实体内容给客户端; 客户端关闭套接字,一次HTTP通信结束。,SimpleHTTPServer,HTTPRequest,Java网络编程 - Fall 2007 URL - 24,SimpleHTTPServer,class SimpleHTTPServer public static void main(String args) ServerSocket server; Socket clientconnection; HTTPRequest request;try server = new ServerSock
9、et(80); while (true) clientconnection = server.accept();request = new HTTPRequest(clientconnection); request.process(); catch (Exception e) System.err.println(“Unable to start SimpleHTTPServer: “ +e.getMessage();e.printStackTrace(); ,绑定端口,处理请求,监听用户连接,Java网络编程 - Fall 2007 URL - 25,HTTPRequest,class H
10、TTPRequest private Socket clientconnection;public HTTPRequest(Socket clientconnection) this.clientconnection = clientconnection;public void process() / Obtain the client connections input and output streamstry PrintStream os = new PrintStream(clientconnection.getOutputStream();BufferedReader br = ne
11、w BufferedReader(new InputStreamReader(clientconnection.getInputStream();,准备接收数据,Java网络编程 - Fall 2007 URL - 26,HTTPRequest,/ Read the HTTP request lineString request = br.readLine().trim();/ Parse the requested method and resource from the request lineStringTokenizer st = new StringTokenizer(request
12、);/ Read in the methodString header_method = st.nextToken();/ Check if we support the methodif (!header_method.equals(“GET“) os.print(“HTTP/1.0 501 Not Implementedrn“);os.flush();return;,获取请求类型,Java网络编程 - Fall 2007 URL - 27,HTTPRequest,/ Read in the uriString header_uri = st.nextToken();/ Read the h
13、eader linesStringBuffer responseDocument = new StringBuffer();responseDocument.append(“rnrnMy HTTP Serverrnrnrn“);responseDocument.append(“);/ Now we return the responseos.print(“HTTP/1.0 200 OKrn“);os.print(“Content-type: text/htmlrnrn“);os.print(responseDocument);os.flush();,获取uri,生成HTML,发送响应报文,Ja
14、va网络编程 - Fall 2007 URL - 28,HTTPRequest,header_uri=new File(“.“).getCanonicalPath()+header_uri.replace(“/“,File.separator); if (new File(header_uri).exists() String s;BufferedReader brf = new BufferedReader(new InputStreamReader(new FileInputStream(header_uri);while(s=brf.readLine()!=null)responseDo
15、cument.append(s+“rn“); brf.close(); ,从文件中获取HTML,Java网络编程 - Fall 2007 URL - 29,常见的Web服务器,Java网络编程 - Fall 2007 URL - 30,主要内容,61 HTTP协议 62 Web服务器的实现 63 Servlet,Lets go to .,Java网络编程 - Fall 2007 URL - 31,扩展Web服务器的能力,前面所给的Web服务器只有返回静态页面的能力,即原封不动的将一个HTML文件的内容返回给客户端;(URI映射到文件) 为了使服务器能够根据运行时的具体情况,动态生成HTML页面
16、,必须对其进行扩展。 实现的方法就是:,将URI映射 到相应的类,调入相应的 类并执行,Java网络编程 - Fall 2007 URL - 32,扩展Web服务器的能力,CGI,HTTPRequest,HelloCGI,MyCGI,Java网络编程 - Fall 2007 URL - 33,HTTPRequest,else if (suffix.equals(“cgi“)String classname=“http.“+header_uri.substring(header_uri.lastIndexOf(“/“)+1,header_uri.lastIndexOf(“.“);BaseCGI
17、cgi= (BaseCGI)(Class.forName(classname).newInstance();cgi.setResponse(responseDocument);cgi.doSomething(); ,Java网络编程 - Fall 2007 URL - 34,CGI,package http; public interface CGI public void doSomething();public void setResponse(StringBuffer responseDocument); ,Java网络编程 - Fall 2007 URL - 35,BaseCGI,pa
18、ckage http; public class BaseCGI implements CGIStringBuffer responseDocument;public void doSomething() public void setResponse(StringBuffer responseDocument)this.responseDocument=responseDocument; ,Java网络编程 - Fall 2007 URL - 36,HelloCGI,package http; public class HelloCGI extends BaseCGIpublic void
19、doSomething() responseDocument.append(“rnrnMy HTTP Serverrnrnrn“);responseDocument.append(“Hello,CGI“);responseDocument.append(“rn“); ,Java网络编程 - Fall 2007 URL - 37,MyCGI,public void doSomething() responseDocument.append(“rnrnMy HTTP Serverrnrnrn“);Random r=new Random();int a=(Math.abs(r.nextInt()%1
20、0);int b=(Math.abs(r.nextInt()%10); responseDocument.append(“+a+“+“+b+“=“+(a+b)+“); responseDocument.append(“rn“); ,Java网络编程 - Fall 2007 URL - 38,常见的应用服务器,Java网络编程 - Fall 2007 URL - 39,Servlet技术,一个容器中只会有一个servlet实例,Java网络编程 - Fall 2007 URL - 40,HTTPServlet,Java网络编程 - Fall 2007 URL - 41,创建Web工程,Java网
21、络编程 - Fall 2007 URL - 42,创建Servlet,public class LoginServlet extends javax.servlet.http.HttpServlet protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException doPost(request,response); protected void doPost(HttpServletRequest request, HttpServ
22、letResponse response) throws ServletException, IOException ,Java网络编程 - Fall 2007 URL - 43,创建Servlet,response.setContentType(“text/html; charset=GBK“);PrintWriter out=response.getWriter();if (request.getParameter(“usr“).equals(“servlet“) ,Java网络编程 - Fall 2007 URL - 44,两种请求方式,GET:http:/localhost:8080/
23、MyWeb/LoginServlet?usr=servlet&pwd=111 POST:,Java网络编程 - Fall 2007 URL - 45,Web.xml(url - class),MyServletMyServletmyweb.MyServletMyServlet/MyServlet,Class.forname(),Java网络编程 - Fall 2007 URL - 46,主要内容,62 Web服务器的实现 63 Servlet 64 URL编程,Lets go to .,Java网络编程 - Fall 2007 URL - 47,URL,http:/ URL is an acr
24、onym(首字母缩拼词 ) for Uniform Resource Locator and is a reference (an address) to a resource on the Internet.,Java网络编程 - Fall 2007 URL - 48,创建URL,try URL myURL = new URL(. . .) catch (MalformedURLException e) . . ./ exception handler code here. . . ,url无效时产生,Java网络编程 - Fall 2007 URL - 49,URI与URL,对于url:h
25、ttp:/ world/ 采用URL:URL url = new URL(“http:/ 采用URI:URI uri = new URI(“http“, ““, “/hello world/“, “); 将URI转换成URL:URL url = uri.toURL();,空格,Java网络编程 - Fall 2007 URL - 50,分析URL,import .*; import java.io.*; public class ParseURL public static void main(String args) throws Exception URL aURL = new URL(“
26、http:/:80/docs/books/tutorial“+ “/index.html?name=networking#DOWNLOADING“);System.out.println(“protocol = “ + aURL.getProtocol();System.out.println(“authority = “ + aURL.getAuthority();System.out.println(“host = “ + aURL.getHost();System.out.println(“port = “ + aURL.getPort();System.out.println(“pat
27、h = “ + aURL.getPath();System.out.println(“query = “ + aURL.getQuery();System.out.println(“filename = “ + aURL.getFile();System.out.println(“ref = “ + aURL.getRef(); ,Java网络编程 - Fall 2007 URL - 51,读取URL,import .*; import java.io.*; public class URLReader public static void main(String args) throws E
28、xception URL yahoo = new URL(“http:/ in = new BufferedReader(new InputStreamReader(yahoo.openStream();String inputLine;while (inputLine = in.readLine() != null)System.out.println(inputLine);in.close(); ,Java网络编程 - Fall 2007 URL - 52,连接URLURLConnection,try URL yahoo = new URL(“http:/ yahooConnection
29、= yahoo.openConnection();yahooConnection.connect(); catch (MalformedURLException e) / new URL() failed. . . catch (IOException e) / openConnection() failed. . . ,Java网络编程 - Fall 2007 URL - 53,URLConnection读取数据,import .*; import java.io.*; public class URLConnectionReader public static void main(Stri
30、ng args) throws Exception URL yahoo = new URL(“http:/ yc = yahoo.openConnection();BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream();String inputLine;while (inputLine = in.readLine() != null) System.out.println(inputLine);in.close(); ,Java网络编程 - Fall 2007 URL - 54,URLCo
31、nnection写数据,URL url = new URL(args0); URLConnection connection = url.openConnection(); connection.setDoOutput(true); OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(); out.write(“string=“ + stringToReverse); out.close();,Java网络编程 - Fall 2007 URL - 55,发送GET请求,/ Construct th
32、e full GET request String finalURL = baseURL + arguments; URL url = new URL(finalURL);/ Open a connection InputStream input = url.openStream();,Java网络编程 - Fall 2007 URL - 56,发送POST请求,URL url = new URL( baseURL ); / Get a URLConnection object, to write to POST method URLConnection connect = url.openC
33、onnection(); / Specify connection settings connect.setDoInput(true); connect.setDoOutput(true); / Get an output stream for writing OutputStream output = connect.getOutputStream(); / Create a print stream, for easy writing PrintStream pout = new PrintStream (output); pout.print ( query ); pout.close(
34、);,Java网络编程 - Fall 2007 URL - 57,HttpURLConnection,HttpURLConnection conn=(HttpURLConnection)url.openConnection(); conn.setDoOutput(true); conn.setRequestMethod(“POST“); DataOutputStream out = new DataOutputStream(conn.getOutputStream(); / 要传的参数 String content = URLEncoder.encode(“usr“, “UTF-8“) + “
35、=“+ URLEncoder.encode(“servlet“, “UTF-8“); content += “,Java网络编程 - Fall 2007 URL - 58,作业(10分),通过一个请求/响应的实例描述HTTP协议的工作过程。(5分) 什么是URL?举例说明URL的各个部分的含义。(3分) 常见的应用服务器有哪些,应用服务器与Web服务器的区别在哪里?(2分),Java网络编程 - Fall 2007 URL - 59,下一章: RMI,THE END,(1) URL ( String url) /url代表一个绝对地址,URL对象直接指向这个资源,如:URL urll=new
36、URL(http:/); (2) URL ( URL baseURL , String relativeURL) / 其中,baseURL代表绝对地址, URL lib = new URL (“http“ , , 80 , “/ test / test.asp“);,relativeURL代表相对地址。如: URL urll=new URL(http:/); URL lib=new URL(urll , “library / library.asp“); (3) URL ( String protocol , String host , String file) /其中,protocol代表通
37、信协议,host代表主机名,file代表文件名。如: new URL (“http“ , , “/ test / test.asp“); (4) URL ( String protocol , String host , int port , String file),获取URL对象的属性 getDefaultPort(): 返回默认的端口号。 getFile(): 获得URL指定资源的完整文件名。 getHost(): 返回主机名。 getPath(): 返回指定资源的文件目录和文件名。,getPort(): 返回端口号,默认为-1。 getProtocol(): 返回表示URL中协议的字符
38、串对象。 getRef(): 返回URL中的HTML文档标记,即#号标记。 getUserInfo: 返回用户信息。 toString: 返回完整的URL字符串,包可以用32位int形式来操作32位的IP地址(即Internet主机地址)。类InetAddress实际上是可以把Internet地址换算成代表该地址的对象。Java就是靠这个类来显示Internet地址已经相关信息的。 InetAddress有以下常用方法: getAddress(): 返回IP地址的字节形式。,getAllByName(): 返回指定主机名的IP地址。 getbyAddress(): 返回指定字节数组的IP地址形式。 getByName(): 返回指定主机名的IP地址对象。 getHostAddress(): 返回主机地址的字符串形式。,getLocalHost(): 返回当前主机名。 hastCode(): 返回InetAddress对象的哈希码。 toString: 返回地址转换成的字符串。 InetAddress类没有提供返回构造函数,所以不能用new()方法来创建它的对象,而只可以调用静态方法getLocalHost()、getByName()、getByAddress()等来生成InetAddress类的实质。,网络窃听器 网络爬虫 网络后门 P2P,