文章目录
- 一、网络编程三要素
-
- 1.1、IP
- 1.2、端口号
- 1.3、协议
- 二、InetAddress类
- 三、UDP通信程序
-
- 3.1、单播
- 3.2、组播
- 3.3、广播
- 四、TCP协议
一、网络编程三要素
- IP
- 端口号
- 协议
1.1、IP
IP:分配给上网设备的数字标签(上网设备在网络上的唯一地址)
IPV4:采用
32位
地址长度,分
4
组
- 目前主流方案
- 最多
的2
次方个IP,目前已经用完32
java基础 网络编程学习笔记一、网络编程三要素二、InetAddress类三、UDP通信程序四、TCP协议
IPV6:采用
128
位的地址长度,分
8
组
- 为了解决
不够用的问题而出现的IPV4
- 最多
的2
次方个IP128
- 甚至可以给地球上每一粒沙子都设定IP
1.2、端口号
由两个字节表示的整数,,其中
0-65535
0-1023
用于知名的网络服务和应用
反正要使用的话用
以上的端口号
1024
注意:一个端口号只能被一个程序应用
1.3、协议
数据传输的规则
UDP协议:用户数据报协议
- 面向
通信协议无连接
-
、速度快
、大小限制(一次最多64K)
、数据不安全
容易丢失数据
- 应用在丢失一些数据无所谓的场景,如:网络会议,语音通话
- 不管两台电脑网络是否连通,
收不到就拉倒
TCP协议: 传输控制协议
- 面向
通信协议连接
-
、速度慢
、大小不限制
数据安全
- 应用在需要完整数据的场景,如:下载软件,文字通信
java基础 网络编程学习笔记一、网络编程三要素二、InetAddress类三、UDP通信程序四、TCP协议
二、InetAddress类
此类表示IP对象
- 有两个子类,
,Inet4Address
Inet6Address
- 所以在创建
时,底层会判断当前系统使用的是InetAddress
还是IP4
IP6
注意:此类没有对外提供构造方法,所以不能new,只能使用InetAddress.getByName()的方法创建对象,参数为主机名或IP
那么创建出来的对象表示什么?
就是IP对象,可以看做是一台电脑的对象
// 获取InetAddress对象
public void testInetAddress() throws UnknownHostException {
// IP的对象 一台电脑的对象
InetAddress address = InetAddress.getByName("DESKTOP-6RGC961");
// getHostName() 小细节:如果因为网络原因或者局域网中压根没有这个台电脑,会返回IP
String hostName = address.getHostName();
System.out.println(hostName);
String hostAddress = address.getHostAddress();
System.out.println(hostAddress);
}
三、UDP通信程序
UDP的三种通信方式:
- 单播:发送给一台电脑
- 组播:发送给一组电脑
组播地址:224.0.0.0 ~ 239.255.255.255,其中224.0.0.0 ~ 224.0.0.255 为预留的组播地址
- 广播:发送给局域网的所有电脑
广播地址:255.255.255.255
3.1、单播
发送端步骤:
- 创建发送端的
对象DatagramSocket
- 数据打包(
对象)DatagramPacket
- 发送数据
- 关闭连接
public void testUDPsend() throws IOException {
// 1.创建DatagramSocket对象
// 细节:
// 绑定端口以后就是用这个端口发送
// 有参:指定端口绑定
// 无参:随机端口绑定
DatagramSocket datagramSocket = new DatagramSocket();
// 2.打包数据
String str = "我是发送的数据!";//数据
byte[] strBytes = str.getBytes();//数据转字节
InetAddress address = InetAddress.getByName("127.0.0.1");//得到接受的IP对象
int port = 10086;//设置端口号
DatagramPacket datagramPacket=new DatagramPacket(strBytes,strBytes.length,address,port);
// 3.发送
datagramSocket.send(datagramPacket);
// 4.关闭连接,释放资源
datagramSocket.close();
}
接受端步骤:
- 创建发送端的
对象DatagramSocket
- 接受打包好的数据(
)DatagramPacket
- 解析数据包
- 释放资源
注意:接受打包好的数据是阻塞的,执行到这里会死等,直到有信息发过来
// 创建UDP通信,接受端
public void testUDPreceive() throws IOException {
// 1.创建接受对象
// 细节:
// 接受一定要绑定端口
// 发送时指定的是什么端口,就绑定什么端口
DatagramSocket datagramSocket = new DatagramSocket(10086);
// 2.接受数据
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
datagramSocket.receive(datagramPacket);
// 3.解析数据
byte[] data = datagramPacket.getData();
System.out.println("接受到的数据是:"+new String(data,0,data.length));
InetAddress address = datagramPacket.getAddress();
System.out.println("接受到的地址是:"+address);
int port = datagramPacket.getPort();
System.out.println("发送的端口是:"+port);
// 4.释放资源
datagramSocket.close();
}
3.2、组播
在单播的基础上做了修改
- 不再是创建
对象,而是DatagramSocket
对象MulticastSocket
-
更换成组播的地址来设定传送的地址,只要是组播内能使用的地址都行InetAddress.getByName("225.0.0.1");
- 接受端需要将本机添加到 发送端设置的地址添加到组播中
InetAddress address = InetAddress.getByName("225.0.0.1");
multicastSocket.joinGroup(address );
- 组播接受对象可以很多个
public static void main(String[] args) throws IOException {
// 1.创建发送对象
MulticastSocket multicastSocket = new MulticastSocket();
// 2.打包数据
String str = "我是发送的数据";
byte[] bytes = str.getBytes();
InetAddress address = InetAddress.getByName("225.0.0.1");
int port = 10086;
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, address, port);
// 3.发送数据
multicastSocket.send(datagramPacket);
// 4.释放资源
multicastSocket.close();
}
public static void main(String[] args) throws IOException {
// 1.创建接受对象
MulticastSocket multicastSocket = new MulticastSocket(10086);
// 2.将本机添加到225.0.0.1这一组
InetAddress byName = InetAddress.getByName("225.0.0.1");
multicastSocket.joinGroup(byName);
// 3.得到数据
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
multicastSocket.receive(datagramPacket);
// 4.解析数据
byte[] data = datagramPacket.getData();
InetAddress address = datagramPacket.getAddress();
String str = new String(data, 0, data.length);
System.out.println(address + "说:" + str);
// 5.关闭连接
multicastSocket.close();
}
3.3、广播
在单播的基础上,将发送的地址改成广播的地址(255.255.255.255)
四、TCP协议
TCP通信协议是一种可靠的网络协议
- 它在通信的两端各自建立
对象Socket
- 通信之前
确保通信连接
- 通过
产生Socket
来进行网络通信IO流
客户端书写步骤:
- 创建客户端Socket对象(
)与指定服务端连接Socket
Socket(String host,int port)
- 获取输出流,写数据
OutputStream getOutputStream()
- 关闭连接
void close()
服务端书写步骤:
- 创建服务端的Socket对象(
)serverSocket
serverSocket(int port)
- 创建监听,监听客户端,返回一个
对象Socket
Socket accept()
- 获取输入流,读数据
InputStream getInputStream()
- 关闭连接
void close()
客户端代码:
public class Main {
public static void main(String[] args) throws IOException {
// 1.创建Socket连接
// 细节:
// 在创建的同时会连接服务端
// 连接不上会报错
Socket socket = new Socket("127.0.0.1",10086);
// 2.调用输入流
OutputStream outputStream = socket.getOutputStream();
outputStream.write("你好啊".getBytes());
// 3.关闭
outputStream.close();
socket.close();
}
}
服务端代码:
public class MainServerSocket {
public static void main(String[] args) throws IOException {
// 1.创建ServerSocket连接
ServerSocket serverSocket = new ServerSocket(10086);
// 2.监听客户端的连接
Socket socket = serverSocket.accept();
// 3.获取输入流
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
int b;
while ((b =bufferedReader.read())!=-1){
System.out.print((char) b);
}
// 4.关闭连接
socket.close();
serverSocket.close();
}
}