【从0开始学习Java | 第20篇】网络编程
文章目录
- 初识网络编程🍂
- 1.什么是网络编程?
- 2.常见的软件架构及其优缺点👏
- 网络编程三要素
- UPD协议使用🥝
- 发送数据🍋🟩
- 接收数据🍋🟩
- 简易聊天室功能实现
- UPD的三种通信方式🧾
- 单播
- 组播
- 代码示例
- 广播
- TCP通信协议的应用🥝
- 代码示例
- 客户端(发送数据)🍋🟩
- 服务端(接收数据)🍋🟩
- TCP协议的三次握手和四次挥手🐦🔥
- 三次握手 --- 确保连接建立
- 四次挥手 --- 确保连接断开,且数据处理完毕
初识网络编程🍂
1.什么是网络编程?
计算机跟计算机之间通过网络进行数据传输
2.常见的软件架构及其优缺点👏
常见的软件架构:
两种架构的优缺点:
网络编程三要素
- IP:设备在网络中的地址,是唯一的标识
特殊IP地址:127.0.0.1,也可以是localhost:是回送地址,也称为本地回环地址,即本地IP,永远只会寻找当前所在本机
跟本节有关的常见的两个CMD命令:ipconfig:查看本机的IP地址、ping:检查网络是否连通
import java.net.InetAddress;
import java.net.UnknownHostException;public class MyInetAddressDemo1 {public static void main(String []args) throws UnknownHostException {// 获取InetAddress的对象//IP的对象 一台电脑的对象InetAddress address = InetAddress.getByName("LAPTOP-NMC3A9R0"); // 填自己电脑的设备名称System.out.println(address);// 获取电脑的名称String name = address.getHostName();System.out.println(name);// 获取电脑的ip地址String ip = address.getHostAddress();System.out.println(ip);}
}
- 端口号:应用程序在设备中唯一的标识
由两个字节表示的整数,取值范围:0~65535
其中0~1023之间的端口号用于一些知名的网络服务或应用
我们自己使用1024以上的端口号
注意:一个端口号只能被一个应用程序使用
- 协议:数据在网络中传输的规则,常见的协议有:UDP、TCP、http、https、ftp
网络通信协议参考模型:
UDP协议和TCP协议:
UPD协议使用🥝
发送数据🍋🟩
public class UDP_Send {public static void main(String []args) throws IOException {// 1.创建DataGramSocket对象// 空参:所有可用的端口中随机一个进行使用// 有参:指定端口号进行绑定使用DatagramSocket ds = new DatagramSocket();// 2.打包数据String str = "林七夜";byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("127.0.0.1");int port = 10086;DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);// 3.发送数据ds.send(dp);// 4.释放资源ds.close();}
}
接收数据🍋🟩
public class UDP_Receive {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 len = dp.getLength();InetAddress address = dp.getAddress();int port = dp.getPort();System.out.println("接收到数据:"+new String(data,0,len));System.out.println("该数据是从"+address+"这台电脑中的"+port+"端口发出的");}
}
简易聊天室功能实现
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;public class Wechat_Send {public static void main(String[] args) throws IOException {// UDP发送数据:数据来自键盘录入,直到输入的数据是886,发送数据结束DatagramSocket ds = new DatagramSocket();InetAddress address = InetAddress.getByName("127.0.0.1");int port = 10086;String str = "";Scanner sc = new Scanner(System.in);while (true) {str = sc.nextLine();if(str.equals("886"))break;byte[] bytes = str.getBytes();DatagramPacket dp = new DatagramPacket(bytes, 0, bytes.length, address,port);ds.send(dp);}ds.close();}=========================================================================================import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;public class Wechat_Receive {public static void main(String []args) throws IOException {// UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收DatagramSocket ds = new DatagramSocket(10086);byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes,bytes.length);byte[] data = new byte[1024];while(true){ds.receive(dp);data = dp.getData();String name = dp.getAddress().getHostName();int len = dp.getLength();int port = dp.getPort();System.out.println("收到来自电脑"+name+"的"+port+"端口的消息:"+new String(data,0,len));}}
UPD的三种通信方式🧾
单播
上面所写的代码就是单播
组播
组播地址: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 MulticastSocket_Send {public static void main(String []args) throws IOException {// 创建MulticastSocket对象【组播端发送数据】MulticastSocket ms = new MulticastSocket();String s = "你好啊";byte[] bytes = s.getBytes();// 注意,这里的组播地址的使用应为224开头的InetAddress address = InetAddress.getByName("224.0.0.1");int port = 10000;DatagramPacket dp = new DatagramPacket (bytes,bytes.length,address,port);ms.send(dp);ms.close();}
}==================================================================================================import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;public class MulticastSocket_Receive {public static void main(String []args) throws IOException {// 组播端接收数据// 1. 创建MulticastSocket对象MulticastSocket ms = new MulticastSocket(10000);// 2. 将当前本机,添加到224.0.0.1的这一组中 !!!!!InetAddress address = InetAddress.getByName("224.0.0.1");ms.joinGroup(address);// 3. 创建DatagramPacket数据包对象byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes,bytes.length);// 4.接收数据ms.receive(dp);// 5.解析数据byte[] data = dp.getData();int len = dp.getLength();String ip = dp.getAddress().getHostAddress();String name = dp.getAddress().getHostName();System.out.println("收到ip为"+ip+",主机名为"+name+"发送的数据:"+new String(data,0,len));ms.close();}
}
广播
广播地址:255.255.255.255
代码跟单播的差不多,我们只要把InetAddress address = InetAddress.getByName("224.0.0.1");
这部分的地址改为255.255.255.255
就是广播了
TCP通信协议的应用🥝
TCP通信程序示意图:
代码示例
客户端(发送数据)🍋🟩
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;public class A_TCP_Client {public static void main(String []args) throws IOException {// TCP协议,发送数据// 1. 创建Socket对象// 细节:在创建对象的同时会连接服务器,如果连接不上,代码会报错(TCP的特性)Socket socket = new Socket("127.0.0.1",10086);// 2. 从连接通道中获取输出流OutputStream os = socket.getOutputStream();// 写入数据os.write("你好啊林七夜".getBytes());// 3. 释放资源os.close();socket.close();}
}
服务端(接收数据)🍋🟩
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;public class A_TCP_Server {public static void main(String []args) throws IOException {// TCP协议,接收数据// 1.创建对象ServerSockerServerSocket ss = new ServerSocket (10086);// 2. 监听客户端的链接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();}
}