Java SE 网络编程
目录
-
网页编程: html js,上层应用
-
网络编程: 底层数据,数据的传输
-
IP: 定位节点
-
端口: 区分软件
-
URL: 统一资源定位符
-
传输层协议: *************
- UDP: 相当于写信, 不安全,只管写,不管是否能够正确接收到 ,大小限制,效率高
- TCP: 相当于打电话,基于连接,安全,大小没有限制,但是小理财第 ---->重要
1、计算机网络概念
- 网络即将不同区域的电脑连接到一起, 组成局域网、城域网或广域网。
- 资源共享
- 信息传输与集中处理
- 均衡负荷与分布处理
2、网络通讯协议
网络协议:为进行网络中的数据交换而建立的规则、标准或约定。
由以下三个要素组成:
- (1)语法:即数据与控制信息的结构或格式。
- (2)语义:即需要发出何种控制信息,完成何种动作以及做出何种响应。
- (3)规则:即事件实现顺序的详细说明。
语义表示要做什么,语法表示要怎么做,时序表示做的顺序。
2.2、通讯接口
为了使两个结点之间能进行对话,必须在它们之间建立通信工具(即接口),使彼此之间能进行信息交换。
接口包括两部分:
- 硬件装置: 实现结点之间的信息传送;
- 软件装置: 规定双方进行通信的约定协议
3、网络分层
3.1、通信协议的分层
3.2、OSI七层协议|TCP/IP五层协议
3.3 、 封装
封装:从上往下,加入相关层的协议控制信息
3.4、 拆封
拆封:获取数据,从下往上,去除相关层的协议的控制信息
4、IP 地址
-
( IP) 是 Internet Protocol 的外语缩写, 网络之间互连的协议也就是为计算机网络相互连接进行通信而设计的协议。
-
定位互联网中的每一个节点(电脑,路由器,服务器,手机…)
-
192.168.0.0~192.168.255.255 ->非注册IP,供组织内部使用的 内网
-
IPV4 4个字节 32位 | IPV6 16字节 128位
-
127.0.0.1 -> 本地IP
localhost: 本机 ->域名 -
IP 与 域名:
IP定位节点
人类对 字符更敏感,域名就是一种IP的字符变现形式
通过DNS服务器 -
InetAddress : 此类表示Internet协议(IP)地址。
//封装计算机的 ip 地址和 DNS( Domain Name System,域名系统) ,没有端口。
// InetAddress.getLocalHost();
InetAddress ip1=InetAddress.getLocalHost();
System.out.println(ip1);
// getHostAddress() //返回 ip 地址
System.out.println(ip1.getHostAddress());
// getHostName() //返回域名|本机为计算机名
System.out.println(ip1.getHostName());
// InetAddress.getByName("www.163.com");
// InetAddress.getByName("223.87.1.58")
InetAddress ip2=InetAddress.getByName("www.baidu.com");
System.out.println(ip2);
System.out.println(ip2.getHostAddress());
System.out.println(ip2.getHostName());
5、端口(port)
端口是虚拟的概念,并不是说在主机上真的有若干个端口。通过端口,可以在一个主机 上运行多个网络应用程序。可以类比为:IP 相当于公司,端口相当于公司各部 门,URL相当于各部门的人员。
-
包含端口,用于 socket 通信的区分不同软件。
-
2个字节 0~65535之间的整数表示
-
但是8000以内的不建议使用,预留端口号
- 21 :FTP
- 80: http协议
- 8080: tomcat
- 3306: mysql
- 1521: oracle
同一写一下端口号不能冲突
- InetSocketAddress : 此类实现IP套接字地址(IP地址+端口号)它也可以是一对(主机名+端口号)
- InetSocketAddress(String hostname, int port) 根据主机名和端口号创建套接字地址。
- InetSocketAddress(InetAddress addr, int port) 根据IP地址和端口号创建套接字地址。
//1) 、获取对象 InetSocketAddress(String hostname, int port) InetSocketAddress(InetAddress addr, int port)
// 2) 、方法 getAddress() //返回
InetSocketAddress socket=new InetSocketAddress("localhost",9999);
InetSocketAddress socket2=new InetSocketAddress("127.0.0.1",9999);
// InetAddress 对象
System.out.println(socket.getAddress());
// getPort() //返回端口
System.out.println(socket.getPort());
// getHostName() //返回域名
System.out.println(socket.getHostName());
6、URl 统一资源定位符
- 互联网的三大基石: http html url
URL所表示的网络资源位置通常包括用于访问服务器的协议(如http、xp等)、服务器的主机名或者IP地址、以及资源文件在该服务器上的路径。典型的URL例如http://localhost:port/myProject/index.html
protocol://userInfo@host:port/path?query#fragment
协议://用户信息@主机名:端口/路径?查询#锚点
- java.net.URL 类(后面直接叫URL)是JDK对URL的统一抽象,它是一个final修饰的类,也就是不允许派生子类。
//url
URL url = new URL("http://www.baidu.com:80/index.html?username=zhangsan&password=123#a");
//String getFile() 获取此 URL的文件名。
System.out.println(url.getFile());
//String getHost() 获取此 URL的主机名(如果适用)。
System.out.println(url.getHost());
//String getPath() 获取此 URL的路径部分。
System.out.println(url.getPath());
//int getPort() 获取此 URL的端口号。
System.out.println(url.getPort());
//String getProtocol() 获取此 URL的协议名称。
System.out.println(url.getProtocol());
//String getQuery() 获取此 URL的查询部分。
System.out.println(url.getQuery());
//String getRef() 获取此 URL的锚点(也称为“引用”)。
System.out.println(url.getRef());
7、传输层协议
7.1.协议
- TCP:TCP(transfer control protocol) 打电话 面向连接、安全、可靠,效率低
- UDP:UDP(UserDatagramProtocol ) 发送短信 非面向连接、不安全、数据可能丢失 、效率高
7.2. UDP编程: DatagramSocket,DatagramPacket
UserDatagramProtocol,一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。其特点为:非面向连接;传输不可靠;数据可能丢失。
- Socket套接字:
传输层为应用层开辟的一个小口子
TCP,UDP,面向socket编程
不同 的协议socket的实现方式不同
DatagramSocket:用于发送或接收数据报的数据报包的套接字:
常用方法: send , receive , close。
DatagramPacket:数据容器(封包)的作用:
常用方法:构造函数、getAddrress(获取发送或接收方计算机的Ip地址)、getData(获取发送或接收的数据),setData(设置发送的数据)
7.2 .1客户端
- 1.定义我是发送端 DatagramSocket(int port) 构造一个数据报套接字并将其绑定到本地主机上的指定端口。
- 2.准备数据
- 3.打包
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) - 4.发送 send(DatagramPacket p) 从此套接字发送数据报包。
- 5.关闭资源
注意: UDP 基于字节数组传输数据
Address already in use: Cannot bind 端口号冲突
System.out.println("------发送端---------");
//1.定义我是发送端 DatagramSocket(int port) 构造一个数据报套接字并将其绑定到本地主机上的指定端口。
DatagramSocket client=new DatagramSocket(8888);
// 2.准备数据
String s="哈哈哈哈哈哈,年轻人,来日方长";
byte[] b=s.getBytes();
System.out.println(b.length);
//3.打包
// DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
DatagramPacket dp=new DatagramPacket(b,0,b.length,new InetSocketAddress("255.255.255.255",9999));
//4.发送 send(DatagramPacket p) 从此套接字发送数据报包。
client.send(dp);
//5.关闭资源
client.close();
7.2.2 服务端
接收端:
1.定义我是接收端 DatagramSocket(int port) 构造一个数据报套接字并将其绑定到本地主机上的指定端口。
2.准备包裹,用来接收数据 DatagramPacket(byte[] buf, int offset, int length)
3.阻塞式接收数据 receive(DatagramPacket p) 从此套接字接收数据报包。
4.处理数据
5.关闭资源
System.out.println("-----接受端-----");
//1.定义我是接收端 DatagramSocket(int port) 构造一个数据报套接字并将其绑定到本地主机上的指定端口。
DatagramSocket ds=new DatagramSocket(9999);
//2.准备包裹,用来接收数据 DatagramPacket(byte[] buf, int offset, int length)
byte[] by=new byte[1024];
DatagramPacket dgp=new DatagramPacket(by,0,by.length);
// 3.阻塞式接收数据 receive(DatagramPacket p) 从此套接字接收数据报包。
ds.receive(dgp);
//4.处理数据
//by = dgp.getData();
System.out.println(new String(by,0,dgp.getLength()));
//5.关闭资源
ds.close();
7.3、TCP 编程:ServerSocket,Socket
客户端
服务端
transfer control protocol,一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transport layer)通信协议的点到点的通信 。TCP 三次握手(Three-way Handshake),类似于拨打电话。
-
a)、客户端:在网络通讯中,第一次主动发起通讯的程序被称作客户端(Client)程序
-
b)、服务器:第一次通讯中等待连接的程序被称作服务器端(Server)程序
-
• Socket:发送 TCP 消息
-
• ServerSocket:创建服务器
-
套接字是一种进程间的数据交换机制。
7.3.1 客户端
客户端: 实现基本流程
- 1.定义客户端 Socket(String host, int port) 创建流套接字并将其连接到指定主机上的指定端口号。
- 2.准备数据
- 3.获取输出流
- 4.写出
- 5.刷出
- 6.关闭
// 1.定义客户端 Socket(String host, int port) 创建流套接字并将其连接到指定主机上的指定端口号。
Socket client =new Socket("192.168.16.193",9898);
//2.准备数据
String s="来找我玩啊,庄庆游";
//3.获取输出流
DataOutputStream dps=new DataOutputStream(new BufferedOutputStream(client.getOutputStream()));
//4.写出
dps.writeUTF(s);
//5.刷出
dps.flush();
//6.关闭
dps.close();
client.close();
7.3.2 服务器
服务器:
- 1.定义服务器 ServerSocket(int port) 创建绑定到指定端口的服务器套接字。
- 2.阻塞式监听 Socket accept() 侦听对此套接字的连接并接受它。
- 3.获取输入流
- 4.读取客户端传递的数据
- 5.处理数据
- 6.关闭
//1.定义服务器 ServerSocket(int port) 创建绑定到指定端口的服务器套接字。
ServerSocket server=new ServerSocket(9000);
//2.阻塞式监听 Socket accept() 侦听对此套接字的连接并接受它。
Socket cilent=server.accept();
//3.获取输入流
DataInputStream dis=new DataInputStream(new BufferedInputStream(cilent.getInputStream()));
//4.读取
String s=dis.readUTF();
//5.处理数据
System.out.println(s);
//6 关闭资源
dis.close();
cilent.close();
server.close();