------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
网络编程
一、网络编程概述
网络通讯,简单来说就是通过网络实现信息传输,像QQ,微信这些时下最流行的通讯工具,这些都是基于网络进行传输的。
网络通讯要素:IP地址,端口号,传输协议。
网络模型:OSI模型 TCP/IP模型。
对于网络通信要素的理解:
第一:我们有两台主机,想要把信息从一台主机A上传输到另一台主机上B,那么就得先找到这台主机的在哪儿,这里就需要IP地址,有点类似我们打电话,我自己有一部电话,想给另一个同学打电话,那么就必须知道这个同学的手机号,IP地址的作用就是类似手机号,通过IP地址主机A就可以找到主机B。
第二:主机是找到了,信息时传输过去了,但是解析的话拿那个程序来解析。如果主机A从QQ上发了一条信息,找到主机B,但是这个条信息被暴风影音给获取了,那么这条信息就读取不出来,所以,必须找到相应的软件程序,这里就需要端口号,就是说给相应的软件程序进行数字标识,方便把信息发到指定的软件程序上,为了方便称呼这个数字,就叫做端口(逻辑端口)。
第三:找地址,找端口,都解决了,再回到信息传输上。如果主机A发出的信息时中文,而主机B只能读取英文,那么信息即便传输了但是是无效的,所以要彼此间定义一个通讯规则,这个规则称为协议。一般通用协议为TCP/IP,当然还有其他的通讯协议,比如某个企业自己内部可能就有自己的通讯协议,这样提高信息安全性。
1、关于IP地址
是网络设备的标识,IP地址是四字节的,如:192.168.1.1而每个字节的最大数是255,就是说,IP地址每位的最大值是255。有一个特殊的IP地址,127.0.0.1这是一个本地回环地址。打开电脑就会发现,在IP地址下面还有一个子网掩码,这是因为IP地址不够用,所以采用区域的方法来处理,就是某一区域只用一个IP地址,这个区域里的用户都是属于这个IP地址中的局域网,共享这个IP地址。
IP地址不宜记忆,通常会起个名字,名字和IP地址相关联,比如自己的主机名称。上面的时候,通常会在地址栏中加入一个地址值,比如www.baidu.com,这其实就是百度的IP地址所关联的名字。
2、关于端口
端口值为0-65535,通常情况下0-1024端口通常被系统所保留使用了。这个使用时要注意。
3、关于通讯规则
两个协议:TCP 和UDP
网络模型
TCP/IP模型来说,它分为四层:第一层应用层,第二层传输层,第三层网际层,第四场主机至网络层。在数据往出发的时候,先在应用层,应用层对其进行封装,然后在传输层,传输层对其进行进一步封装,依次类推,相当于一个加包的过程;数据接收时,从第四层开始解析,一层层向上,最后到应用层,相当于一个拆包的过程。这就是一个一个模型。
当前网络编程就出来传输层和网际层。
二、网络编程应用
对IP地址的操作:
使用到InetAddress类,这个类没有构造函数,不能直接创建对象,常用的方法:
1、获取InetAddress对象,InetAddress I =InetAddress.getLocalHost();这个是获取本地主机IP地址对象。更常用的这个InetAddress inet = InetAddress.getByName(“要获取的主机名或IP地址”);
2、获取地址和主机名。有了对象后,调用getHostName()方法即可调出主机名,使用getHostAddress(),就可以获取目标的IP地址。
通讯规则:
通讯规则分为两种:UDP和TCP
UDP:是面向无连接的,就是说,传输数据不必须和对方建立连接,不管对方是否在线,我就会发送数据,对方在了,就会收到,不再数据就丢掉。数据被封装成数据包,每个包的大小不超过64k。这个规则,使得数据传输速度很快,效率高,通常用于聊天,视频会议等等。
UDP特点总结:
1、UDP会将数据及源和目的封装成数据包,不需要建立连接。
2、每个数据包的大小限制在64k以内
3、因为是无连接的,是不可靠的协议
4、不需要建立连接,速度快
TCP:是面向连接的,就是说,彼此建立连接信息才能传输,而且可以大量传输。建立的时候,需要彼此知会一声,比如说A连接B,不是直接就连接上,而是A发一段信息给B,问B连接上了么,然后B收到的话再给A回复,但是如果A不再做回复的话,B就不知道A收没收到信息,所以A必须再做一次回复。这样连接才会建立。常见的情况有,下载电影等等。
TCP总结特点:
1、建立连接,形成数据传输通道
2、在连接中可进行大数据量的传输
3、通过三次握手完成连接,是可靠协议
4、必须建立连接,效率会低
那我们建立通讯的话,在java中就得先有对象。java中的Socket就是为网络服务的。
简单来说,Socket就是为网络服务提供的一种机制,且通讯两端都的有Socket,网络通信其实就是Socket间的通信,数据在两个Socket间通过IO传输。
UDP传输
建立UDP发送端
直接写建立步骤:
1、创建UDP服务,通过DatagramSocket对象。
DategreamSocket ds = new DatagramSocket();
作为发送端,其实也是有一个端口,当我建立socket服务,发送数据的时候,系统会随机指定端口。如果想固定发送端口,就在DatagramSocket对象中,加入端口值。
DatagramSocket ds =new DatagramSocket(8000);
这样就指定了发送端的端口
2、确定数据,并封装成数据包:DategramPacket(byte[] buf ,int length ,InetAddress ,address, int port)
byte[]buf = “UDP服务端”.getBytes();
DategramPacket dp =
new DatagramPacket(buf,buf.length,InetAddress.getByName(“124.0.0.1”),8000);
3、通过socket服务,将已有的数据包发送出去,用send方法
ds.send(dp);
4、关闭资源
ds.close();
这样一个UDP发送端就建立完成了,但是UDP是面向无连接的,所以即便对方没有在,数据也会发送出去,只是最后全部丢失了。所以我们闲杂就建立一个UDP接收端:
UDP接受端建立步骤:
1、建立DatagramSocket服务,监听一个端口
DatagramSocket ds = new DatagramSocket(8000);
2、因为发送端会发送一个数据包过来,所以在接受端就定义一个DatagramPacket包来存储。
byte[]buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
3、用receive方法将接受到的数据存入数据包
ds.receive(dp);
4、通过数据包的方法获取包中的数据
Stringip = dp.getAddress().getHostAddress();获取主机IP地址
Stringdata = new String( dp.getDate(),0,dp.getLength());获取数据
intport = dp.getPort();获取端口
5、关闭资源
ds.close();
注意,我们在创建DatagramSocket服务时,不能让两个DatagramSocket对象接听同一个端口。IP地址中有两个地址特殊,一个是192.168.1.0,代表网络段,一个是192.168.255代代表的是广播地址,注意是每个网络段都有这么两个,就是说你本机如果是127.0.0.1的话,那么127.0.0.0就是代表你这网络段,127.0.0.255就是这个段的广播。
TCP传输
UDP在建立的时候,是发送端和接收端,而TCP因为是面向连接的,所以它分为客户端和服务端。进行TCP传输,需要建立客户端和服务端。建立连接后通过Socket正的IO流进行数据的传输。
同样,客户端和服务端是两个独立的应用程序。
TCP传输:
客户端:Socket
服务端:ServerSocket
客户端:
通过查阅socket对象,发现该对象建立时,就可以去连接指定主机,因为TCP是面向连接的,所以在建立socket服务时,就要有服务端存在,并连接成功,形成通路货,在该公道进行数据传输。
步骤:
1、创建Socket服务,指定要连接的主机地址和端口
Sockets = new Socket(“127.0.0.1”,10000);
2、为了发送数据,应该获取Socket流中的输出流
OutputStream out = s.getOutputStream();
out.write(“”connectionis ok);
3、关闭资源
s.close();
服务端:
步骤:
1、建立服务端的Socket服务,通过ServerSocket服务,并绑定一个端口
ServerSocketss = new ServerSocket(10000);
2、获取连接过来的客户端对象,accept方法获取客户端对象,返回时一个Socket。这方法时阻塞式的,没有连接就要等。
Sockets = ss.accept();
3、客户端如果发送来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据。
InputStreamin = s.getInputStream();
//读取数据就可以
byte[]buf = new byte[1024];
intlen = in.read(buf);
当我们在建立TCP服务端和客户端时,如果可以相互发送数据,那么必然就用到IO流,所以要注意两点:一、字符流需要刷新,就是使用flush()方法。二、readLine是阻塞式方法,这个方法判断读取完一句的信号是换行符,比如当客户端想服务端发送一行字符,其实只是把这串字符发送过去了,换行符并没有发送过去,所以要加上换行符,并且最后一定要刷新。
URL
专门用于处理URL的对象
其构造函数会接受一个字符串url。
URL url = new URL(“http://127.0.0.1:8080/myweb/demo.html”);
创建这个对象后,就可以通过里面的方法分别获取到次url的文件名,主机名,路劲,端口等各种信息
getFile | |
getHost | |
getPath | |
| getPort |
getProtocol | |
getQuery |
我们注意到,URL里封装的是一个地址,按照前面所学的socket来说,ip,端口,都拥有,是否就可以直接通过这个对象来访问目标呢?
URL里面有个方法为,OpenConnection,这个方法会返回一个URLConnection,就是说,这就方法就会连接到地址中的主机。
URLConnection conn = url.OpenConnnection();
URLConnection是一个抽象类,这个类的实现子类中有两个方法:
1、getInputStream
2、getOutputStream
这两个方法使用和socket中的一样,而且,没有消息头。
小知识部分:
1、SocketAddress,这个类的子类对象时封装的ip地址和端口号。而之前我们所学习的InetAddress是封装的ip地址。
2、ServerSocket,在构造函数中有个够着函数会接收一个int backlog,这个表示的意思,是这个服务器最多的连接数。
域名解析
我们通常在浏览器中输入的网址,访问到指定ip地址的过程是这样的。
1、浏览器中输入的一般是主机名,如www.baidu.com
2、访问是需要ip地址,需要把主机名翻译成ip地址,这就需要域名解析,DNS
3、每个电信供应商都有一个DNS,DNS都有对应的主机名的ip地址,主机名和ip地址有映射关系
4、我们电脑访问www.baidu.com,会在DNS的服务器,找到对应的ip地址,再给我们发回来,然后再直接通过此ip地址寻找。
5、但,在去DNS服务器寻找之前,总会现在本机上的c:\window\systems\drivers\ext\host 这个目录下进行查询,看是否有对应的IP地址。
总结一下:
1、域名解析路径:主机名,到本机查询,如果对应的ip地址,则直接访问此ip地址;如果没有,则到对应电信运营商的DNS服务器,找到对应的ip地址,然后进行访问
2、应用:1)自己可以直接在host中配置ip地址,加快我们访问速度。ip地址可以同个getByName方法获取
2)软件自动更新地址的关闭,可以长时间使用软件
3)对恶意网址配置本地回环地址127.0.0.1,