网络通信协议
目前应用最广泛的是TCP/IP协议(Transmission Control Protocal/Internet Protocal传输控制协议/英特网互联协议),它是一个包括TCP协议和IP协议,UDP(User Datagram Protocal)协议和其它一些协议的协议组
TCP/IP协议中的四层分别是应用层、传输层、网络层和链路层,每层分别负责不同的通信功能。
链路层:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤、网线提供的驱动。
网络层:网络层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络。
运输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议。
应用层:主要负责应用程序的协议,例如HTTP协议、FTP协议等
IP地址和端口号
在TCP/IP协议中要想使网络中的计算机能够进行通信,必须为每台计算机指定一个标识号就是IP地址
IP地址广泛使用的版本是IPv4,它是由4个字节大小的二进制数来表示。通常会将IP地址写成十进制的形式,每个字节用一个十进制数字(0-255)表示,数字间用符号“.”分开
想访问目标计算机中的某个应用程序,还需要指定端口号
UDP协议
UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接,不能保证数据的完整性
UDP协议特点:
1).数据需要打包发送;
2).数据包的大小有限制--64k
3).发送时可以没有接收端,所以被称为不安全的协议。
例如:共屏软件、视频会议...
TCP协议
TCP协议是面向连接的通信协议,即在传输数据前先在发送端和接收端建立逻辑连接,然后再传输数据
第一次握手,客户端向服务器端发出连接请求,等待服务器确认,
第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求,
第三次握手,客户端再次向服务器端发送确认信息,确认连接
TCP协议特点:
1).数据不需要打包;
2).数据大小无限制;
3).发送时必须要有接收端,所以被称为安全的协议。
例如:文件上传,点对点聊天
- (UDP协议发送数据)
public static void main(String[] args) throws IOException {
//1.创建一个DatagramSocket对象
DatagramSocket socket = new DatagramSocket();
//2.准备数据:
InetAddress ip = InetAddress.getByName("127.0.0.1");//目标IP
int port = 8888;//目标端口
byte[] data = "你好,吃了吗?".getBytes();//信息内容
// 3.准备一个"数据包"对象:DatagramPacket,将上面准备的传给数据包对象;
DatagramPacket pck = new DatagramPacket(data, //信息的byte[]数组
data.length, //信息长度
ip, //目标IP
port); //目标端口
//4.调用DatagramSocket对象的send()发送"数据包"
socket.send(pck);
//5.关闭连接
socket.close();
System.out.println("发送完毕!");
} - (UDP协议接收数据)
public static void main(String[] args) throws IOException {
//1.创建一个DatagramSocket(int 本机监听端口)对象
DatagramSocket socket = new DatagramSocket(8888);
//2.创建一个空的byte[]数组,准备接收信息;
byte[] byteArray = new byte[1024];
//3.创建一个空的数据包对象(DatagramPacket),将byte[]数组传给它。
DatagramPacket pck = new DatagramPacket(byteArray,byteArray.length);
//4.4.使用socket对象的receive()接收数据,
System.out.println("等待数据...");
socket.receive(pck);//注意:程序将会在这里被阻塞
System.out.println("有数据到达...");
//5.解析数据包,获取数据。
byte[] data = pck.getData();
String s = new String(data,0,pck.getLength());
System.out.println("接收到信息:" + s);
// 6.关闭连接
socket.close();
} - TCP通信首先创建代表服务器端的ServerSocket对象,该对象相当于开启一个服务,并等待客户端的连接,然后创建代表客户端的Socket对象向服务器端发出连接请求,服务器端响应请求,两者建立连接开始通信
-
(TCP协议发送数据)
public static void main(String[] args) throws IOException {
//1.创建一个Socket(String 目标IP,int 目标端口)对象。
Socket socket = new Socket("127.0.0.1",8888);
//2.由于要发送数据,所以要从Socket中获取一个"输出流--OutputStream"。
OutputStream out = socket.getOutputStream();
//3.使用输出流输出数据;
out.write("你好,吃的啥?".getBytes());
//4.关闭连接
socket.close();
System.out.println("客户端发送完毕!");
} -
(TCP协议接收数据)
public static void main(String[] args) throws IOException {
//1.创建一个ServerSocket(int 本机监听端口)对象
ServerSocket server = new ServerSocket(8888);
//2.等待连接,如果有客户端连接成功,会产生一个Socket对象,并继续执行;
Socket socket = server.accept();//程序会在这里阻塞,等待客户端连接
//3.通过Socket对象获取一个输入流。
InputStream in = socket.getInputStream();
//4.通过输入流读取数据;
byte[] byteArray = new byte[1024];
int len = in.read(byteArray);
String s = new String(byteArray,0,len);
System.out.println("服务器端收到信息:" + s);
//5.关闭连接
socket.close();
server.close();
}