一、网络模型:

OSI标准模型七层架构以及其传输数据的模型如下:

传输信息的过程由上之下逐渐封装,接收过程则是由下至上逐渐拆包,每一层只解析自己独立的部分。

二、网络的机要素

1、IP

1 public class NetTest {
2     public static void main(String[] args) throws UnknownHostException {
3         //获取本地ip
4         InetAddress ip = InetAddress.getLocalHost();
5         System.out.println(ip);
6     }
7 }

2、域名

  本地ip和域名映射文件  :  C:\Windows\System32\drivers\etc\hosts

  当用户访问的是服务器对应的域名时候,首先会在本地该映射文件中找,如果没有,则访问第三方厂商提供的域名解析器进行解析,最终将域名解析为ip地址进行访问。如下图:

3、端口port

  为了能够实现应用程序之间的通讯,引入端口来区分。例如飞秋和qq之间的通讯。

4、传输层协议

  传输层协议有一下几个TCP 、UDP 、 TLS 、 DCCP 、 SCTP 、RSVP 、 PPTP,常用的有TCP和UDP。

UDP:

  面向无连接;将数据及源和和目的封装成包,不需要建立连接;每一个数据包的大小限制在64kb以内;不需要连接,因此速度快;不安全(例如qq发送消息)。

TCP:

  需要建立连接,形成传输通道;在连接中进行大量的数据传输;通过三次握手完成连接,是安全可靠的;同比效率较低(例如用qq传递文件)。

5、网络传输中的重要概念Soket

  它是为通讯提供的一种机制;通信的两端都有Soket;网络通讯的实质就是Soket之间的通讯;数据在两个Soket之间及进行IO传输。

6、UDP

  UDP传输如同码头、船、集装箱和货物一样;发送的信息如同货物,DatagramPacket就是集装箱,多大的货物就要用对应的集装箱;传输协议如同船只,soket就是码头。接收端必须要有明确的端口。然后用自己的DatagramPacket(集装箱去封装货物)。代码和步骤如下:

 1 //基于UDP传输协议的多人聊天示例
 2 public class UdpChat {
 3     public static void main(String[] args) throws Exception {
 4         DatagramSocket dsk = new DatagramSocket();
 5         DatagramSocket res = new DatagramSocket(10001);//接收方必须有固定端口
 6         Send_Port send = new Send_Port(dsk);
 7         Resive_Port resv = new Resive_Port(res);
 8         new Thread(send).start();;
 9         new Thread(resv).start();;
10     }
11 }
12
13 /*
14  * 发送端
15  */
16 class Send_Port implements Runnable{
17     /*
18      * 步骤:
19      *     1、创建UDP的Soket,使其具备发送能力;
20      *     2、创建及封装需要传输的数据;
21      *     3、使用Soket的send方法进行发送;
22      *     4、关闭资源。
23      */
24
25     //该对象用于发送
26     private DatagramSocket dsk;
27     public Send_Port(DatagramSocket sp) {
28         super();
29         this.dsk = sp;
30     }
31     @Override
32     public void run() {
33         //键盘输入文本
34         BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
35         String line = null;
36         System.out.println("请输入:");
37         try {
38             while((line = bf.readLine()) != null) {
39                 if("886".equals(line)) {
40                     System.out.println("发送方终止通话");
41                     break;
42                 }
43                 byte[] bt = line.getBytes();
44                 /*参数:需要传输的数据;数据长度,接收方的ip地址,接收方的端口号*/
45                 DatagramPacket packg = new DatagramPacket(bt, bt.length, InetAddress.getByName("172.16.10.255"), 10001);
46                 dsk.send(packg);
47             }
48             dsk.close();//关闭资源
49         } catch (IOException e) {
50             e.printStackTrace();
51         }
52     }
53 }
54
55 /*
56  * 接收端
57  */
58 class Resive_Port implements Runnable{
59     /*
60      * 步骤:
61      *     1、创建UDP的Soket,用于接收
62      *     2、创建接受包,用于接收传递来的数据,其中需要规定接收专用的集合及其大小
63      *     3、接收数据
64      *     4、关闭资源。
65      */
66     private DatagramSocket drk;
67     //初始化参数
68     public Resive_Port(DatagramSocket drk) {
69         super();
70         this.drk = drk;
71     }
72     @Override
73     public void run() {
74         byte[] res_byte = new byte[1024];
75         DatagramPacket res = new DatagramPacket(res_byte , res_byte.length);//相当于集装箱。
76         while(true) {
77             try {
78                 drk.receive(res);
79                 String text = new String(res.getData(),0,res.getData().length);
80                 if(text!=null) {
81                     DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
82                     String date = df.format(new Date());
83                     if("886".equals(text)) {
84                         System.out.println("用户:"+res.getAddress()+"退出群聊!");
85                     }
86                     System.out.println(res.getAddress()+":"+text);
87                     System.out.print(date);
88                 }
89             } catch (IOException e) {
90                 e.printStackTrace();
91             }
92         }
93     }
94 }

