jjzjj

day39-网络编程01

liyuelian 2023-04-16 原文

Java网络编程01

1.网络相关的概念

1.1网络通信和网络

  • 网络通信
  1. 概念:两台设备之间通过网络实现数据传输
  2. 网络通信:将数据通过网络从一台设备传输到另一台设备
  3. java.net包下提供了一系列的类和接口,供程序员使用,完成网络通信
  • 网络
  1. 概念:两台或多台设备通过一定物理设备连接起来构成了网络

  2. 根据网络的覆盖范围不同,对网络进行分类:

    • 局域网:覆盖范围最小,仅仅覆盖一个教室或者一个机房
    • 城域网:覆盖范围较大,可以覆盖一个城市
    • 广域网:覆盖范围最大,可以覆盖全国甚至全球,万维网是广域网的代表

1.3ip地址和地址分类

  • ip地址
  1. 概念:用于唯一标识网络中的每台计算机/主机
  2. 查看ip地址:ipconfig
  3. ip地址的表示形式:点分十进制 xx.xx.xx.xx
  4. 每一个十进制数的范围:0~255
  1. ip地址的组成 = 网络地址+主机地址 ,比如:192.168.16.69

  2. IPv6是互联网工程任务组设计的用于替代IPv4的下一代IP协议,其地址数量号称可以为全世界的每一粒沙子编上一地址。

    IPv6使用128位bit(16个字节)表示地址,相当于IPv4地址长度的4倍

  3. IPv4最大的问题在于网络地址资源有限,严重制约了互联网的应用和发展。IPv6的使用,不仅能够解决网络地址资源数量的问题,而且也解决了多种计入设备连入互联网的障碍

  • ipv4地址分类

特殊的:127.0.0.1表示本机地址

1.4域名和端口

  • 域名
  1. 域名的好处:为了方便记忆,解决记忆ip的困难
  2. 概念:将ip地址映射成域名[DNS]
  • 端口
  1. 概念:用于标识计算机上某个特定的网络程序
  1. 表示形式:以整数形式,端口范围0~65535[2个字节表示端口 0~2^16-1]

  2. 0~1024已经被占用,比如ssh 22,ftp 21,smtp 25,http 80

    在网络开发中,不要使用到0~1024的端口

  3. 常见的网络程序端号:

  • tomcat : 8080
  • mysql: 3306
  • oracle: 1521
  • sqlserver: 1433

1.5网络通信协议

  • 简单的协议理解:

网络协议通俗地讲就是网络上两台计算机之间通信所要遵守的共同标准

这么讲还是不够通俗易懂,所以我们可以打个比方:

有两个人,一个中国人,一个法国人,如下:

            (用英语交流)

 中国人------------------------法国人
 
(讲中文)                   (讲法语)

[会英语]                      [会英语]

<英语协议>                   <英语协议>

这两个人要想交流,必须讲一门双方都懂的语言。如果大家都不会讲对方的民族语言,那么可以选择双方都懂的第三方的语言来交流,比如“讲英语”。那么这时候“英语”实际上就成为一种“网络协议”。

把网络协议比做通用语言只是一种形象比喻,实际上协议本身比自然语言要简单的多,但是却比自然语言更严谨。协议规定了一种交流信息的格式或者说规范,比如:字符“LOVE”表示什么意思,第2个字节表示什么含义等……只要大家都按同样的规范来表达自己的意思,对方就能“听懂”你的意思。

同一种“规范”遵守的人多了,就成为一种事实上的“标准”。比如TCP/IP协议就成为了一种最流行的网络协议。

初学者如何理解网络协议? - Tsingke - 博客园 (cnblogs.com)


  • TCP/IP协议

    TCP/IP 是 Transmission Control Protocol/Internet Protocol 的简写,中文名译为 传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是Internet最基本的协议、Internet国际互联网络的基础。简单的说,就是由网络层的IP协议和传输层的TCP协议组成的。

  • 数据进入协议栈时的封装/解封过程:

  • 网络通信协议:

注意:传输层虽然叫TCP层,但是并不只有TCP一个协议,只是因为TCP用的最多,网络层同理

