一、网络模型概述
OSI:Open System InterConnection,开放系统互联模型,分七层,每一层
都有一个明确的功能,分工明确,但是过于麻烦,于是出现了TCP/IP协议
TCP/IP模型:由于OSI模型过于麻烦所以出现了该种模型
二、TCP和UDP
UDP:数据报文协议,它是将数据封装到数据包里面,然后将数据包扔给对方,
对讲机就是UDP协议,QQ聊天也是UDP协议,该协议用于发送端和接收端之间数据的传输
>不需要建立连接
>每个数据包的大小限制在64K内
>因无连接,是不可靠的协议
>不需要建立连接,速度快
TCP:传输控制协议,打电话就是这种情况,只有电话接通了我才能跟对方说话,该协议用于客户端和服务端之间的数据传输
>建立连接,形成传输数据的通道。
>在链接中进行大数据量的传输
>通过三次握手完成连接,是可靠的协议
>必须建立连接,效率会稍低
以下是一个UDP协议的简单聊天程序
package cn.itheima.web; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; /** * 聊天程序发送端 * */ public class Send implements Runnable { // 创建UDP Socket服务 private DatagramSocket ds; public Send(DatagramSocket ds){ this.ds = ds; } public void run() { // 获取键盘输入 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); try { String msg = null; while ((msg = br.readLine()) != null) { if (msg.equals("88")) { break; } // 创建包,接收数据 DatagramPacket dp = new DatagramPacket(msg.getBytes(), 0, msg.length(), InetAddress.getByName("127.0.0.1"), 10000); // 发送数据 ds.send(dp); // 关闭资源 } ds.close(); br.close(); } catch (Exception e) { System.out.println("出异常啦:" + e.getMessage()); } } }
package cn.itheima.web; import java.net.DatagramPacket; import java.net.DatagramSocket; /** * 聊天程序接收端 * */ public class Rece implements Runnable{ //接收者socket private DatagramSocket ds; public Rece(DatagramSocket ds){ this.ds = ds; } public void run(){ //缓冲区 byte[] b = new byte[1024]; while(true){ try{ //数据包,接收客户端发来的数据 DatagramPacket dp = new DatagramPacket(b,b.length); //接收数据 ds.receive(dp); //将数据转换为字符串 String msg = new String(dp.getData(),0,dp.getLength()); System.out.println(msg); }catch(Exception e){ System.out.println("接收程序出错啦:"+e.getMessage()); } } } }
package cn.itheima.web; import java.net.DatagramSocket; public class ChatDemo { /** * 测试聊天程序 */ public static void main(String[] args) throws Exception{ DatagramSocket send = new DatagramSocket(); DatagramSocket rece = new DatagramSocket(10000); Send s = new Send(send); Rece r = new Rece(rece); new Thread(r).start(); new Thread(s).start(); } }