网络编程1

网络编程

网络编程是Java最擅长的方向之一,使用Java进行网络编程时,由虚拟机实现了底层复杂的网络协议,Java程序只需要调用Java标准库提供的接口,就可以简单高效地编写网络程序。

1. 前置知识点

学习网络编程之前,我们需要先了解什么是计算机网络。

1.1 计算机网咯

什么是计算机网络呢?计算机网络是指两台或更多的计算机组成的网络,在同一个网络中,任意两台计算机都可以直接通信。

什么是互联网呢?互联网是网络的网络,即把很多计算机网络连接起来,形成一个全球统一的互联网。

1.2 OSI七层模型和TCP/IP四层模型

但这里存在一个问题,在将多个计算机网络进行连接时,不同的计算机网络,他们使用的协议可能各不相同,那这样就没法把不同的网络连接起来形成互联网。因此,为了把计算机网络接入互联网,国际标准化组织ISO提出了OSI(Open System Interconnection)开放系统互联的参考模型,为异构系统互联提供了概念性的框架。

并且由于计算机网络从底层的传输到高层的软件设计十分复杂,要合理地设计计算机网络模型,必须采用分层模型,每一层负责处理自己的操作。所以OSI网络模型是被ISO组织定义为一个七层计算机互联的标准模型,注意它只是一个定义,目的是为了简化网络各层的操作,提供标准接口便于实现和维护。这个模型从上到下依次是:

  • 应用层,提供应用程序之间的通信;

  • 表示层:处理数据格式,加解密等等;

  • 会话层:负责建立和维护会话;

  • 传输层:负责提供端到端的可靠传输;

  • 网络层:负责根据目标地址选择路由来传输数据;

  • 链路层和物理层负责把数据进行分片并且真正通过物理网络传输,如,无线网、光纤等。

  • 互联网实际使用的TCP/IP模型并不是对应到OSI的7层模型,而是大致对应OSI的5层模型:

但是ISO制定的OSI参考模型的过于庞大、复杂招致了许多批评。技术人员自己开发的TCP/IP协议栈获得了更为广泛的应用。

TCP/IP模型的每一层的作用:

  • 网络接口层负责接收IP数据报,并负责把这些数据报发送到指定网络上。

  • 网络互联层功能为进行网络互连,根据网间报文IP地址,从一个网络通过路由器传到另一网络。

  • 传输层的功能为通信双方的主机提供端到端的服务,传输层对信息流具有调节作用,提供可靠性传输,确保数据到达无误。

  • 应用层的功能为对客户发出的一个请求,服务器作出响应并提供相应的服务。

有了TCP/IP四层模型后,只要计算机网络都遵循该模型,这些计算机网络就可以互联组成互联网。

而网络编程的实质就是编写程序直接或间接地通过网络与其它计算机上的某个程序进行通讯。

但现在还存在一个问题,如何找到网络上的主机上要进行通讯的程序呢?

我们的每一个主机都会有IP地址,而每一个程序都会有端口号,有了IP地址和端口号之后,我我们就可以找到网络上指定主机上要进行通讯的指定程序。其中IP地址用于唯一标识一个网络接口,一台联入互联网的计算机肯定有一个IP地址,但也可能有多个IP地址;端口,就是应用程序用于数据交互的通道,用于实现程序间的通信。每个应用程序都有固定的端口。

注意:两个应用程序如果使用同一个端口,那么会抛出端口冲突异常java.net.BindException。

就好像我要去某宝网购某个物品,我需要提供我的详细地址物品才可以正确邮寄到家。但是有正确的地址还不够,我们还需要找一家靠谱的快递公司来进行运输。

在网络编程中,数据的传输由TCP/IP分层模型中的传输层负责,该层包含TCP和UDP两种协议。

  1. TCP协议

    • 比较可靠的双向流协议

    • 三次握手

      • 第一次握手:客户端给服务端发送一个建立连接的请求(请求建立连接)

      • 第二次握手:服务端收到客户端发送的请求后,给予客户端应答(这时确认客户端可以发送消息,服务端可以收到消息)(服务端向客户端发送 )

      • 第三次握手:客户端收到服务端的应答后再给服务端一个消息确认报告(确认服务端可以发送消息,并且客户端能收到消息)这时三次握手完成后,就可以保证两端都可以收发消息,连接建立完成。

    • 提供消息确认、错误检测和错误恢复等服务。如果数据在传输过程中有损耗,有遗失,会要求发送方重新发送。从而保证数据的完整性

  2. UDP协议

    • 比较不可靠。如果数据在传输中有耗损,不会要求重发,优点是速度快。

TCP协议就像是靠谱的快递公司,UDP就是不靠谱的典型。

2. 套接字

Java语言引入了Socket套接字的编程模型,使得程序员很方便的访问TCP/IP协议,从而开发各种网络应用程序。

这里有个问题,为什么需要用到Socket呢?

因为仅仅通过IP地址进行通信是不够的,同一台计算机同一时间会运行多个网络应用程序,例如浏览器、QQ、邮件客户端等。当操作系统接收到一个数据包的时候,如果只有IP地址,它没法判断应该发给哪个应用程序,所以,操作系统抽象出Socket接口,每个应用程序需要各自对应到不同的Socket,数据包才能根据Socket正确地发到对应的应用程序。

一个Socket就是由IP地址和端口号(范围是0~65535)组成,可以把Socket简单理解为IP地址加端口号。端口号总是由操作系统分配,它是一个0~65535之间的数字,其中,小于1024的端口属于特权端口,需要管理员权限,大于1024的端口可以由任意用户的应用程序打开。

客户端和服务器通过套接字建立连接,进行数据的发送和接收。其中客户端是指向另一台计算机请求服务的计算机,服务器是指处理客户端请求的计算机。一般情况下服务器和客户端共同承担计算。

一个TCP/IP套接字,由一个IP地址、一个端对端协议(TCP或UDP协议)、以及一个端口号确定。

2.1 套接字模型

Host A上的程序A将一段信息写入Socket中,Socket的内容被Host A的网络管理软件访问,并将这段信息通过Host A的网络接口卡发送到Host B,Host B的网络接口卡接收到这段信息后,传送给Host B的网络管理软件,网络管理软件将这段信息保存在Host B的Socket中,然后程序B才能在Socket中阅读这段信息。

2.2 Java对网络编程的支持

JDK预定义的网络编程相关类均存放在java.net包中。其中有InetAddress、Socket、ServerSocket和SocketImpl、DatagramPacket和DatagramSocket在内的很多可能的类。

例如:InetAddress类用于封装计算机的IP地址和DNS。但该类没有公有构造方法,所以不能直接利用new 关键字创建对象。可以使用以下常用方法来获取该类对象。

  • getLocalHost() -- 返回表示本地主机InetAddress对象

  • getByName(String hostName) -- 根据主机名返回对象

  • getAddress() -- 返回IP地址

  • getHostName() -- 取得IP地址代表的主机名

两个java程序通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称之为Socket套接字。Socket套接字通常用来实现客户服务器之间的连接。java.net包中的两个类Socket、ServerSocket分别用来实现客户端和服务端。

服务端实例(基础版)

 

客户端实例(基础版)

 

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值