7、TCP

  面向连接,详情人如下:

 1 public class TCPTest {
 2     /**
 3      * 服务端编程思想:(开启后将处于阻塞状态)
 4      *     1、创建服务端Socket,监听一个明确的端口;
 5      *     2、获取客户端对象(不用自己创建流)
 6      *     3、根据客户端对象获取到对应的输入流,读取客户端发来数据
 7      *     4、逻辑处理
 8      *     5、
 9      * @throws Exception
10      */
11     public static void main(String[] args) throws Exception {
12
13         //服务端socket,监听一个端口
14         ServerSocket ss = new ServerSocket(10003);
15         Service ser = new Service(ss);
16         ser.server();
17     }
18 }
19
20 class test{
21     /**
22      * 客户端编程思路:
23      *     1、创建客户端Soket,明确服务端的地址和端口。
24      *     2、三次握手,建立通道,如果通道建立成功,客户端和服务器就会形成Soke IO流。
25      *         客户端的任务就是获取到Socket中的输出流将,将信息传输服务器中。
26      *     3、通过输出流发送数据
27      *     4、关闭资源
28      *
29      * 注意事项:面向连接编程首先应该先启动服务器,这样客户端才能够像服务器发送请求
30      */
31     public static void main(String[] args) throws Exception {
32         //客户端socket,明确服务端ip和port
33         Socket s = new Socket(InetAddress.getByName("172.16.10.23"),10003);
34         Client cl = new Client(s);
35         cl.client();
36     }
37 }
38
39 class Client{
40     /*客户端socket*/
41     private Socket client_socket;
42     /* 初始化参数 */
43     public Client(Socket client_socket) {
44         super();
45         this.client_socket = client_socket;
46     }
47     public void client() throws Exception {
48         OutputStream out = null;
49         try {
50             System.out.println("客户端开始请求资源");
51             out = client_socket.getOutputStream();
52             out.write("请求资源".getBytes());
53         } catch (IOException e) {
54             throw new Exception("连接超时:"+ e);
55         }finally{
56             out.close();
57         }
58     }
59 }
60
61 class Service{
62     private ServerSocket service ;
63     public Service(ServerSocket service) {
64         super();
65         this.service = service;
66     }
67     /*阻塞状态*/
68     public void server() throws Exception {
69         System.out.println("服务器初始化完成...");
70         //获取客户端
71         Socket client = service.accept();
72         if(client!=null) {
73             //从客户端中获取输入流
74             InputStream in = client.getInputStream();
75             //读取
76             byte[] bt = new byte[1024];
77             int line = in.read(bt);
78             String text = new String(bt,0,line);
79             String ip = client.getInetAddress().getHostAddress();
80             System.out.println(ip+":"+text);
81             client.close();
82         }
83     }
84 }

  

转载于:https://www.cnblogs.com/L-W-T/p/7728844.html

