全国咨询/投诉热线:400-618-4000

Java培训之IO流&网络编程

更新时间:2016年06月30日15时58分 来源:传智播客Java培训学院 浏览次数:

1、编码表:|--由来:计算机只能识别二进制数据,早期由来的是电信号,为了方便计算机能识别各个国家的文字,就将各个国家的文字用数字来表示,并一一对应,形成了编码表。
|--常见码表:
|--ASCII:一个字节中7位就已经可以表示英文中的内容了。
|--ISO8859-1:包含了ASCII,同时用了一个字节的最高位。
|--GB2312/GBK:用两个字节表示各种文字。()
|--Unicode:国际标准码表,全部用两个字节表示各种文字(java中默认的就是用这个码表,对于字符串使用的本地默认码表是GBK)
|--UTF-8:一个字节能存的就用一个字节存储,两个字节存不了的用三个字节存储。在编码的时候会给每个字节加个标示头。这样做的好处是:标示相当清楚,只要读取标示就可以知道该怎么去查表。
Eg:01010101 11010101 10101111 11101101 10101010 10111100
当读取到第一个字符时,就回去查ASCII码表,因为0开头就是用一个字节存储的,当读第二个字节时,110开头的时继续读下一个字节,因为UTF-8有固定的标示头110开头代表是存两个字节,当读到1110时会继续读三个字节,如果是GBK读这些,读到第一个字节时也会查表。因为ASCII码表兼容,当读到1时会继续读下一个字节。
面试题:char类型中能不能存储一个汉字?
Eg:char ch='a';就是两个字节,只是最高八位全部都是0;
Char类型变量是用来存储Unicode编码的字符,该编码字符集中包含了汉字,
所以char类型的变量是可以存储汉字,不过如果某些特殊的汉字没有被包含在该字符集中,那么这个char类型变量中就不能存储这个汉字,这些都是因为Unicode编码表全部都是用两个字节表示各种文字。
|--编码:字符串变成字节数组(把看的懂的变成看不懂的)
编码错了是不可能改正的,如果编对了解错了还是有可能改正的。
实现代码:
|--解码:字节数组变成字符串(把看不懂的变成看的懂的)
Eg:客户端发送你好到服务端
你好--------->你好 -60,-29,-70,-61------>ISO8859-1进行解码---->????------->对它进行编码------->-60,-29,-70,-61--->对它进行解码----->你好
|--联通问题:
实现代码:
public static void main(String[] args) throws UnsupportedEncodingException {
String str="联通";
/*
 *  11000001
10101010
11001101
10101000
通过这里发现联通对应的四个字节的开头正好是UTF-8对应存储两个字节的开头,所以它在解码的时候按照UTF-8的方式进行解码
出现了乱码
 * */
byte[] buf=str.getBytes("GBK");
for(byte b:buf){
System.out.println(Integer.toBinaryString(b&0xff));//获取二进制的方式,已经忘记了!注意复习!
}
}

  1. 网络模型:
|--OSI(open stystem Interconnection开放式系统互连)
|--特点:
是一种异构系统互连的分层结构;提供了控制互连系统交互规则的标准骨架;定义一种抽象结构,而并非具体实现的描述;不同系统中相同层的实体为同等层实体;同等层实体之间通信由该层的协议管理;相信层间的接口定义了原语操作和低层向上层提供的服务;所提供的公共服务是面向连接的或无连接的数据服务;直接的数据传送仅在最低层实现;每层完成所定义的功能,修改本层的功能并不影响其他层。
|--七层结构:
物理层: 提供为建立、维护和拆除物理链路所需要的机械的、电气的、功能的和规程的特性;有关的物理链路上传输非结构的位流以及故障检测指示。
数据链路层:在网络层实体间提供数据发送和接收的功能和过程;提供数据链路的流控。
网络层: 控制分组传送系统的操作、路由选择、拥护控制、网络互连等功能,它的作用是将具体的物理传送对高层透明。
传输层: 提供建立、维护和拆除传送连接的功能;选择网络层提供最合适的服务;在系统之间提供可靠的透明的数据传送,提供端到端的错误恢复和流量控制。TCP(传输控制协议)传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据,UDP(用户数据报协议,于TCP特性恰恰相反)用于传输可靠性要求 不高,数据量小的数据,如QQ聊天数据就是通过这种方式进行传输。
会话层: 提供两进程之间建立、维护和结束会话连接的功能;提供交互会话的管理功能,如三种数据流方向的控制,即一路交互、两路交替和两路同时会话模式 。
表示层: 代表应用进程协商数据表示;完成数据转换、格式化和文本压缩。
应用层: 提供OSI用户服务,例如事务处理程序、文件传送协议和网络管理等。
|--TCP/IP:
|--TCP/IP的分层模型
Internet采用了TCP/IP协议,如同OSI参考模型,TCP/IP也是一种分层模型。
它是基于硬件层次上的四个概念性层次构成,即网络接口层、IP层、传输层、应用层。
网络接口层:也称数据链路层,这是TCP/IP最底层。功能:负责接收IP数据报并发送至选定的网络。
IP层:IP层处理机器之间的通信。功能:它接收来自传输层的请求,将带有目的地址的分组发送出去。将分组封装到数据报中,填入数据报头,使用路由算法以决定是直接将数据报传送至目的主机还是传给路由器,然后把数据报送至相应的网络接口来传送。
传输层:是提供应用层之间的通信,即端到端的通信。功能:管理信息流,提供可靠的传输服务,以确保数据无差错的地按序到达。
2、TCP/IP模型的分界线
协议地址分界线:以区分高层和低层的寻址,高层寻址使用IP地址,低层寻址使用物理地址。应用程序IP层之上的协议软件只使用IP地址,而网络接口层处理物理地址。

  1. 网络通信要素
