好记性不如赖笔头…………
两种常见的网络传输模型:
一、OSI模型分层
专业人员一般不说每一层的名称二是说第几层,这是等价的,层的位次得记清楚。
7)应用层——为终端用户提供应用程序服务。
6)表示层——为应用提供数据的表示形式。例如表示层告诉应用层哪儿有加密或它是否为一张.jpg图片。
5)会话层——在用户间管理会话。
4)传输层——在源定义数据段并编号,传送数据,并在目的地重组数据。增加(源、目的)进程号。
3)网络层——为能通过在其他网络上的中间设备进行端到端的发送建立和编址包。增加(源、目的)逻辑网络地址。
2)数据链路层——为在局域网上主机到主机或广域网的设备间的发送建立和编址帧。增加(源、目的)物理地址。
1)物理层——在设备间传送比特数据。物理层协议定义介质规范。定时和同步位。
二、TCP/IP模型分层
注意,不管是什么模型,低层是物理层,顶层是内容层
4)应用层——为用户表示应用数据。
3)传输层——支持设备间的通信和执行错误纠正。
2)网际层——确定通过网络的最佳路径。
1)网络接口层——控制网路的硬件设备和介质。
网络传输需要知道:地址、端口、协议
----------------------------------------------------------客户端代码----------------------------------------------------------
package com.Ckinghan.socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class UDPClient {
public static void main(String[] args) {
/**
* 启动简易UDP通信的客户端程序
*/
udpClient();
}
/**
* @描述:简易UDP通信的客户端程序
* @创建时间:
*/
public static void udpClient(){
//创建DategramSocket对象
DatagramSocket datagramSocket = null;
//创建输入流,从控制台读取数据
BufferedReader bufferedReader = null;
//设置服务器地址字符串
String ip = "192.168.0.178";
//设置IP信息
InetAddress inetAddress;
try {
//实例化inteAddress
inetAddress = InetAddress.getByName(ip);
//实例化datagramSocket
datagramSocket = new DatagramSocket();
//从控制台读取数据(默认的字符编码为GBK)
bufferedReader = new BufferedReader(new InputStreamReader(System.in,"GBK"));
//创建用户发送的信息
String sendString = null;
//循环等待用户输入信息
while (true) {
//读取用户的输入的信息
sendString = bufferedReader.readLine().trim();
//将要发送的信息转换为字节数组
byte[] sendBytes = sendString.getBytes("UTF-8");
//创建并实例化datagramPacket,指定要发送的数据、发送的数据长度、服务器IP地址、通信端口
DatagramPacket datagramPacket = new DatagramPacket(sendBytes, sendBytes.length, inetAddress, 10000);
//向服务器发送数据
datagramSocket.send(datagramPacket);
//如果用户输入的是close,则退出聊天客户端
if("close".equals(sendString))
break;
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭流
if(datagramSocket != null){
datagramSocket.close();
}
//关闭流
if(bufferedReader != null){
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
----------------------------------------------------------服务端代码----------------------------------------------------------
package com.Ckinghan.socket;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UDPServer {
public static void main(String[] args) {
/**
* 启动简易UDP通信的服务端程序
*/
socketServer();
}
/**
* @描述:简易UDP通信的服务端程序
* @创建时间:
*/
public static void socketServer(){
DatagramSocket datagramSocket = null;
try {
//实例化DategramSocket
datagramSocket = new DatagramSocket(10000);
//接收数据的byte[]数据
byte[] getDate = new byte[1024];
//用以接收用户保存的数据
DatagramPacket datagramPacket = new DatagramPacket(getDate, getDate.length);
//循环监听客户端发送的信息
while (true) {
//将用户发送的数据,放到dategramPacket中
datagramSocket.receive(datagramPacket);
//获取接收到的数据字节长度
int len = datagramPacket.getLength();
//获取接收到的数据
byte[] date = datagramPacket.getData();
//获取请求来源
InetAddress inetAddress = datagramPacket.getAddress();
//将接收到的字节转换为字符(将用户发送的信息还原)
String receive = new String(date, 0, len,"UTF-8");
//如果输入字符为close,则提示用户已退出循环
if("close".equals(receive)){
System.out.println(inetAddress.getHostAddress()+"的用户已退出会话!");
// break;
}
//输出用户发送的信息
System.out.println(inetAddress.getHostAddress()+" :"+receive);
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
//如果dategramSocket被实例化了,关闭流
if(datagramSocket != null){
datagramSocket.close();
}
}
}
}
执行效果: