Day22 网络编程
第一节:什么是计算机网络
什么是网络:
由点和线组成,表示诸多对象间的相互联系
什么是计算机网络:
为实现资源共享和信息传递,通过通信线路连接起来的若干主机(Host)
互联网:(Internet)点与点相连
万维网:(WWW – World Wide Web)端与端相连
物联网:( IoT - Internet of things) 物与物相连
网络编程:让计算机与计算机之间建立连接、进行通信。
第二节:网络模型
层介绍:
第一层:物理层为设备之间的数据通信提供传输信号和物理介质。(双绞线、光导纤维)
第二层:链路层在物理层上,通过规程或协议(差错控制)来控制传输数据的正确性。(MAC)
第三层:网络层负责定义了能够标识所有网络节点的逻辑地址。(IP地址)
第四层:传输层负责是否选择差错恢复协议、数据流重用、错误顺序重排。(TCP、UDP)
第五层:会话层负责使应用建立和维持会话,使通信在失效时继续恢复通信。(断点续传)
第六层:表示层负责定义转换数据格式及加密,允许选择以二进制或ASCII格式传输。
第七层:应用层负责文件访问和管理、可靠运输服务、远程操作服务。(HTTP、FTP、SMTP)
第三节:TCP/IP模型
层介绍:
第一层:接口层负责建立电路连接,是整个网络的物理基础,典型的协议包括以太网、ADSL等等。
第二层:网络层负责分配地址和传送二进制数据,主要协议是IP协议。
第三层:传输层负责传送文本数据,主要协议是TCP、UDP协议。
第四层:应用层负责传送各种最终形态的数据,是直接与用户打交道的层,典型协议是HTTP、FTP等。
第四节:TCP/UDP
TCP协议:Transmission Control Protocol 传输控制协议
是一种面向连接的、可靠的、基于字节流的传输层通信协议。数据大小无限制。建立连接的过程需要三次握手,断开连接的过程需要四次挥手。
UDP协议:User Datagram Protocol 用户数据报协议
是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,每个包的大小64KB。
第五节:IP
IP协议:Internet Protocol Address 互联网协议地址/网际协议地址
分配给互联网设备的数字标签(唯一标识)。
IP地址分为两种:
IPV4:4字节32位整数,并分成4段8位的二进制数,每8位之间用圆点隔开,每8位 整数可以转换为一个0~255的十进制整数。
格式:D.D.D.D 例如:255.255.255.255
IPV6:16字节128位整数,并分成8段十六进制数,每16位之间用圆点隔开,每16 位整数可以转换为一个0~65535的十进制数。
格式:X.X.X.X.X.X.X.X 例如:FFFF.FFFF.FFFF.FFFF.FFFF.FFFF.FFFF.FFFF
IPV4的分类:
A类:政府机构,1.0.0.1 ~ 126.255.255.254
B类:中型企业,128.0.0.1 ~ 191.255.255.254
C类:个人用户,192.0.0.1 ~ 223.255.255.254
D类:用于组播,224.0.0.1 ~ 239.255.255.254
E类:用于实验,240.0.0.1 ~ 255.255.255.254
回环地址:127.0.0.1,localhost,指本机,一般用于测试使用。
查看IP命令:ipconfig
测试IP命令:ping D.D.D.D
Port 端口
端口号:在通信实体上进行网络通讯的程序的唯一标识。
端口分类:
公认端口:0~1023
注册端口:1024~49151
动态或私有端口:49152~65535
常用端口:
MySql:3306
Oracle:1521
Tomcat:8080
SMTP:25
Web服务器:80
FTP服务器:21
第六节:InetAddress类
概念:表示互联网协议(IP)地址对象,封装了与该IP地址相关的所有信息,并提供获取信息的常用方法。
方法:
public static InetAddress getLocalHost() 获得本地主机地址对象
public static InetAddress getByName(String host) 根据主机名称获得地址对象
public static InetAddress[] getAllByName(String host) 获得所有相关地址对象
public String getHostAddress() 获取IP地址字符串
public String getHostName() 获得IP地址主机名
示例代码:
InetAddress ip = InetAddress.getLocalHost();//本机
System.out.println(ip.getHostName());//主机名
System.out.println(ip.getHostAddress());//主机地址
//获取别的
// InetAddress baidu = InetAddress.getByName("www.baidu.com");
// System.out.println(baidu.getHostAddress());//百度地址
// System.out.println(baidu.getHostName());
// InetAddress[] baidus =InetAddress.getAllByName("www.baidu.com");
// System.out.println(baidus.length);
//
// for (InetAddress inetAddress : baidus) {
// System.out.println(inetAddress.getHostAddress());
// }
System.out.println(InetAddress.getByName("www.google.com").getHostAddress());
第七节:Socket编程
Socket编程:
Socket(套接字)是网络中的一个通信节点。
分为客户端Socket与服务器ServerSocket。
通信要求:IP地址 + 端口号。
开发步骤:
建立通信连接(会话):
创建ServerSocket,指定端口号
调用accept等待客户端接入
客户端请求服务器:
创建Socket,指定服务器IP + 端口号
使用输出流,发送请求数据给服务器
使用输入流,接收响应数据到客户端(等待)
服务器响应客户端:
使用输入流,接收请求数据到服务器(等待)
使用输出流,发送响应数据给客户端示例代码:
客户端://客户端,指定要连接的IP地址和端口号 Socket socket = new Socket("127.0.0.1",6666); //客户端角度:输出流---->服务端 PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); //客户端发送请求内容: 用户名和密码 Scanner sc =new Scanner(System.in); System.out.println("请输入用户名:"); String username = sc.next(); System.out.println("请输入密码:"); String password = sc.next(); String content = username+":"+password; //通过输出流 写我的内容 到服务器端 pw.print(content); pw.flush(); socket.shutdownOutput(); //通过输入流,获取服务器端返回的结果 InputStream is = socket.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String result = br.readLine(); System.out.println("客户端说:服务器端给了个结果:"+result); socket.shutdownInput(); br.close(); socket.close();
服务端
System.out.println("服务启动。。。。。。"); //创建服务端 端口为6666 ServerSocket server = new ServerSocket(6666); //客户端 Socket socket = server.accept();//监听是否有客户端接入,如果没有,等待 //服务器角度:输入流<----- 客户端 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); //从流中读取客户端发送来的内容 String s = br.readLine(); HashMap<String, String> maps = new HashMap<String ,String>(); //aqiang:123456 对传递过来的字符串 通过指定符号做拆分两段,存放数组里 String[] ss = s.split(":"); for(String key : ss){ maps.put(ss[0],ss[1]); } String result = "登录失败"; if("aqiang".equals(ss[0])&& "123456".equals(maps.get(ss[0]))){ result = "登录成功"; } //关闭输入流 socket.shutdownInput(); //流 来对客户端做响应! OutputStream os = socket.getOutputStream(); OutputStreamWriter wr = new OutputStreamWriter(os); PrintWriter pw= new PrintWriter(wr); //把验证结果打印给客户端 pw.print(result); pw.flush(); //关闭所有输出流 socket.shutdownOutput(); socket.close(); server.close();
wr = new OutputStreamWriter(os);
PrintWriter pw= new PrintWriter(wr); //把验证结果打印给客户端 pw.print(result); pw.flush(); //关闭所有输出流 socket.shutdownOutput(); socket.close(); server.close();