Java—— 网络编程
什么是网络编程
网络编程就是计算机跟计算机之间通过网络进行数据传输
常见软件架构
C/S: Client/Server客户端/服务器
在用户本地需要下载并安装客户端程序,在远程有一个服务器端程序
适合定制专业化的办公类软件如:IDEA、王者荣耀
优缺点:
画面可以做的非常精美,用户体验好
需要开发客户端,也需要开发服务端
用户需要下载和更新
B/S: Browser/Server浏览器/服务器
只需要一个浏览器,用户通过不同的网址,访问不同的服务器
适合移动互联网应用,可以在任何地方随时访问的系统如:新闻头条、4399小游戏
优缺点:
不需要开发客户端,只需要开发服务端
用户不需要下载,打开浏览器就能使用
如果应用过大,用户体验受到影响
网络编程三要素
IP:
全称:nternet Protocol,是互联网协议地址,也称IP地址
是分配给上网设备的数字标签,是设备在网络中的地址,是唯一的标识。
常见的IP分类为:
IPv4 最多只有2^32次方个ip,目前已经用完了
IPv6 为了解决IPv4不够用而出现的,最多有2^128次方个ip
特殊IP地址:
127.0.0.1(localhost):回送地址,也称本地回环地址或本机IP,作用是永远只会寻找当前所在本机。
InetAddress
此类表示互联网协议 (IP) 地址
有两个子类Inet4Address, Inet6Address,分别对应IPv4, IPv6
获取IP地址对象时,底层会判断当前系统用的IP版本,创建对应子类的对象,然后返回
常用方法
方法名 | 说明 |
static InetAddress getByName(String host) | 获取主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址 |
String getHostName() | 获取此IP地址的主机名 |
String getHostAddress() | 返回IP地址字符串 |
代码演示
import java.net.InetAddress;
import java.net.UnknownHostException;public class InetAddressTest {public static void main(String[] args) throws UnknownHostException {//static InetAddress getByName(String host) 获取主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址//String getHostName() 获取此IP地址的主机名//String getHostAddress() 返回IP地址字符串InetAddress inetAdress = InetAddress.getByName("LAPTOP-CK36DSIB");System.out.println(inetAdress);//LAPTOP-CK36DSIB/169.254.237.195String hostName = inetAdress.getHostName();System.out.println(hostName);//LAPTOP-CK36DSIBString hostAddress = inetAdress.getHostAddress();System.out.println(hostAddress);//169.254.237.195}
}
端口号:
由两个字节表示的整数,取值范围0~65535
是应用程序在设备中唯一的标识,一个端口号只能被一个应用程序使用
其中0~1023的端口号用于一些知名的网络服务或者应用,自己使用要使用1024以上的端口号
协议:
计算机网络中,连接和通信的规则被称为网络通信协议,是数据在网络中传输的规则
常见的协议有UDP、TCP、http、https、ftp
UDP协议
用户数据报协议(User Datagram Protocol),是面向无连接通信协议。
特点:速度快,有大小限制(一次最多发送64K),数据不安全易丢失
发送数据
步骤:
1.创建发送端的DatagramSocket对象 -> 找快递公司
2 数据打包(DatagramPacket) -> 打包礼物
3.发送数据 -> 快递公司发送包裹
4.释放资源 -> 付钱走人import java.io.IOException; import java.net.*;public class SendMessageDemo {public static void main(String[] args) throws IOException {//1.创建发送端的DatagramSocket对象//参数为发送端端口号,不写默认随机一个端口号DatagramSocket ds = new DatagramSocket(10000);//2 数据打包(DatagramPacket)//准备要发送的数据String messageStr = "你好!!!";byte[] message = messageStr.getBytes();//准备接收的电脑的ip地址InetAddress address = InetAddress.getByName("127.0.0.1");//准备接收端端口号int port = 10086;//打包DatagramPacket dp = new DatagramPacket(message, message.length, address, port);//3.发送数据ds.send(dp);//4.释放资源ds.close();} }
接收数据
步骤:
1.创建接收端的DatagramSocket对象 -> 找快递公司
2.接收打包好的数据 -> 接收箱子
3.解析数据包 -> 从箱子里面获取礼物
4.释放资源 -> 签收走人 import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress;public class ReceiveMessageDemo {public static void main(String[] args) throws IOException {//1.创建接收端的DatagramSocket对象//参数为接收端端口号DatagramSocket ds = new DatagramSocket(10086);//2.接收打包好的数据//准备数据箱接收byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);//接收数据到打包箱中//该方法是阻塞的,到这一步时等待发送端发送数据ds.receive(dp);//3.解析数据包byte[] data = dp.getData();int length = dp.getLength();InetAddress address = dp.getAddress();int port = dp.getPort();System.out.println("接收到的数据为:" + new String(data, 0, length));System.out.println("来自" + address + "电脑的" + port + "端口");//4.释放资源ds.close();} }
先启动接收程序,再启动发送程序,接收端接收到如下数据:
UDP的三种通信方式
单播
一台电脑发送,一台电脑接收
单播地址:接收端的ip地址
代码实现:上述的代码就是单播
组播
一台电脑发送,多台电脑接收
组播地址:224.0.0.0~239.255.255.255,其中224.0.0.0~224.0.0.255为预留的组播地址代码实现:
发送
import java.io.IOException; import java.net.DatagramPacket; import java.net.InetAddress; import java.net.MulticastSocket;public class SendMessageDemo {public static void main(String[] args) throws IOException {//1.创建发送端的MulticastSocket对象MulticastSocket ms = new MulticastSocket();//数据打包(DatagramPacket)String messageStr = "你好吗?";byte[] bytes = messageStr.getBytes();//组播地址224.0.0.0~224.0.0.255InetAddress ip = InetAddress.getByName("224.0.0.2");int port = 10086;DatagramPacket dp = new DatagramPacket(bytes, bytes.length, ip, port);//3.发送数据ms.send(dp);//4.释放资源ms.close();} }
接收
import java.io.IOException; import java.net.DatagramPacket; import java.net.InetAddress; import java.net.MulticastSocket;public class ReceiveMessageDemo {public static void main(String[] args) throws IOException {//1.创建接收端的MulticastSocket对象//参数为接收端端口号MulticastSocket ms = new MulticastSocket(10086);//2.将本机添加到224.0.0.2这一组中InetAddress address = InetAddress.getByName("224.0.0.2");ms.joinGroup(address);//3.接收打包好的数据byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);ms.receive(dp);//4.解析数据byte[] data = dp.getData();int length = dp.getLength();System.out.println(new String(data, 0, length));//4.释放资源ms.close();} }
上述代码中,只有添加到224.0.0.2这一组中的主机可以接收到数据
广播
一台电脑发送,局域网内的所有电脑接收
广播地址:255.255.255.255
代码实现:只需将单播代码中的单播地址改为广播地址
TCP协议
传输控制协议TCP(Transmission Control Protocol),是面向连接的通信协议。
特点:速度慢,没有大小限制,数据安全。
客户端发送数据
1.创建客户端的Socket对象(Socket)与指定服务端连接
Socket(String host,int port)
2.获取输出流,写数据Outputstream getoutputstream()
3.释放资源
void close()import java.io.IOException; import java.io.OutputStream; import java.net.Socket;public class SocketDemo {public static void main(String[] args) throws IOException {//1.创建客户端的Socket对象(Socket)与指定服务端连接Socket socket = new Socket("127.0.0.1", 10086);//2.获取输出流,写数据OutputStream os = socket.getOutputStream();os.write("你好!!!".getBytes());//3.释放资源socket.close();} }
服务器接收数据
1.创建服务器端的Socket对象(ServerSocket)
ServerSocket(int port)
2. 监听客户端连接,返回一个Socket对象
Socket accept()
3.获取输入流,读数据,并把数据显示在控制台
Inputstream getInputstream()
4. 释放资源
void close()import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket;public class ServerSocketDemo {public static void main(String[] args) throws IOException {//1.创建服务器端的Socket对象(ServerSocket)ServerSocket ss = new ServerSocket(10086);//2.监听客户端连接,返回一个Socket对象//阻塞,一直等待直到客户端与服务器端连接成功,返回客户端连接对象Socket socket = ss.accept();//3.获取输入流,读数据,并把数据显示在控制台InputStream is = socket.getInputStream();//防止中文乱码,使用转换流转换为字符流InputStreamReader isr = new InputStreamReader(is);int b;while ((b = isr.read()) != -1) {System.out.print((char) b);}//4.释放资源socket.close();ss.close();} }
先启动接收程序,再启动发送程序,接收到如下数据:
确保连接建立(三次握手)
1.客户端向服务器发出连接请求,等待服务器确认
2.服务器向客户端返回一个响应,告诉客户端收到了连接请求
3.客户端向服务器再次发出确认信息,连接建立
确保连接断开,且数据处理完毕(四次挥手)
1.客户端向服务器发出取消连接请求,等待服务器确认
2.服务器向客户端返回一个响应,表示收到客户端取消请求
3.服务器处理完所有数据时,向客户端发出确认取消信息
4.客户端再次向服务器发送确认消息,连接取消