|--IP地址:网络中设备的标示
127.0.0.1本地回环地址 主机名:localhost
IP地址不能冲突,但是可以重复,在不同的网络中的是可以重复的。
|--端口号:用于表示进程的逻辑地址,不同进程的标示,有效端口:0`65535其中0~1024系统使用或者保留端口,
|--物理端口:即我们看的见的端口,比如网卡端口
|--逻辑端口:就是些数字标示。
|--传输协议:
|--TCP:
|--特点:

  1. 建立连接,形成传输数据的通道
  2. 在连接中进行大数据量传输
  3. 通过三次握手完成连接,是可靠协议,一旦连接断开数据就不存在了
  4. 必须建立连接、效率会稍低
|--UDP:
|--特点:

  1. 将数据以及源和目的封装成数据包,不需要建立连接
  2. 每个数据报的大小在限制的64K内
  3. 因无连接,是不可靠的协议
  4. 不要建立连接 ,速度快。
  1. IP地址对象:
InetAddress:互联网协议地址
getLocalHost();返回本地主机
getHostName();获取主机名
getByName();
getAllByName();
地址解析:直接通过IP地址可以访问新浪的主机,同时也可以通过主机名去访问。
百度校招笔试题:URL有哪几个部分组成?协议、主机、端口、文件
DNS域名解析:客户端输入主机名去查找DNS服务器,查找对应的IP地址,然后返回它客户端在根据IP地址指向所要去访问的主机。
扩展:怎么去进制掉上网过程中弹出的小广告
去配置文件中一下面的格式配置即可
127.0.0.1  www.XXXX.com
eg:127.0.0.1 www.sina.com表示禁止不能上新浪网.

  1. Socket
插座 (专业术语:套接字)
就是为网络服务提供的一种机制。
通信的两端都有Socket
网络通信其实就Socket间通信
数据在两个socket间通过IO传输。怎么去理解?
从这个设备传输到另外一个设备,其实就是流的操作。

  1. UDP传输:
DatagramSocket和 DatagramPacket
封装了UPD的传输协议,此类表示用来发送和接收数据包的套接字。
receive(DatagramPacket p)和send(DatagramPacket p);
在构造包时要注意,有些包是用来构造接收数据包,有些是构造发送数据包
怎么去区分:在构造函数中凡是带有Address的都是构造发送数据包的。
UDP发送和接收端建立连接的思路:
启动发送端和接收端都可以,启动哪一个都是可以的。
实现代码:
发送端:
//1、先建立UDP的socket服务。
DatagramSocket ds=new DatagramSocket();
//2、确定具体的数据。
String str="UDP,我来了!";//因为只能接受字节数组,所以下面要用字节数组封装起来
byte[] buf=str.getBytes();
// 3、创建数据包对象将数据进行封装,并明确目的地地址。
DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.104"),10000);
// 4、使用socket服务的send方法将数据包发送出去。
ds.send(dp);
//  5、关闭资源。
ds.close();
接收端:
System.out.println("接收端启动.....");
// 1、建立UDP的socket服务,必须一个具体的数字标示,明确是哪个端口的数据是这个程序是可以处理的。
DatagramSocket ds=new DatagramSocket(10000);
// 2、创建一个数据包对象,用于存储接收到的数据
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf, buf.length);
// 3、使用socket服务接收数据并存储到已有的数据包当中
ds.receive(dp);
// 4、从数据包中获取指定的数据,并打印
String ip=dp.getAddress().getHostAddress();
int port=dp.getPort();
String text=new String(dp.getData(),0,dp.getLength());
System.out.println(ip+""+text+""+port);
// 5、关闭socket服务
ds.close();
注意输出结果中:
接收端启动.....
192.168.1.104UDP,我来了!1364: 这个端口是发送端的。系统会随机分配。
 
本文版权归传智播客Java培训学院所有,欢迎转载,转载请注明作者出处。谢谢!
作者:传智播客Java培训学院
首发:http://www.itcast.cn/javaee