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

一、网络模型:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/487359.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

世界人工智能发展究竟到了什么水平

来源:第一财经关于人工智能在当今科技界的发展水平,学术界、产业界和媒体界可能会有不同的看法。我经常听到的一个说法是:现在基于大数据与深度学习的人工智能是一种完全新颖的技术形态,它的出现能够全面地改变未来人类的社会形态…

Quanta杂志长文翻译:通过信息论判定个体的边界

本文是“Quanta magazine”文章“What Is an Individual? Biology Seeks Clues in Information Theory” 的全文翻译。译者Peter,原文地址 https://www.quantamagazine.org/what-is-an-individual-biology-seeks-clues-in-information-theory-20200716/导读&#x…

linux语言 翻译工具,Linux文本转语音工具eSpeak介绍

Text to speech tool in LinuxeSpeak是一款 Linux 命令行工具,能把文本转换成语音。它是一款简洁的语音合成器,用C语言编写而成,它支持英语和其它多种语言。eSpeak 从标准输入或者输入文件中读取文本。虽然语音输出与真人声音相去甚远。但是&…

因果学习的三个层次

来源:混沌巡洋舰昨天龚鹤扬博士在集智的讲座因果学习综述,我借此机会结合我的理解给大家总结客串下这个讲座,和因果学习的核心内容,及巡洋舰一段时间关于因果的文章汇总。这个讲座分为三部分,第一是什么因果及其哲学基…

人与机器——解析人工智能的三大类别以及哲学家的相关思想实验

来源:北京物联网智能技术应用协会你是否曾经产生过怀疑,你身边的某个人可能是个机器人呢?毕竟现在由于技术的发展,机器人的外观、行为都有可能被设置得和人类十分相像。这似乎有些荒谬和匪夷所思,但是你如何能百分之百…

MIT最新报告:完全无人驾驶仍需10年,马斯克:特斯拉已经实现

来源:机器学习研究组订阅号两年前,麻省理工学院成立了「未来工作特别小组」,这个小组目前有20多人,旨在研究「大众创新年代」的工作演变。近期,他们发表了一个最新的报告,重点关注了自动驾驶领域的进展。而…

win7 linux双系统win7启动不了怎么办,双系统windows打不开怎么办|苹果双系统win7打不开怎么解决|mac双系统打不开解决方法-系统城...

2016-03-30 19:28:38  浏览量:22401很多用户都会在电脑上安装Windows双系统甚至多系统,在开机的时候就会出现一个启动菜单让用户选择,如果没有选择将会自动启动默认的系统,那么双系统要怎么修改默认的启动项呢?今天系…

是时候抛弃旧的摩尔定律了

来源:IEEE转自:悦智网在技术领域最著名的准则之一就是摩尔定律。在过去55年的时间里,“摩尔定律”已经描述并预测了晶体管的缩小,如一组称为技术节点的数字在过去以大约每两年一次的频率更新。像一些基于物理学的世界末日时钟一样…

网络对抗技术—-网络对抗实验四

学 号:201421430008 中国人民公安大学 Chinese people’ public security university 网络对抗技术 实验报告 实验四 恶意代码技术 学生姓名 吴宙杨 年级 2014 区队 3 指导教师 高见老师 信息技术与网络安全学院 2016年11月7日 实验任务总纲 2016—20…

北大副校长詹启敏回应“25篇论文造假”,​PubPpeer到底靠不靠谱?

来源:科研大匠今日,北京大学常务副校长、北大医学部主任、中国工程院院士詹启敏在个人公众号“潇敏 ScienceArt”上发布《詹启敏关于相关情况的说明》文章,回应了昨日 DeepTech 对北京大学常务副校长詹启敏 25 篇相关论文受到学术不端质疑。事…

c语言课设报告时钟vc环境,C语言课程设计报告模拟时钟转动程序

C语言课程设计报告模拟时钟转动程序 课程设计报告题 目 课 程 名 称 结构化程序设计课程设计 院 部 名 称 专 业 班 级 学 生 姓 名 王蕾 学 号 课程设计地点 课程设计学时 指 导 教 师 金陵科技学院教务处制 程序设计综合课程设计I目 录第一章 课程设计的目的和要求 1.1 C 语言…

用人工智能监督人工 遭遇非技术困局

来源:科技日报远程办公常态化催生云监工软件市场。近日一款名为Enaible的AI监工软件销售火爆,这种AI软件不仅可以盯着员工干活,还可以对员工的工作效率进行打分……一场新冠肺炎疫情,让远程办公逐渐成为常态。钉钉、飞书、企业微信…

Windows10 【系统周期表】【系统下载表】【大型软件表】

系统周期表 商用名称商用英文名代号版本系统版本上市日期服务周期备注Windows 10无Threshold 1150710.0.10240.174432015.07.292015.07.29 - 2015.11.12默认值Windows 10十一月更新Windows 10 November UpdateThreshold 2151110.0.10586.9622015.11.122015.11.12 - 2016.08.02W…

2020年中国城市人工智能发展指数报告

来源 | 36氪研究院(转载请注明来源)编辑 | 张775大维度、20个三级指标,全面剖析中国36个城市人工智能发展情况2020年是全面建成小康社会与“十三五”规划收官之年,为了实现全面建设小康社会的发展目标、增强经济发展韧性&#xff…

c语言程序设计 函数说课,《C语言程序设计》之函数说课课件.ppt

您所在位置:网站首页 > 海量文档&nbsp>&nbsp计算机&nbsp>&nbspC/C资料《C语言程序设计》之函数说课课件.ppt16页本文档一共被下载:次,您可全文免费在线阅读后下载本文档。下载提示1.本站不保证该用户上传的文档完整性&#x…

中科院院士:40年7位诺奖得主,美国贝尔实验室做对了什么?

来源:科学网作者:夏建白本文介绍高科技的摇篮之一―― 美国贝尔实验室。本文将不具体介绍在贝尔实验室中发明晶体管、集成电路、激光器、光通信等的具体研究过程,而是介绍贝尔实验室的历届领导和管理思想,尝试探讨其取得这样重大成…

麻省理工最新报告:完全无人驾驶仍需10年

来源:机器人网、新智元两年前,麻省理工学院成立了「未来工作特别小组」,这个小组目前有20多人,旨在研究「大众创新年代」的工作演变。近期,他们发表了一个最新的报告,重点关注了自动驾驶领域的进展。而得出…

一键多功能按键识别c语言,单片机一键多功能按键识别设计

1.实验任务如图4.9.1所示,开关SP1接在P3.7/RD管脚上,在AT89S51单片机的P1端口接有四个发光二极管,上电的时候,L1接在P1.0管脚上的发光二极管在闪烁,当每一次按下开关SP1的时候,L2接在P1.1管脚上…

人工智能会取代科学家吗

来源:光明日报传统认为,科技工作因其高度的创新性,因此科技工作者很难被人工智能取代。但日前,国际学术期刊《自然》发表的一篇论文吸引了大家的眼球。科学家们改造了一种汽车装配线上常见的机器人,让它可以在化学实验…

C语言if( x)的意思,c语言中if(x)是什么意思?_后端开发

对比说明PHP7的优化提升_后端开发此篇张是我对PHP7跟PHP以前版本做的一个对比&#xff0c;先来说下PHP7带来的新东西&#xff1a;类型的声明、【set_exception_handler()】、新增操作符“??”“<>”、匿名函数、define定义常量数组、命名空间引用优化等。c语言中if(x)表…