关于TCP/IP协议及网络通信相关问题相关推荐

  1. tcp ip协议_网络通信-TCP/IP协议族简述

    导读:计算机与网络设备要相互通信需要遵守同样的规则.例如,如何找到通信目标.该使用哪种语言通信.怎么结束通信等规则.不同的硬件.操作系统之间的通信都需要遵循同一种规则,这种规则也称为是协议.下面本文主 ...

  2. TCP/IP协议之网络链接的背后故事

    1.当我们在网页浏览器的地址中输入URL时,Web页面是如何呈现的? web页面通过浏览器地址中的URL从web服务端获取文件资源等信息,从而显示出web页面. web通过HTTP协议,完成客户端到服 ...

  3. 网络协议OSI、TCP/IP协议、Socket套接字和第三方AsyncSock的使用等解析

    一.网络协议定义 1.OSI参考模型:全称(Open System Interconnection), 开放式系统互联参考模型.是一个逻辑上的定义,一个规范,它把网络协议从逻辑上分为七层,只要目的是为 ...

  4. TCP/IP 协议簇 端口 三次握手 四次挥手 11种状态集

    第1章 概念介绍 1.1 VLAN 1.1.1 什么是VLAN VLAN(Virtual LAN),翻译成中文是"虚拟局域网".LAN可以是由少数几台家用计算机构成的网络,也可以是 ...

  5. TCP/IP协议族(一) HTTP简介、请求方法与响应状态码

    接下来想系统的回顾一下TCP/IP协议族的相关东西,当然这些东西大部分是在大学的时候学过的,但是那句话,基础的东西还是要不时的回顾回顾的.接下来的几篇博客都是关于TCP/IP协议族的,本篇博客就先简单 ...

  6. http、TCP/IP协议与socket之间的区别

    网络由下往上分为:  www.2cto.com   物理层--                       数据链路层-- 网络层--                       IP协议 传输层-- ...

  7. Network 之五 TCP/IP 协议族、工作流程、常用协议格式

      最近工作需要搞网络相关的内容,由于之前对网络了解比较少,因此开始重点学习一下网络相关的各种知识.博文中的有些内容来自于在学习过程中对于一些互联网上我认为的重点知识的记录,如果侵权请联系删除!    ...

  8. 基于tcpdump实例讲解TCP/IP协议

    前言 虽然网络编程的socket大家很多都会操作,但是很多还是不熟悉socket编程中,底层TCP/IP协议的交互过程,本文会一个简单的客户端程序和服务端程序的交互过程,使用tcpdump抓包,实例讲 ...

  9. 面试篇-- Http、TCP/IP协议与Socket之间的区别

    网络由下往上分为: 物理层-- 数据链路层-- 网络层-- IP协议 传输层-- TCP协议 会话层-- 表示层和应用层-- HTTP协议 1.TCP/IP连接 手机能够使用联网功能是因为手机底层实现 ...

最新文章

  1. python的yield和yield from
  2. free mybatis 不生效_关于 Mybatis 设置懒加载无效的问题
  3. 开发进度月报(GB8567——88)
  4. Ubuntu磁盘扩容及启动问题整理
  5. 使用Spring Security和jdbc的Spring Boot第2部分
  6. mysql实现主从复制
  7. [转]天天生鲜,html效果布局
  8. 北京可以备案什么域名
  9. ros开发增加clion常用模板及初始化配置(六)
  10. Python 双y轴绘制
  11. 领克发布智能电混技术 全新设计语言概念车亮相
  12. 制作嵌入式文件系统工具 mkfs.ext2 mkfs.ext3 mkfs.ext4
  13. 常用颜色中英文名称及RGB数值表
  14. Alt+Tab快捷键:使用键盘实现众多窗口情况下的多任务快速切换,提高打工效率
  15. JAVA使用接口实现类的功能------JAVA入门基础教程
  16. DL645通信协议97/07规约
  17. 两个系统怎样使用通用的接口来对接
  18. bin文件以及bin文件合并
  19. 【一头扎进JMS】(2)----ActiviteMQ点对点消息实现
  20. freopen函数的运用

热门文章

  1. python对文件的写操作方法writetext_用python实现读写文件常见操作方式
  2. Java 集合框架(List、Set、Map、Iterator、Stack、Properties)
  3. 03.结构化机器学习项目 W2.机器学习策略(2)
  4. LeetCode MySQL 615. 平均工资:部门与公司比较(over窗口函数)
  5. LeetCode 1276. 不浪费原料的汉堡制作方案(解方程)
  6. LeetCode 887. 鸡蛋掉落(DP,难、不懂)
  7. java json path_Java使用JSONPath解析JSON完整内容详解
  8. python读文件出现特殊字符_python- pandas :读取列中带有特殊字符的文件
  9. python语言画心_python语言还是java如何用python画爱心
  10. ifix的MySQL数据库_iFIX 技术文章:iFIX历史数据库