在现实中真正使用的是TCP/IP模型,这四层对应上面的协议封装/解封过程

1.6TCP和UDP

  • TCP协议:传输控制协议
    1. 使用TCP协议前,需先建立TCP连接,形成传输数据通道
    2. 传输前,采用“三次握手”方式,是可靠的
    3. TCP协议进行通信的两个应用进程:客户端、服务端
    4. 在连接中可进行大数据量的传输
    5. 传输完毕,需释放已经建立的连接,效率低

三次握手的目的是建立可靠的通信通道,说到通信,简单来说就是数据的发生与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是否正常

  • UDP协议:用户数据协议
    1. 将数据、源、目的封装成数据包,不需要建立连接
    2. 每个数据报的大小限制在64k内,不适合传输大量数据
    3. 应无需连接,故是不可靠的
    4. 发送数据结束时,无需释放资源(因为不是面向连接的),速度快
    5. 举例:类似于学校广播通知,不能确定你个人是否听到了

2.InetAddress类

  • 相关方法:
    1. getLocalHost :获取本机的InetAddress对象
    2. getByName:根据指定主机名/域名 获取ip地址对象
    3. getHostName:通过 InetAddress 对象,获取相应的主机名
    4. getHostAddress:通过 InetAddress 对象,获取相应的地址

例子:

package li.network;

import java.net.InetAddress;
import java.net.UnknownHostException;

//演示 InetAddress 类的使用
public class API_ {
    public static void main(String[] args) throws UnknownHostException {
        // 1.getLocalHost:获取本机的 InetAddress 对象
        InetAddress localHost = InetAddress.getLocalHost();
        System.out.println(localHost);//LAPTOP-32SOPQVL/192.168.237.1

        //getByName
        // 2.1 :根据指定的主机名,获取 InetAddress对象
        InetAddress host1 = InetAddress.getByName("LAPTOP-32SOPQVL");
        System.out.println("host1="+host1);//host1=LAPTOP-32SOPQVL/192.168.237.1

        // 2.2 根据域名 获取ip地址对象  example:www.baidu.com
        InetAddress host2 = InetAddress.getByName("www.basidu.com");
        System.out.println("host2="+host2);//host2=www.basidu.com/8.210.41.100

        // 3.getHostAddress:通过InetAddress对象,获取相应的地址
        String hostAddress = host2.getHostAddress();//IP地址
        System.out.println("host2对应的ip地址="+hostAddress);//host2对应的ip地址=8.210.41.100

        // 4.getHostName:通过 InetAddress 对象,获取对应的主机名或者域名
        String hostName = host2.getHostName();
        System.out.println("host2对应的主机名/域名="+hostName);//host2对应的主机名/域名=www.basidu.com


    }
}

3.Socket

基本介绍:

  1. 套接字(Socket)开发网络应用程序被广泛采用,以至于成为事实上的标准

  2. 通信的两端都要有Socket,是两台机器间通信的端点

  3. 网络通信其实就是Socket间的通信

  4. Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输

  5. 一般主动发起通信的应用程序属于客户端,等待通信请求的为服务端

客户端和服务器端通常情况下,是在不同主机的。但是也有可能在同一台主机上

有关day39-网络编程01的更多相关文章

  1. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  2. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  3. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  4. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  5. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  6. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  7. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  8. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

  9. ruby-on-rails - Rails 中的 NoMethodError::MailersController#preview undefined method `activation_token=' for nil:NilClass - 2

    似乎无法为此找到有效的答案。我正在阅读Rails教程的第10章第10.1.2节,但似乎无法使邮件程序预览正常工作。我发现处理错误的所有答案都与教程的不同部分相关,我假设我犯的错误正盯着我的脸。我已经完成并将教程中的代码复制/粘贴到相关文件中,但到目前为止,我还看不出我输入的内容与教程中的内容有什么区别。到目前为止,建议是在函数定义中添加或删除参数user,但这并没有解决问题。触发错误的url是http://localhost:3000/rails/mailers/user_mailer/account_activation.http://localhost:3000/rails/mai

  10. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

随机推荐