关于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,一经查实,立即删除!

相关文章

linux编写复制脚本程,常用的Shell脚本

1、通过位置变量创建linux系统账户及密码$1 是执行脚本的第一个参数,$2 是执行脚本的第二个参数1 #!/bin/bash2 #Author: Peter zh3 #Blog: https://home.cnblogs.com/zhangwduoduoj/4 #Time: 2019-08-17 19:19:455 #Name: userad.sh6 #Version: v1.07 #Description…

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

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

37-字符的全排列

题目内容:对字符串(数字,字母,符号)进行全排列,并统计全排列的种树输入描述输入一个字符串输出描述输出字符串的全排列,每种情况占一行,最后一行输出全排列的个数输入样例123输出样例…

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 从标准输入或者输入文件中读取文本。虽然语音输出与真人声音相去甚远。但是&…

python--*args和**kwargs可变参数

先来看个例子: #! /usr/bin/env python #codingutf-8def foo(*args, **kwargs):print(args,args)print(kwargs,kwargs)print(----------------------------)if __name__ __main__:foo(1,2,3,4)foo(a1,b2,c3)foo(1,2,3,4,a1,b2,c3)foo(a,1,None,a1,b2,c3) 结果&…

因果学习的三个层次

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

查看文件详细信息linux,linux命令stat,查看文件详细信息

搜索引擎广告过滤Chrome插件搜索广告屏蔽Chrome插件:自动过滤:百度,360,搜狗,google,bing的搜索广告,让魏则西的悲剧不再重演.珍爱生命,远离搜索广告! 下载:FuckAd.zip 安装:方法自行百度. 关闭百 ...如何解读SQL Server日志(2/3)接下来说说返回的Ro…

BZOJ1010玩具装箱 - 斜率优化dp

传送门 题目分析: 设\(f[i]\)表示装前i个玩具的花费。 列出转移方程:\[f[i] max\{f[j] ((i - (j 1)) sum[i] - sum[j] - L))^2\}\] 令\(x[i] sum[i] i\), \(P L 1\),上式化为:\[f[i] max\{f[j] (x[i] - x[j] - P)^2\}\]…

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

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

linux暂停线程和恢复,是否有可能在Linux [暂停]中检测到线程已进行上下文切换?...

能够当所述线程中的一个被切换上下文(即,暂停),以检测可以找到?至于你的问题是否可能 - 它认为这是可能的。至少SystemTap(https://sourceware.org/systemtap/)可以做到这一点。probe scheduler.ctxswitch{if (target_pid ! 0&& next…

大战设计模式【12】—— 迭代器模式

迭代器模式(Iterator) 设计模式使用的例子https://github.com/LinkinStars/DesignPatternsAllExample 一、定义 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。 二、结构 Iterator(抽象迭代器&#xff0…

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

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

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

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

css 外边距合并

1. 当一个元素出现在另一个元素上面时,第一个元素的下外边距会和第二个元素的上边距合并(取较大值) 2. 当一个元素包含另一个元素中时(没有内边距或边框把外边距分隔开),会发生合并; 2.1条件父元素无边框 2.2 父元素和子元素外边距之间无其他分格元素 3.…

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

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

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

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

linux int64_t 头文件,这对int64_t的处理是GCC和Clang的错误吗?

你不需要去POSIX对它进行排序,ISO C控制这个特定的方面(下面的参考是C11标准).这个答案的其余部分将成为所有“语言律师”,以显示为什么将未添加的行为添加到已签名的值中,以及为什么两个答案(真和假)都有效.首先,您在ISO中未定义int64_t的争论并不十分正确.第7.20.1.1节精确宽…

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

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

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

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