JAVA学习日记(二十六)网络编程
一、网络编程的概念
常见的软件架构:
二、网络编程三要素
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.27String name=address.getHostName();System.out.println(name); //LAPTOP-AIFHRFPIString 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 表示本机IPInetAddress 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.1InetAddress 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();}
}
三次握手:
作用:确保连接建立
四次挥手:
作用:确保连接断开,且数据处理完毕