黑马程序员--java笔记15--网络编程 Java.net

来源:互联网 发布:中国网络自由 编辑:程序博客网 时间:2024/06/07 02:43
------- android培训、java培训、期待与您交流! ----------

网络编程

网络参考模型

OSIOpen System Interconnection 开放系统互连)参考模型

TCP/IP 参考模型


七层描述

1. 物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由10转化为电流强弱来进行传输,到达目的地后再转化为10,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。

2. 数据链路层:主要将从物理层接收的数据进行MAC地址(网卡的地址)的封装与解封装。常把这一层的数据叫做帧。在这一层工作的设备是交换机,数据通过交换机来传输。

3. 网络层:主要将下层接收到的数据进行IP地址(例,192.168.0.1)的封装与解封装。在这一层工作的设备是路由器,常把这一层的数据叫做数据包。

4. 传输层:定义了一些传输数据的协议和端口号(WWW端口号80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层叫做段。

5. 会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接收会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)。

6. 表示层:主要是进行对接收的数据进行解释,加密与解密、压缩与解压缩等(也就是把计算机能够识别的东西转换成人能够识别的东西(如图片、声音等)。

7. 应用层:主要是一些终端的应用,比如说FTP(各种文件下载)、WEBIE浏览)、QQ之类的(可以把它理解成我们在电脑屏幕上可以看到的东西,就是终端应用)。

P.S.

1、每个网卡的MAC地址都是全球唯一的。

2、路由器实现将数据包发送到指定的地点。

3、应用软件之间通信的过程就是层与层之间封包、解封包的过程。

4OSI参考模型虽然设计精细,但过于麻烦,效率不高,因此才产生了简化版的TCP/IP参考模型。

网络通讯要素

1. IP地址InetAddress网络中设备的标识。

不易记忆,可用主机名。

本地回环地址127.0.0.1 主机名:localhost

在没有连接互联网的情况,为了让访问本机方便,所以分配了一个默认的IP地址,也就是本地回环地址:

通过ping 127.0.0.1可以测试网络是不是通,如果不通,可能是网卡出问题了。

每台机器都有自己指定的计算机名。

P.S.IPV4数量已经不够分配,所以产生了IPV6

2. 端口号:用于标识进程(应用程序)的逻辑地址,不同进程的标识。

有效端口:0~65535,其中0~1024系统使用或保留端口。

P.S.

1、当一台计算机A向另一台计算机B发送QQ信息时,首先路由器通过数据包中的IP地址定位该信息发送到哪一台机器。然后计算机B接收到数据包后,通过此数据包中的端口号定位到发送给本机的QQ应用程序。

2、所谓防火墙,其功能就是将发送到某程序端口的数据屏蔽掉以及将从该程序端口发出的数据也屏蔽掉。

3. 传输协议:通讯的规则。

常见协议:UDPTCP

UDP

将数据及源和目的封装成数据包中,不需要建立连接。

每个数据报的大小在限制在64k内。

因无连接,是不可靠协议。

不需要建立连接,速度快。

应用案例:QQFeiQ聊天、在线视频用的都是UDP传输协议。

TCP

建立连接,形成传输数据的通道。

在连接中进行大数据量传输。

通过三次握手完成连接,是可靠协议。

必须建立连接,效率会稍低。

应用案例:FTPFile Transfer Protocol(文件传输协议)。

P.S.

InetAddress类中有一个静态方法:static InetAddress[] getAllByName(String host),此方法是在给定主机名的情况下,根据系统上配置的名称服务返回其IP地址所组成的数据。这是由于有些主机名对应的IP地址不唯一,如新浪、百度,都是服务器集群。在浏览器中输入新浪的域名,DNS解析域名成IP,然后计算机再通过获取到的IP访问新浪服务器。域名解析,最先走是本地的hostsC:\WINDOWS\system32\drivers\etc\hosts)文件,解析失败了,才去访问DNS服务器解析、获取IP地址。

UDP协议-发送端&接收端

Socket

Socket就是为网络服务提供的一种机制。

通信的两端都有Socket

网络通信其实就是Socket间的通信。

数据在两个Socket间通过IO传输。

