Java网络编程

        大家好久不见了,前面把多线程的一些知识点做了总结学习,从今天开始我们学习Java网络编程的相关知识。加油哦!

计算机网络就是通过传输介质、通信设施和网络协议,把分散在不同地点的计算设备互连起来,实现资源共享和数据传输的系统。 网络编程就就是编写程序使联网的两个(或多个)设备(例如计算机)之间进行数据传输。Java语言对网络编程提供了良好的支持,通过其提供的接口我们可以很方便地进行网络编程。

TCP/IP协议簇

TCP/IP协议栈是一系列网络协议的总和,是构成网络通信的核心骨架。

分层模型

TCP/IP协议栈的分层模型常见的有2个,分别是TCP/IP参考模型和ISO组织提出的OSI参考模型。

OSI参考模型是一个开放的通信系统互联参考模型。

OSI参考模型TCP/IP参考模型对应协议
应用层应用层http、ftp、telnet、DNS等
表示层
会话层
传输层传输层TCP、UDP
网络层网络层IP、ICMP、ARP
数据链路层网络访问层Link
物理层

 TCP/IP参考模型

TCP/IP协议采用4层架构,从上向下分为应用层、传输层、网络层和链路层,每一层都可以使用其下一层的协议完成自己的需求,不允许下层访问上层。

当通过http协议发起一个请求时,从上往下依次通过应用层、传输层、网络层和链路层,每一层相关协议都依次对数据包进行处理,并携带响应的首部,最终在链路层生成以太网数据包,通过物理介质进行传输,传送到对方主机后,对方主机再依次从下向上使用响应协议进行拆包,最终经应用层数据交给应用程序进行处理。

三次握手:

TCP是面向连接的协议,连接连接需要有3个阶段:连接建立、数据传送和连接释放。其中连接建立需要经历3个步骤,通常称为三次握手。

 第一次握手:建立连接时,客户端发送syn包(seq=j)到服务器,并进入SYN_SENT状态,等待服务器确认。 

第二次握手:服务器收到syn包,必须确认客户端的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

四次挥手

由于TCP连接是双工的,所以每个方向都必须单独进行关闭

 第一步,当主机A的应用程序通知TCP数据已经发送完毕时,TCP向主机B发送一个带有FIN附加标记的报文段。

第二步,主机B收到这个FIN报文段之后,并不立即用FIN报文段回复主机A,而是先向主机A发送一个确认序号ACK,同时通知自己相应的应用程序:对方要求关闭连接(先发送ACK的目的是为了防止在这段时间内,对方重传FIN报文段)。

第三步,主机B的应用程序告诉TCP:我要彻底的关闭连接,TCP向主机A送一个FIN报文段。 

第四步,主机A收到这个FIN报文段后,向主机B发送一个ACK表示连接彻底释放。


IP地址

在网络中定位一个机器需要通过IP地址,IP协议可以分为IPv4IPv6两种,IPv4采用的是点分十进制的计法,例如192.168.1.8。

Java中提供了一个InetAddress实现对IP地址的封装,子类Inet4AddressInet6Address,这个类一般会和Socket一起使用。

InetAddress没有公共的构造方法,必须通过使用静态方法获取对应的实例。


URL编程

java.net.URL对象用于代表一个网络环境的资源,资源可以是简单的文件或者目录,也可以是复杂对象的引用,例如数据库或者搜索引擎的查询。URL使用协议名、主机名、端口号和资源组成,基本格式为protocol://host:port/resource,由于不同的协议有对应的标准端口号,如果使用标准端口,这个端口号可以省略,http协议的标准端口号为80

        URL统一资源定位器,实际上就是一个资源的指针

        URI统一资源标识符,实际上就是一个URL的名称

        目前考虑到http协议缺少安全机制,很容易被监听;所以引入https协议。https=http+SSL安全套接层,可以实现传输数据的加密,默认端口号443

try{
    URL url =new URL("http://campus/banner.jpg");
    InputStream is=url.openStream();
    OutputStream os=new FileOutputStream(d:/banner.jpg);
    byte[] buffer=new byte[8192];
    int len=0;
    while((len=is.read(buffer))>0){
        os.write(buffer,0,len);
    }
    is.close();
    os.close();
}catch(IOException e){
    e,printStackTrace();
}

可以通过URL对象获取访问相关的属性

        String getFile()获取资源名

        String getHost()获取主机名

        String getPath()获取路径部分的名称

        int getPort()获取端口号,如果不能获取则返回-1

重要方法

openConnection():URLConnection可以获取输入、输出流

openStream():InputStream直接获取服务器的响应输出流

URL与URLConnection区别

语义上来说:URL代表一个资源的位置,URLConnection代表的是连接。

Java提供两种读取数据的方法:

        1、通过URL对象直接获取相关的网络信息。

        2、先获取一个 URLConnection实例,然后再得到响应的InputSteamOutputStream,实现数据的读写。

URL是一种简单直接的方法,但是缺乏灵活性,并且只能读取只读性质的信息;URLConnection提供了非常灵活有效的方法来读取网络资源。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值