目录
1.概述
常见的网络架构
2.网络编程三要素
a.ip
b.端口
c.协议
3.UDP协议
a.InetAddress类
1.概述
2.实例化对象
b.DatagramSocket类(快递公司)
c.DatagramPacket类(包裹)
d.单播、组播、广播
4.TCP协议
1.概述
2.客户端代码编写步骤
3.服务端代码编写步骤
1.概述
网络编程是指网络上的主机,通过不同的进程,以编程的方式实现网络通信(或称为网络数据传输)。这些程序可以进行数据的发送和接收,实现不同计算机系统之间的通信。
常见的网络架构
BS架构:BS架构的全称为浏览器(Browser)/服务器(Server),只需要一个浏览器,用户通过不同的网址。客户访问不同的服务器
优点:不需要开发客户端,只需要页面和服务端,用户不需要下载,打开浏览器就能使用
缺点:如果应用过大,用户体验受到影响
CS架构:CS架构的全称为客户端(Client)/服务器(Server),在用户本地需要下载并安装客户端程序,在远程有一个服务器端程序
优点:画面可以做的非常精美,用户体验好
缺点:需要开发客户端,也要开发服务端,用户需要下载和更新的时候太麻烦
2.网络编程三要素
a.ip
概述:设备在网络中的地址,是唯一的标识
IPv4:IPv4,即互联网协议版本4,是构成当今互联网的基础协议之一。IPv4地址由四个字节(8位)组成,通常以点分十进制格式表示,例如192.168.1.1
注意:
1.它使用32位地址长度,提供了大约42亿个唯一地址。由于地址空间有限,IPv4地址耗尽问题已促使向IPv6过渡。
2.局域网IP可以解决IPv4数量不够的问题
3.127.0.0.1永远代表本机的地址
IPv6:IPv6,即互联网协议第6版。IPv6地址长度为128位,提供了约2^128个唯一地址,极大地扩展了地址空间。IPv6的引入旨在解决IPv4地址耗尽问题,同时提供了更好的网络安全性和灵活性。
常见CMD命令:
ipconfig:查看本机IP地址
ping:检查网络是否连通
b.端口
概述:应用程序在设备中唯一的标识
注意:
1.端口号是由两个字节表示的整数,取值范围:0~65535,其中0~1023之间的端口号用于一些知名的网络服务或者应用,我们自己使用1024以上的端口号就可以了
2.一个端口号只能被一个程序使用
c.协议
概述:数据在网络中的传输的规则,常见的协议有UDP、TCP、http、https、ftp
UDP:UDP,即用户数据报协议,UDP是面向无连接协议,速度快,有大小限制一次最多发送64k,数据不安全,易丢失数据
TCP:TCP,即传输控制协议,TCP协议是面向连接的通信协议,速度慢,没有大小限制,数据安全
3.UDP协议
a.InetAddress类
1.概述
表示Internet协议(IP)地址
2.实例化对象
注意:主机名称可以是机器名称或者IP地址
b.DatagramSocket类(快递公司)
实例化对象:
注意:如果我们使用无参实例化对象,会在所有可用的端口中随机一个进行使用
常见方法:
c.DatagramPacket类(包裹)
实例化对象:
发送数据:
接收数据:
常见方法:
发送数据:
import java.io.IOException;
import java.net.*;
public class SendMessage {public static void main(String[] args) throws IOException {//创建快递公司DatagramSocket datagramSocket = new DatagramSocket();//发送的内容String string="Hellow World";//将字符串转换为字节码数组byte[] bytes = string.getBytes();//协议地址类InetAddress byName = InetAddress.getByName("127.0.0.1");//创建包裹DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, byName, 10086);//发送包裹datagramSocket.send(datagramPacket);//关流datagramSocket.close();}
}
接收数据:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;public class ReceiveMessage {public static void main(String[] args) throws IOException {//创建快递公司DatagramSocket datagramSocket = new DatagramSocket(10086);//创建字节数组接收数据byte[] bytes = new byte[1024];//创建包裹DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);//接收数据datagramSocket.receive(datagramPacket);//获取数据(字节码数组)byte[] data = datagramPacket.getData();//获取数据(端口号)int port = datagramPacket.getPort();//获取数据(地址)InetAddress address = datagramPacket.getAddress();//获取数据(长度)int length = datagramPacket.getLength();//将数据转换为字符串String string = new String(data, 0,length );System.out.println(string);//关流datagramSocket.close();}
}
d.单播、组播、广播
单播:指在计算机网络中,数据从一个发送节点直接传输到另一个特定的接收节点的通信方式。这种传输方式中,每次只有两个实体相互通信,发送端和接收端都是唯一确定的。它就像是两个人之间打电话,一对一进行信息交流。
组播:组播是在发送者和每一接收者之间实现点对多点网络连接的一种通信方式。如果一台发送者同时给多个接收者传输相同的数据,也只需复制一份相同的数据包。
注意:组播地址为224.0.0.0~239.255.255.255,其中224.0.0.0~224.0.0.225为预留的组播地址
发送端:
步骤:
①创建组播连接,使用MultiCastSocket类
②创建DatagramPacket对象打包数据,需要指定接收端口
③发送消息
④关闭连接
public class SendMessageDemo2 {public static void main(String[] args) throws IOException {//1.创建组播连接MulticastSocket mcs = new MulticastSocket();//2.创建数据包打包数据String str = "你好";byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("224.0.0.1");int port = 10086;DatagramPacket dp = new DatagramPacket(bytes, bytes.length,address,port);//3.发送消息mcs.send(dp);//4.关闭连接mcs.close();}
}
接收端:
步骤:
①创建组播连接,使用MultiCastSocket
②将当前连接加入组播地址
③创建DatagramPacket对象接收数据
④解析数据
⑤关闭连接
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;public class ReceiveMessage {public static void main(String[] args) throws IOException {//创建快递公司//DatagramSocket datagramSocket = new DatagramSocket(10086);MulticastSocket multicastSocket = new MulticastSocket(10086);//创建地址类InetAddress byName = InetAddress.getByName("224.0.0.0");//将本地连接加入组播multicastSocket.joinGroup(byName);//创建字节数组接收数据byte[] bytes = new byte[1024];//创建包裹DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);//接收数据multicastSocket.receive(datagramPacket);//获取数据(字节码数组)byte[] data = datagramPacket.getData();//获取数据(端口号)int port = datagramPacket.getPort();//获取数据(地址)InetAddress address = datagramPacket.getAddress();//获取数据(长度)int length = datagramPacket.getLength();//将数据转换为字符串String string = new String(data, 0,length );System.out.println(string);//关流multicastSocket.close();}
}
广播:将单播的代码创建数据包DatagramPacket时,将发送的地址改为255.255.255.255就成了广播,局域网中的所有设备都能受到消息。
4.TCP协议
1.概述
TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Sock对象通信之间要保证连接已经建立,通过Sock产生的IO流来进行网络通信
2.客户端代码编写步骤
①创建客户端Socket对象与指定服务端连接
Socket(String host,int port);
②获取输出流,写数据
OutputStream getOutputStream
③释放资源
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;public class Send {public static void main(String[] args) throws IOException {//创建Socker对象Socket socket = new Socket("127.0.0.1", 10086);//创建字节输出流OutputStream outputStream = socket.getOutputStream();//写入数据outputStream.write("你好".getBytes());//关流outputStream.close();socket.close();}
}
3.服务端代码编写步骤
①创建服务器端的socket对象(ServerSocket)
ServerSocker(int port)
②监听客户端连接,返回Socket对象
Socket accept()
③获取输入流,读数据,并把数据显示在控制台
InputStream getInputStream()
④释放资源
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;public class Receive {public static void main(String[] args) throws IOException {//创建ServerSocket对象ServerSocket serverSocket = new ServerSocket(10086);//监听客户端连接Socket accept = serverSocket.accept();//获取输入流InputStream inputStream = accept.getInputStream();//将字节流转换为字符流(不转换会出现乱码)InputStreamReader inputStreamReader = new InputStreamReader(inputStream);//定义变量接收数据int b;while ((b=inputStreamReader.read())!=-1){System.out.print((char)b);}//关流inputStream.close();serverSocket.close();}
}
4.三次握手和四次挥手
三次握手:
1.客户端向服务器请求建立连接,等待服务器同意并确认。
2.服务器向客户端返回一个响应,告诉客户端收到请求
3.客户端向服务器再次发送确认信息,表示客户端也确认了建立连接。
作用:确保连接建立
四次挥手:
作用:确保连接断开,且数据处理完毕