- 网络编程与网页编程的区别:
- 网络编程关注的是我们的底层数据传输。
- 网页编程关注的是与客户的交互。
- jsp,servelt,html
- 不是一个概念。
- 什么是计算机网络:
- 把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息,共享硬件、软件、数据信息等资源。
- 将不同区域的计算机连接到一起
- 局域网,城域网,互联网
- 计算机网络的主要功能
- 资源共享
- 信息传输与集中处理
- 均衡负荷与分布处理
- 综合信息服务 (www/综合业务数字网络 ISDN)
- 地址:
- IP地址:确定网络上的一个绝对的地址。
- 相当于房子地址。
- 端口号:
- 区分计算机上的软件。
- 相当于我们生活中的很多房门。2个字节:0~65535 共65536个。
- 在同一个协议下端口号不能重复,反之可以。比如TCP/UDP
- 建议1024以下的不要使用,是给主流软件预留。80->http 21->ftp
- 资源定位:
- URL统一资源定位
- URI 统一资源
- 数据传输:
- 协议
- TCP 电话,三次握手,面向连接,安全可靠。效率相对低下。
- UDP短信,非面向连接,效率高。
- 传输:
- 先封装
- 后拆封
- 协议
- 什么是网络通信协议
- 计算机网络中实现通信必须有一些约定即通信协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准。
- 网络通信接口
- 为了使两个结点之间能进行对话,必须在它们之间建立通信工具(即接口),使彼此之间 能进行信息交换。接口包括两部分:
- 硬件装置: 实现结点之间的信息传送
- 软件装置: 规定双方进行通信的约定协议
- 为了使两个结点之间能进行对话,必须在它们之间建立通信工具(即接口),使彼此之间 能进行信息交换。接口包括两部分:
- 为什么要分层
- 由于结点之间联系很复杂,在制定协议时,把复杂成份分解成 一些简单的成份,再将它们复合起来。最常用的复合方式是层次方式,即同层间可以通信、上一层可以调用下一层,而与再下一层不发生关系。
- 通信协议的分层规定
- 把用户应用程序作为最高层,把物理通信线路作为最低层,将其间的协议处理分为若干层,规定每层处理的任务,也规定每层的接口标准。
- 七层协议
- 物理层(Physical Layer)
- 数据链路层(Data Link Layer)
- 网络层(Network Layer)网络层协议的代表包括:IP、IPX、RIP、OSPF等
- 传输层(Transport Layer)传输层协议的代表包括:TCP、UDP、SPX等。
- 会话层(Session Layer)NetBIOS、ZIP(AppleTalk区域信息协议)等。
- 表示层(Presentation Layer) ASCII、ASN.1、JPEG、MPEG等。
- 应用层(Application Layer) Telnet、FTP、HTTP、SNMP等。
- IP (Internet Protocol)协议是网际层的主要协议,支持网间互连的数据报通信。它提供主要功能有:
- 无连接数据报传送
- 数据报路由选择和差错控制
- TCP协议是一个面向连接的、可靠的协议
- TCP(transmission control protocol)
- 是一种面向连接(连接导向)的、可靠的、基于字节流的运输层通信协议。
- 是专门设计用于在不可靠的因特网上提供可靠的、端到端的字节流通信的协议。它是一种面向连接的协议。TCP连接是字节流而非报文流。
- 特点:
- 面向连接
- 点到点的通信
- 高可靠性
- TCP三次握手
- UDP协议是一个不可靠的、无连接协议
- UDP(user datagram protocol )
- 一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
- UDP向应用程序提供了一种发送封装的原始IP数据报的方法、并且发送时无需建立连接。是一种不可靠的连接
- 特点:
- 非面向连接
- 传输不可靠
- 数据可能丢失
- 类似于:发短信
- 数据的底层传输:
- 数据传输的底层还是流(IO)
- 两个Java应用程序可通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个Socket。
- Socket通常用来实现client-server连接。
- java.net包中定义的两个类Socket和ServerSocket,分别用来实现双向连接的client和server端
- 建立连接时所需的寻址信息为远程计算机的IP地址和端口号(Port number)
- 两个字节
- 65536(TCP) 65536 (UDP)
- Socket通信模型
- ServerSocket
- 此类实现服务器套接字。
- 服务器套接字等待请求通过网络传入。
- 它基于该请求执行某些操作,然后可能向请求者返回结果。
- Socket
- 此类实现客户端套接字(也可以就叫“套接字”)。
- 套接字是两台机器间通信的端点。
- 服务器&客户端代码演示:
- 服务器端:
-
public class ServerDemo { public static void main(String[] args) { try { //创建服务器对象,指定端口 ServerSocket server = new ServerSocket(8888); System.out.println("等待游览器连接"); Socket socket = server.accept();//侦听并接受到此套接字的连接。 System.out.println("连接成功"); BufferedReader br = new BufferedReader(new InputStreamReader( socket.getInputStream(), "gb2312")); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter( socket.getOutputStream(), "gb2312")); for (int i = 0; i < 8; i++) { System.out.println(br.readLine()); } bw.write("<html>Just do IT</html>"); bw.flush(); socket.close(); server.close(); } catch (Exception e) { e.printStackTrace(); } } }
-
-
客户端
-
public class ClientDemo { public static void main(String[] args) { try { Socket socket = new Socket("localhost", 8888); System.out.println("连接成功"); BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "gb2312")); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "gb2312")); for (int i = 0; i < 8; i++) { // System.out.println("客户数据第"+i+"行"); bw.write("客户数据第" + i + "行"); bw.newLine(); } bw.flush(); System.out.println(br.readLine()); bw.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
-
- 服务器端:
- InetAddress
- 此类表示互联网协议 (IP) 地址。
- 常用方法:
- getHostAddress()
- 返回 IP 地址字符串(以文本表现形式)。
- getHostName()
- 获取此 IP 地址的主机名。
- getByName(String host)
- 在给定主机名的情况下确定主机的 IP 地址。
- getHostAddress()
-
代码示例:
-
public class InetAddressDemo { public static void main(String[] args) throws UnknownHostException { InetAddress addr = InetAddress.getLocalHost(); System.out.println(addr.getHostAddress()); // 返回:192.168.136.1 System.out.println(addr.getHostName()); // 输出计算机名: // 根据域名得到InetAddress对象 addr = InetAddress.getByName("www.qq.com"); System.out.println(addr.getHostAddress());// 输出Ip System.out.println(addr.getHostName());// 输出域名:www.baidu.com // 根据IP得到InetAddress对象 addr = InetAddress.getByName("115.239.211.112"); System.out.println(addr.getHostAddress());// 返回的是IP地址 System.out.println(addr.getHostName());//如果dns没有解析,返回依然是IP地址 } }
-
- URL
- URL 代表一个统一资源定位符,它是指向互联网“资源”的指针。
- 资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。
- 代码示例:
-
public class UrlDemo { public static void main(String[] args) throws MalformedURLException { //绝对路径构建 URL url = new URL("http://www.baidu.com:80/index.htm?uname=company#aa"); System.out.println("协议:"+url.getProtocol()); System.out.println("主机名:"+url.getHost()); System.out.println("端口:"+url.getPort()); System.out.println("资源:"+url.getFile()); System.out.println("锚点:"+url.getRef()); // 参数 存在锚点,返回null,如果没有锚点返回正确。 System.out.println("参数"+url.getQuery()); url = new URL(url, "/b.txt");//相对路径 System.out.println(url); System.out.println(url.getPath()); } }
-
- 代码示例:
- Socket编程通常会和多线程进行配合使用,使用GUI显示