黑马程序员_Javase 网络编程学习总结

   -------<a href="http://www.itheima.com/"">android培训</a>、<a   href="http://www.itheima.com/" ">java培训</a>期待与您交流!----------

 

                                                                           黑马程序员_ Javase 网络编程学习总结

 

网络编程一直是我非常向往的编程技术。

Java语言在网络编程这一领域特别强大,这也是Java能在编程语言中脱颖而出被人广泛接受的一个原因。

网络编程就是指通过网络实现计算机(不只局限于计算机)间远程通信的编程技术。

 

网络编程三大要素

网络编程,实现网络通信必须明确三大要素

1.IP地址:在网络中每台计算机都有一个自己的IP地址用于网络通信。该地址被称为IP地址。由四个字节组成每段最大值为255.

这就如同我们每个人都有一个收件地址一样,通过收信地址来和他人进行书信联系。

2.端口:计算机中每个网络应用程序都有自己监听的端口,从网络中接受自己端口监听的数据。端口用0~6535的整数表示。其中0~1024的端口默认被系统应用所占用。

3.协议:为了实现网络中计算机的通讯,相互通讯的计算机在每一层都必须遵守相同的协议。如应用层就遵守了http,https等协议。网际层遵守了IP协议。

 

那网络通讯到底是怎样的呢,他的过程是什么样的呢?

这些可以通过网络模型来得到答案。

网络模型就是将网络通信这一过程进行形象化展示,将通信过程细致化的划分。

网络模型有两种

一 OSI参考模型

应用层

表示层

会话层

传输层

网络层

数据链路层

物理层

 

二 TCP/IP参考模型

应用层

传输层

网际层

主机至网络层

 

网络通讯的过程:从应用层开始,将要发送出去的数据用其相应层的的通讯协议进行封装然后层层往下传递再封装。最后数据通过网络由一台计算机发送到另外一台目标计算机。目标计算从网络上获得数据由底层到高层根据每一层的协议层层拆包,最后应用程序接收到程序。这就是网络通信的大致过程。

 

理论OK,回到语言本身。

Java把网络通讯的两大要素都封装成了类。以便于我们使用。(端口很简单,就是数字标识就没有封装成对象了)

InetAddress IP地址类。

该类将IP地址进行封装,提供了对IP操作的强大功能。

该类不能直接用new创建对象。

获取该类的方法:

Static InetAddress[]   getAllByName(String host);

根据主机名返回与之对应的IP地址[].

 

Static InetAddress getByName(String host)在给定主机名的情况下确定主机的 IP 地址。

 

Static InetAddress getByAddress(byte[] byte) 在给定原始IP地址的情况下,返回InetAddress对象

 

Static InetAddress getByAddress(String host,byte[]byte) 

在给定主机名和IP地址原始值时,获取InetAddress.

 

Static InetAddress getLocalHost() 获得本机的InetAddress对象。

 

常用方法:

String getHostName() 返回此IP的主机名。

String getHostAddress() 返回此IP的字符串表现形式。

 

传输层的两种协议。

1.UDP协议

特点1:面向无连接,在传送数据前可以不建立连接。

2.将数据,数据源,目的封装成数据包。每个数据包大小不能超过64k。

3.是不可靠协议,传送的数据有可能丢失。

4.因传送数据前不需要建立连接,效率高。

如手机发信息,视屏会议,聊天都属于UDP协议。

 

TCP传输协议

特点1.面向连接。在传输数据前必须建立好连接。形成数据传输的通道。

2.在数据传输通道中进行大数据的传输,如果连接中止,就立即终止数据传输。

3.是可靠的传输协议,保证数据不丢失。

4.因为必须要建立连接,所以效率稍低些。

如下载,打电话都是TCP连接方式。

 

UDP传输协议,将数据,数据源目的地都封装成数据包。Java同样将数据包封装成了类。

DatagramPack  数据包类。

构造函数(发送数据的数据包)

DatagramPack  (byte[]buf,int length,InetAddress, address,int port)

将要发送的数据字节数组,数据长度,目标IP,端口封装成数据包。

用于接收的数据包构造函数

DatagramPack (byte[]buf,int length)

构造数据包,用来接收长度为length的字节数组存入buf中。

常用方法:

InetAddress getAddress() 从数据包中获取IP。

int  getport()从数据包中获取端口。

Int  getlengt()从数据包中获取数据的长度。

 

UDP传输协议:发送数据的步骤

1.建立Socket服务创建DatagramSocket对象。

2.提供要发送的数据,目标IP端口。将其封装成数据包。

3.用DatagramSocket的send()方法将数据包放送出去。

4.关闭底层资源(关闭socket服务)

以下代码演示UDP发送端的创建

 

 

UDP传输协议  创建接受网络数据端的步骤。

1.建立Socket服务创建DatagramSocket对象,指定其监听的端口。

2.创建用于接收数据的数据包。

3.DatagranSocket的recevice(DatagramPack dp)方法接受数据,将数据存入定义好的数据包中。

4.关闭底层资源。(关闭Socket服务)

以下代码演示UDP接收端创建

 

TCP协议Socket服务创建方式。

该协议的创建通过两个对象来完成。Socket与ServerSocket。客户端与服务端。

客户端创建:该类在创建对象时就必须指定要建立连接的服务端的IP和端口。因为TCP是面向连接的。所以在启动客户端时就必须有服务端。客户端与服务端链接成功后就建立了通路。可在该通路上进行大数据的传输。

创建客户端的步骤:

1.创建Socket服务,建立Socket对象(对象建立成功后,就与服务端建立了连接)。

2.根据Socket的getInputStream()和getOutputStream()获取字节输入流与输出流。用这两个流来和服务端进行通信。

3.关闭资源,关闭Socket服务。

以下代码演示客户端的建立。

 

服务端(ServerSocket

当服务端与客户端建立连接创建通信通道后,服务端就可以获得客户端的对象,用ServerSocketaccept()。用客户端的输入流与输出流来与客户端通信。

这样做是因为在实际生活中服务端时会同时为多个客户端服务的。这样做可以保证服务端不会将信息发错给别的客户端。

PS 个人猜想:我猜客户端Socket的输入输出字节流其实就是一对管道流。输出流将数据写到输入流里面,输入流输出流写入的数据。这样就实现了客户端与服务端的通信。当然这只是个人猜想不敢保证绝对正确。

服务端创建步骤:

1.创建Socket服务,建立ServerSocket对象。

2.获取连接过来客户端的对象。用accept().

3.用客户端的输入输出流来和客户端通信。

4.关闭客户端,断开客户端与服务端的连接。

以下代码演示服务端的创建。

 

 

在客户端上传数据给服务端时,数据上传完毕后必须给出结束标记,不然服务端就会一直等待,客户端也会一直连接在服务端上,超过一定时间就会出现connection rest异常。

所以在客户端上传完数据后可以用showdownOut()来告知服务端数据上传完毕。

以下代码演示客户端向服务端上传文件,服务端接受客户端的文件保存在本地硬盘上。

 

 

 

 

 

 

 

  -------<a href="http://www.itheima.com/"">android培训</a>、<a   href="http://www.itheima.com/" ">java培训</a>期待与您交流!----------

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