UDP传输(DatagramSocket

发送端:

1.通过DatagramSocket创建UDP服务

DatagramSocket ds=new DatagramSocket();

2.确定数据,并封装成数据包

byte[] buf=jkas sdf sdk.getBytes();

DatagramPacket dp=new DatagramPacket

(buf,buf.length,InetAddress.getByName(192.168.1.*),10000);

3.通过socket服务send方法,将已有数据发送出去

ds.send(dp);

4.关闭资源

ds.close();

接收端:

1.通过DatagramSocket创建UDP服务//接收端需直接定义端口号

DatagramSocket ds=new DatagramSocket(10000);

2.定义数据包,用于接受数据

byte[] buf=new byte[1024];

DatagramPacket dp=new DatagramPacket

(buf,buf.length);

3.通过socket服务receive方法,接受数据

ds.receive(dp);

4.通过数据包方法获取数据

String ip=dp.getAddress().getHostAddress();

String data =new String(dp.getData(),0,dp.getLength());

int port=dp.getPort();

5.关闭资源

ds.close();

P.S.

1.可以用while()和IO流设置输入输出数据,注意设置结束标记语

2.由于UDP协议传输数据,只管发送数据,而不管接收端是否能够接收到数据。因此,应该首先启动接收端程序,再启动发送端程序。

TCP协议-客户端&服务端

客户端(Client)首先与服务端(Server)建立连接,形成通道(其实就是IO流),然后,数据就可以在通道之间进行传输,并且单个Server端可以同时与多个Client端建立连接。

TCP客户端(Client-->Socket

客户端需要明确服务器的ip地址以及端口,Socket对象已经提供了输入流和输出流对象,通过getInputStream(),getOutputStream()获取即可。

1.创建Socket服务,并指定主机和端口

Socket s=new Socket(192.168.1.2,10001);

2.获取输出流、输入流

OutputStream out=s.getOutputStream();

InputStream in=s.getItputStream();

3.输出数据,接受返回数据

out.write(sadasdasd.getBytes());

String line=null;

while((line=in.readLine())!=null){

System.out.println(line);}

//s.shutdownInput();//至于流的末尾标记结束

4.关闭资源

s.close();

TCP服务端(Server-->ServerSocket

服务端需要明确它要处理的数据是从哪个端口进入的。可通过accept()获取已连接的客户端对象,通过IO流进行数据传输。

1.建立Socket服务,并监听一个端口

ServerSocket ss=new ServerSocket(10008);

2.通过accept()获取已连接的客户端对象

Socket s=ss.accept();

3.获取数据

String ip=dp.getAddress().getHostAddress();

//读取Socket读取流中的数据

BufferedReader bufr=new BufferedReader

(new InputStreamReader(s.getInputStream()));

//打印数据

String line=null;

while((line=bufr.readLine())!=null){

System.out.println(line);}

4.返回数据给客户端

OutputStream out=s.getOutputStream();

out.writer(xxxx);

5.关闭资源

s.close();

ss.close();

P.S.TCP协议传输数据必须先开服务端,再开客户端。否则,客户端根本连接不上服务端。

客户端和服务端的PrintWriter对象out获取到数据后,一定要刷新,否则对方(服务端或客户端)就获取不到数据,程序便无法正常执行。刷新操作可以通过PrintWriter类的println()方法实现,也可以通过PrintWriter类的flush()方法实现。但是,由于获取数据的方法是BufferedReader对象bufInreadLine()方法(阻塞式方法),此方法只有遇到“\r\n”标记时,才认为数据读取完毕,赋值给String对象line。所以,使用PrintWriter类的flush()方法刷新数据时一定要记得追加“\r\n”!

了解客户端和服务器端原理

最常见的客户端:浏览器,IE/chrome

最常见的服务端:服务器,Tomcat

URL&URLConnection

URL:统一资源定位符,也就是说根据URL能够定位到网络上的某个资源,它是指向互联网“资源”的指针。

每个URL都是URI,但不一定每个URI都是URL。这是因为URI还包括一个子类,即统一资源名称(URN),它命名资源但不指定如何定位资源。

String

getFile() 获取此 URL 的文件名。

String

getHost() 获取此 URL 的主机名(如果适用)。

String

getPath() 获取此 URL 的路径部分。

int

getPort() 获取此 URL 的端口号。

端口号未指定的情况下返回值为-1

String

getProtocol() 获取此 URL 的协议名称。

String

getQuery() 获取此 URL 的查询部分。

URLConnection

openConnection() 返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。

Socket解析资源在传输层

URLConnection可以再向上拆包,在应用层解析

常见网络结构

1. C/S client/server

特点:该结构的软件,客户端和服务端都需要编写。

开发成本较高,维护较为麻烦。

好处:客户端在本地可以分担一部分任务。

例如,杀毒软件直接对本机文件进行杀毒。

2. B/S browser/server

特点:该结构软件只开发服务器端,客户端直接由浏览器取代。

开发成本相对低,维护更为简单。

缺点:所有运算都要在服务端完成。

 

0 0
原创粉丝点击