一、网络编程的概念
常见的软件架构:
二、网络编程三要素
IP:设备在网络中的地址,是唯一的标识
端口号:应用程序在设备中的唯一标识
协议:数据在网络中传输的规则,常见的协议有UDP、TCP、http、https、ftp
(一)IP
全称:Internet Protocol ,是互联网协议地址,也称IP地址,是分配给上网设备的数字标签
通俗理解:上网设备在网络中的地址,是唯一的
常见IP分类为:IPv4、IPv6
IPv4概念:
IPv6概念:
IPv4地址分类形式:
InetAddress类的使用:
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Main {
public static void main(String[] args) throws UnknownHostException {
//获取InetAddress的对象 static inetAddress getByName(String host)
//确定主机名称的ip地址,主机名称可以是机器名称,也可以是ip地址
//String getHostName() 获取此IP地址的主机名
//String getHostAddress() 返回文本显示中的IP地址字符串
InetAddress address=InetAddress.getByName("10.102.54.27");
System.out.println(address); // /10.102.54.27
String name=address.getHostName();
System.out.println(name); //LAPTOP-AIFHRFPI
String ip=address.getHostAddress();
System.out.println(ip); //10.102.54.27
}
}
(二)端口号
应用程序在设备中的唯一标识。
端口号:由两个字节表示的整数,取值范围:0~65535 其中0~1023之间的端口号用于一些知名的网络服务或者应用 自己使用1024以上的端口号。
注意:一个端口号只能被一个应用程序使用
(三)协议
计算机网路中,连接和通信的规则被称为网络通信协议
UDP协议:
用户数据报协议(User Datagram Protocol)
UDP是面向无连接通信协议,速度快,有大小限制,一次最多发送64K,数据不安全,易丢失
(不管是否已经连接)
TCP协议:
传输控制协议TCP(Transmission Control Protocol)
TCP协议是面向连接的通信协议,速度慢,没有大小限制,数据安全
(确保连接成功)
(四)UDP通信程序
发送数据:
import java.io.IOException;
import java.net.*;
public class UDPTest {
public static void main(String[] args) throws IOException {
//创建DatagramSocket对象
//绑定端口,以后就是通过这个端口往外发
//空参:所有可用的端口中随机选择一个使用
//带参:指定端口号绑定
DatagramSocket dgs=new DatagramSocket();
//打包数据
String str="你好啊!";
byte[] bytes=str.getBytes();
//127.0.0.1 表示本机IP
InetAddress address=InetAddress.getByName("127.0.0.1");
//端口号
int port=10086;
DatagramPacket dgp=new DatagramPacket(bytes,bytes.length,address,port);
//发数据
dgs.send(dgp);
//释放资源
dgs.close();
}
}
接收数据:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPTest2 {
public static void main(String[] args) throws IOException {
//接受数据
//创建DatagramSocket对象
//细节: 接收时一定要绑定端口
// 端口需要和发送端口保持一致
DatagramSocket dgs=new DatagramSocket(10086);
//接收数据包
byte[] bytes=new byte[1024];
DatagramPacket dgp=new DatagramPacket(bytes,bytes.length);
//receive 该方法是阻塞的
//当程序执行到这一步时,会在这里死等
//等发送端发送消息
dgs.receive(dgp);
//解析数据包
byte[] data=dgp.getData();
int len=dgp.getLength();
InetAddress address=dgp.getAddress();
int port=dgp.getPort();
System.out.println("接收到数据"+new String(data));
System.out.println("该数据是从"+address+"这台电脑中的"+port+"这个端口发送的");
//释放资源
dgs.close();
}
}
三种通信方式:
①单播
②组播
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class UDPTest4 {
public static void main(String[] args) throws IOException {
//组播发送端代码
//创建MulticastSocket对象
MulticastSocket ms = new MulticastSocket();
//创建DatagramPacket对象
String s="你好啊~~~";
//打包数据
byte[] bytes = s.getBytes();
//指定组播地址224.0.0.1
InetAddress address = InetAddress.getByName("224.0.0.1");
//端口号
int port = 1000;
DatagramPacket dgp = new DatagramPacket(bytes, bytes.length, address, port);
//发数据
ms.send(dgp);
//释放资源
ms.close();
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class UDPTest3 {
public static void main(String[] args) throws IOException {
//组播接收端代码
//创建MulticastSocket对象
MulticastSocket ms=new MulticastSocket(1000);
//将当前本机,添加到224.0.0.1的这一组当中
InetAddress address=InetAddress.getByName("224.0.0.1");
ms.joinGroup(address);
//创建DatagramPacket数据包对象
byte[] bytes=new byte[1024];
DatagramPacket dp=new DatagramPacket(bytes,bytes.length);
//接受数据
ms.receive(dp);
//解析数据
byte[] data=dp.getData();
String ip=dp.getAddress().getHostAddress();
String name=dp.getAddress().getHostName();
System.out.println("ip为:"+ip+",主机名为:"+name+",的人,发送了数据:"+new String(data));
ms.close();
}
}
③广播
(五)TCP通信程序
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class TCPTest1 {
public static void main(String[] args) throws IOException {
//TCP协议发送端
//创建Socket对象
//在创建对象的同时会连接服务器
//如果连接不上,代码会报错
Socket socket=new Socket("127.0.0.1",1000);
//从连接通道种获取输出流
OutputStream ops=socket.getOutputStream();
//写出数据
ops.write("你好啊".getBytes());
//释放资源
ops.close();
socket.close();
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPTest2 {
public static void main(String[] args) throws IOException {
//TCP协议接收端
//创建ServerSocket对象
ServerSocket socket=new ServerSocket(1000);
//监听客户端的链接
Socket socket1=socket.accept();
//从连接通道中获取输入流,读取数据(不能传中文)
InputStream ips=socket1.getInputStream();
//使用转换流转化为字符流
InputStreamReader isr=new InputStreamReader(ips);
//为了读取效率,再套一个缓冲流
BufferedReader br=new BufferedReader(isr);
String s;
while((s=br.readLine())!=null){
System.out.println(s);
}
//释放资源
ips.close();
socket1.close();
socket.close();
}
}
三次握手:
作用:确保连接建立
四次挥手:
作用:确保连接断开,且数据处理完毕