java第九节 网络编程的基础知识
/** * * 网络编程的基础知识 * 网络协议与TCP/IP * IP地址和Port(端口号) * 本地回路的IP地址:127.0.0.1 * 端口号的范围为0-65535之间,0-1023之间的端口数是用于一些知名的网络服务和应用 * UDP与TCP * TCP,传输控制协议(Transmission Control Protocol),是面向连接的通信协议 * UDP,用户数据报协议(User Datagram Protocol),是无连接通信协议 * * TCP UDP的数据帧格式简单图例 * 协议类型 源IP 目标IP 源端口 目标端口 帧序号 帧数据 * 基中协议类型用于区分TCP, UDP * * Socket * Socket是网络驱动层提供给应用程序编程的接口和一种机制 * 可以把Socket比喻成是一个港口码头,应用程序只要把货物放到港口码头,就算完成了货物的运送 * 应用程序只需要等待货物到达码头后,将货物取走 * * Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己对应的IP和Port * * Socket数据发送过程 * 1 产生Socket->应用程序 * 2 应用程序(调用bind将Socket的信息通知给驱动程序)->驱动程序 * 3 驱动程序(驱动程序根据从网卡传送来的数据报中的指定目标端口号,将处理后的数据传送到相应的Socket中)->Socket * 4 Socket(应用程序从Socket中取数据) -> 应用程序 * * * Java中的网络编程类 * 位于java.net包中 * DatagramSocket类用于UDP通信 * ServerSocket类用于TCP通信的服务器端 * Socket类用于TCP通信的服务器和客户端 * * * UDP网络程序 * DatagramSocket类 * 构造函数 * public DatagramSocket() * public DatagramSocket(int port) * public DatagramSocket(int port, InetAddress laddr) * close方法 * send(DatagramPacket p)方法 * receive(DatagramPacket p)方法 * * DatagramPacket类 * 如果把DatagramSocket比作创建和港口码头,那么DatagramPacket就是发送和接收数据的集装箱, * 构造函数: * public DatagramPacket(byte[] buf, int length) * public DatagramPacket(byte[] buf, int length, InetAddress address, int prot) * getInetAddress和getPort方法 * getData和getLength方法 * * InetAddress类 * InetAddress是用于表示计算机IP地址的一个类,而在日常应用中的计算机地址是用"" * * 最简单的UDP程序 * 字符串与字节数组之间的双向转换 * UDP接口程序必须先启动运行,才能接口UDP发送程序发送的数据, * 用start命令来打开新命令行窗口的好处 * 解决发送中文字符串的问题 * * * 用UDP编写网络聊天程序 * 1 在这个列表框中显示所有接收到的消息 * 2 在这个文本框中输入对方的IP地址 * 3 在这个文本框中输入要发送给对方的消息,按回车后发送 * 分不三全步骤来完成: * 1 编写图形用户界面 * 2 编写网络消息发送功能 * 3 编写网络消息接收功能 * 几个问题: * 1 这个网络程序能够自己给自己发送数据吗? * 2 如何发送广播数据? * 3 这个程序可以在Interent上使用吗?使用私有IP并通过网关代理上网的计算机呢? * * 私有IP通过网关代理上网的原理 * * * TCP网络程序 * TCP网络程序的工作原理 * ClientlSocket -> 客户端发出连接 ServerSocket * 服务器接受请求并创建新的Socket -> 为client创建Socket * 两个Socket之间建立专线连接 * * TCP客户端程序与TCP服务器端程序的交互过程: * 1 服务器程序创建一个ServerSocket,然后调用accept方法等待客户来连接 * 2 客户端程序创建一个Socket并请求与服务器建立连接 * 3 服务器接收客户的连接请求,并创建一个新的Socket与该客户建立专线连接 * 4 建立了连接的两个Socket在一个单独的线程(由服务器程序创建)上对话 * 5 服务开始等待新的连接请求,当新的连接请求到达时,重复步骤(2)到步骤(5)的过程 * * * ServerSocket类 * 构造函数: * public ServerSocket(); * public ServerSocket(int port) * public ServerSocket(int port, int backlog) * public ServerSocket(int port, int backlog, InetAddress bindAddr) * close()方法 * accept方法 * * * Socket类 * 构造函数: * public Socket(); * public Socket(String host, int port) * public Socket(InetAddress address, int port) * public Socket(String host, int port, InetAddress localAddr, int localPort) * public Socket(InetAddress address, int port, InetAddress localAddr, int localPort) * getInputStream和getOutputStream方法 * * * 简单的TCP服务器程序 * TCP服务程序必须先启动运行,TCP客户程序才能连接TCP服务器 * 使用Windows提供的telnet程序测试TCP服务器程序 * 使用BufferedReader包装类,从网络输入流中一次读取一行文本 * 如何打开telnet程序的本地回显功能 * * * * 完善的TCP服务器程序模型 * 编程实例: * 服务器程序能够同时与多个客户端会话,客户端每次向服务器发送一行字符文本,服务器就将这行字符文本中的所有字符反向排列反回送给客户端,当客户端向服务器发送的一行字符文本内容为"quit"时, * 服务器结束与客户端的会话 * * TCP服务器程序模型的编写要点: * TCP服务器程序要想能接收多个客户端连接,需要循环调用ServerSocket.accept方法 * 服务器程序与每个客户端连接的会话过程不能互想影响,需要在独立的线程中运行 * 一个线程服务对象与一个服务器端Socket对象相关关联,共同来完成与一个客户端的会话 * * * 如何检测和解决端口冲突问题 * 合用netstat命令查看当前正在被使用的TCP端口号 * 通过一个配置参数来指定TCP服务程序所使用的端口号 * * * TCP客户端程序 * 编程实例: * 编写一个与上面的服务器程序通信的客户端程序 * 要点: * 连接服务器的IP地址和端口号不要固定编写在程序代码中,而是通过程序的运行时参数来指定,以提供较好的灵活性和高的通用性 * * * * 通过TCP程序在网络上传递对象 * ObjectInputStream和ObjectOutputStream可以从底层输入流中读取对象类型的数据和将对象类型的数据写入到底层输出流 * * 使用ObjectInputStream和ObjectOutputStream来包装低层网络字节流,TCP服务器和TCP客户端之间就可以传递对象类型的数据 * * 编程实例:通地网络传输Java对象 * * 怎么理解应用程序协议和网络通信协议的的关系 * 怎么区分ASP, JSP与网络编程的概念 * * 访问Internet网络资源 * java.net包中还有URL, URLDeconder, URLEncoder, URLConnection, HttpURLConnection等类 * * 本节讲解的内容 * URL(统一资源定位符) * HTTP协议 * URL类 * 工厂设计模式 * URLConnection和HttpURLConnection类 * * URL(Uniform Resource Locator) * URL的基本组成:协议,主机名,端口名,资源名 * 例如:http://www.ituji.cn:8080/index.html * * 相对URL,例发"/a.html" "./a.html" "../../a.html" "a.html" * * URL编码规则 * 将空格转换为加号(+) * 对0-9 a-z A-Z之间的字符保持不变 * 对于所有其他的字符,用这个字符的当前字符集编码在内存中的十六进制格式表示, * 并在每个字节前加上一个百分号(%),如字符"+"用%2B表示,字符"="用%3D表示,字符"&"用%26表示,每个中文字符在内存占两个字节,字符“中”用%D6%D0表示,字符"国"用%B9%FA表示 * 对于空格也可以直接使用其十六进制编码方式,即用%20表示,而不是将它转换成加号(+). * java.net包中提共了URLEncoder和URLDecoder这两个类,来实现URL编码和解码 * * * HTTP协议的会话过程 * 基于HTTP1.0协议的客户机与服务器的信息交换过程 * 建立连接->发出请求信息->发出响应信息->关闭连接 * * 基于HTTP1.1协议的客户机与服务器信息交换过程 * 建立连接->发出第一次请求->发出第N次请求->发出关闭连接请求->关闭连接 * * HTTP请求消息 * 一个完整的请求消息包括:一个请求行,若干消息头,以及实体内容. * 例如: * GET /articles/news/today.aps HTTP/1.1 * Accept:* * Accept-Language:en-us * Connection: Keep-Alive * Host:location * Referer: http://localhost/links.aps * User-Agent: Mozilla/4.0(compatible; MSIE 5.5; Windows NT5.0) * Accept-Encoding:gzip, deflate * * HTTP响应消息 * 一个完整的响应消息包括:一个状态行,若干消息头,以及实体内容 * 例如: * HTTP/1.1 200 OK * Server: Microsoft-IIS/5.0 * Date: Thu, 13 Jul 2000 05:46:53 GMT * Content-Length: 2291 * Content-Type:text/html * Set-Cookie: XXXXX; path=/; * Cache-control:private * * <HTML> * ................ * </HTML> * * 了解几个HTTP消息头 * Connection * 用于指定处理完本次请求/响应后,客户端与服务器是否继承保持连接,设置值可以为Keep-Alive和close * Accept-Language * 用于指出客户机期望服务器返回的文档所使用的国家语言,可以指定多个以逗号分隔的国家语言 * Content-Length * 用于表示实体内容的长度(字节数) * Range * 用于指定服务器只需要返回文档中的部分内容及内容范围,有以下几种使用格式 * 1): Range: bytes=100-599 请求服务器从100到599值 * 2): Range: bytes=100- 请求服务器返回从100开始的值 * 3): Range: bytes=-100 请求服务器返回最后100个值 * Content-Range: * 用于指定服务器返回的部分实体内容的位置信息,例如: * Content-Range: bytes 2543-4532/7898 * * URL类 * 构造函数(都可引发MalformedURLException异常) * public URL(String spec) * public URL(String protocol, String host, int port, String file) * public URL(String protocol, String host, int prot, String file, URLStreamHandler handler) * public URL(URL context, String spec) * * getProtocol, getHost, getPort, getFile等方法 * * openConnection方法返回URLConnection对象 * * 工厂设计模式 * URL类的setURLStreamHandlerFactory(URL StreamHandlerFactory fac)静态方法 * * StreamHandlerFactory类的createURLStreamHandler(String protocol)方法 * * * URLConnection与HttpURLConnection类 * URLConnection与HttpURLConnection的作用 * URLConnection的连接过程 * setRequestProperty方法 * getHeadFields方法 * getInputStream和getOutputStream方法 * getHeaderFiled, getContentLength, getContentEncoding, getContentType等方法 * 一个HTTP连接可以被多个HttpURLConnection实例对象共享,调用HttpURLConnection的disconnect方法可以关闭低层共享网络 * * 编程实例:将访问www.google.com站点的HTTP请求消息的Accept-Language头分别设置成日文和中文后,然后打印出www.google.com站点返回的所有响应消息头和网页内容 * * * 思考与实践(1) * 1 描述TCP, UDP数据帧格式,并比较TCP和UDP的区别 * 2 画图说明应用程序, Socket, 网络驱动程序之间的数据传送过程与工作关系 * 3 自己编写出UDP网络聊天程序 * 4 将完善的TCP服务器程序模型例子程序中的Servicer类中的向客户端输出的语句: * pw.println(strWord+"--->"+strEcho); * 使用下面两条语句中的任何一条替换 * pw.print(strWord+"--->"+strEcho+"\r\n"); * pw.print(strWord+"--->"+strEcho+System.getProperty("line.separator")); * 客户端都接受不到服务器端的响响信息,这是为什么呢? * 5 修改完善的TCP服务器程序模型例子程序,让用户可以在启动运行服务器程序时,通过程序参数指定的监听端口号并且,用户指定的端口号被保存到一个文件中 * 当服务器程序下次启动运行时,直接从文件中读取那个端口号作为监听端口号 * 6 查阅HTTP协议资料,编写一个简单的web服务器 * 7 利用HTTP协议的Range的Content-Range消息头,URL的HttpURLConnection类,编写一个能实现HTTP断点续传的客户端程序 * * * * @(#)lesson9.java * * lesson9 application * * @author * @version 1.00 2013/9/1 */ public class lesson9 { public static void main(String[] args) { // TODO, add your application code System.out.println("Hello World!"); } }