黑马程序员_网络编程

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 

网络编程

一、网络编程概述

网络通讯,简单来说就是通过网络实现信息传输,像QQ,微信这些时下最流行的通讯工具,这些都是基于网络进行传输的。

网络通讯要素:IP地址,端口号,传输协议。

网络模型:OSI模型 TCP/IP模型。

对于网络通信要素的理解:

第一:我们有两台主机,想要把信息从一台主机A上传输到另一台主机上B,那么就得先找到这台主机的在哪儿,这里就需要IP地址,有点类似我们打电话,我自己有一部电话,想给另一个同学打电话,那么就必须知道这个同学的手机号,IP地址的作用就是类似手机号,通过IP地址主机A就可以找到主机B

第二:主机是找到了,信息时传输过去了,但是解析的话拿那个程序来解析。如果主机AQQ上发了一条信息,找到主机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地址。

 

 

通讯规则:

通讯规则分为两种:UDPTCP

UDP:是面向无连接的,就是说,传输数据不必须和对方建立连接,不管对方是否在线,我就会发送数据,对方在了,就会收到,不再数据就丢掉。数据被封装成数据包,每个包的大小不超过64k。这个规则,使得数据传输速度很快,效率高,通常用于聊天,视频会议等等。

UDP特点总结:

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

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 DatagramSocket8000);

这样就指定了发送端的端口

2、确定数据,并封装成数据包:DategramPacketbyte[] 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的文件名,主机名,路劲,端口等各种信息

 String

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

 String

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

 String

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

 int

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

 String

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

 String

getQuery()就是在url最后加上一部分信息,通过&&连接
            获取此URL的查询部分。

 

我们注意到,URL里封装的是一个地址,按照前面所学的socket来说,ip,端口,都拥有,是否就可以直接通过这个对象来访问目标呢?

URL里面有个方法为,OpenConnection,这个方法会返回一个URLConnection,就是说,这就方法就会连接到地址中的主机。

URLConnection conn = url.OpenConnnection();

URLConnection是一个抽象类,这个类的实现子类中有两个方法:

1getInputStream

2getOutputStream

这两个方法使用和socket中的一样,而且,没有消息头。

 

 

小知识部分:

1SocketAddress,这个类的子类对象时封装的ip地址和端口号。而之前我们所学习的InetAddress是封装的ip地址。

2ServerSocket,在构造函数中有个够着函数会接收一个int backlog,这个表示的意思,是这个服务器最多的连接数。

 

 

 

域名解析

我们通常在浏览器中输入的网址,访问到指定ip地址的过程是这样的。

1、浏览器中输入的一般是主机名,如www.baidu.com

2、访问是需要ip地址,需要把主机名翻译成ip地址,这就需要域名解析,DNS

3、每个电信供应商都有一个DNSDNS都有对应的主机名的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,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值