黑马程序员——Java基础———网络编程

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

                            

                        网络编程

一、概述

  1、 网络模型

     OSI参考模型

     TCP/IP参考模型

 2、网络通讯要素

     IP地址

     端口号

     传输协议

3、网络通信的过程

  1)找到对方通过IP

  2) 数据要发送到对方指定的应用程序中。为了标识这些应用程序,所以给这些网络应用程序都用数字进行标识。为了方便称呼这个数字,叫做端口。

 3) 定义通信规则。这个规则称为协议。 

国际组织定义了通用的协议 TCP/IP。很多组织和单位,他们和我们连接的协议不一样,他们用的协议只用于内部。

4)常见端口

Web服务:80

Mysql3306

二、网络模型

   1OSI参考模型:开放式网络

OSI参考模型    TCP/IP参考模型

  

应用层

 

应用层

    表示层           

  会话层

  传输层

传输层

  网络层

网际层

  数据链路层

 

 主机至网络层

  物理层

先根据应用层的特点,将数据先封装下,一路向下,按照每一层的特点,加上每一层的特有信息,这就叫做数据封包。

2到对方主机后,不断开始解,这就叫做数据拆包。

拆完后,要检测端口,是哪一个程序去处理。

 其中,需要软件处理的是网际层,传输层和应用层。

需要我们处理的就是网际层和传输层。

我们以后做java web开发,需要处理的就是应用层。

网际层用的是IP协议。传输层用的是TCP协议,而应用层用的就是HTTP协议、FTP协议。

2IP地址

 1IP地址InetAddress

   网络中设备的标识

   不易记忆,可用主机名

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

java中,IP地址用java.net包中,类InetAddress来表示,没有构造函数

2)常用方法

         String getHostAddress() 

          返回 IP 地址字符串(以文本表现形式)。 

        String getHostName() 

          获取此 IP 地址的主机名。    

百度主机不一定只有一个地址,而是有多个。

所以,有可能返回的InetAddress对象有多个

这时,要用到另外一个函数。

static InetAddress[] getAllByName(String host) 

          在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。 

 示例:

 

3端口号

   用于表示进程的逻辑地址,不同进程的标识

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

4、传输协议

   通讯的规则

  常见协议:TCP  UDP

    1UDP

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

       每个数据包的大小限制在64K

       因无连接,是不可靠协议

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

    2) TCP

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

       在连接中进行大数据传输

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

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

三、网络编程—Socket

1、概述

   这是java为我们提供的网络编程的对象

Socket 

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

2UDP传输

 1)通过类 DatagramSocket DatagramPacket

    发送端与接收端是两个独立的运行程序。

2)常用方法

 void receive(DatagramPacket p) 

          从此套接字接收数据报包。 

 void send(DatagramPacket p) 

          从此套接字发送数据报包。 

发送需要一个数据包对象DatagaramSocket

数据包中都放有:实体数据 、接收方的地址和端口、发送方的地址和端口。

   3)演示

    需求:通过UDP传输方式,将一段文字数据发送出去。

  A定义一个udp的发送端。

  思路:

  (1) 建立updSocket服务。(找邮局)

  (2) 提供数据,并将数据封装到数据包中。(打包数据)

  (3) 通过Socket服务的发送功能,将数据包发出去。

  (4) 关闭资源。

  B需求:接受并处理UDP协议传输数据的接收端。

  (1)定义udpSocket的服务,在定义UDPsocket服务时,通常会监听一个端口,其实就是给这个接收网络应用程序定义一个数字标识,方便于明确哪些数据过来,该应用程序可以处理。

  (2)定义一个数据包

  (3)通过Socket服务中的receive方法将收到的数据存入已定义好的数据包中。

  (4)通过数据包对象的特有功能,将这些不同的数据取出。打印在控制台上。

  (5)关闭资源。

练习一

 

 

练习聊天程序

 

 

 

 

3、TCP传输

1)操作步骤

用到类Socket ServerSocket

  A建立客户端和服务器端

  B建立连接后,通过Socket中的IO流进行数据的传输

  C关闭Socket

  2)客户端访问服务端的图 

  

 

一个服务端对应很多客户端,怎么才能不冲突呢?

服务端没有流对象,客户端和服务端联通后,服务端拿着客户端的流对象进行通讯。

A连进来以后,我就拿到了Asocket对象,里面有输入和输出流。

连进来以后,我也拿到了Csocket对象,里面也有对应的输入输出流。

2)常用方法

        (1)创建客户端对象:

             Socket(String host,int port),指定要接收的IP地址和端口号

        (2)创建服务端对象:ServerSocket(int port):指定接收的客户端的端口

        (3Socket accept():监听并接受到此套接字的连接        

        (4InputStream getInputStream():返回此套接字的输入流,Socket对象调用

        (5OutputStream getOutputStream():返回套接字的输出流,Socket对象调用

Socket对象在建立时,就可去连接指定主机,因为TCP是面向连接的,所以在建立Socket服务时,就要有服务端存在,并连接成功,形成通路后,再通过该通道进行数据的传输。

思路:客户端

  (1)创建Socket服务,并指定要连接的主机端口。

  (2)获取Socket中的输出流,将数据写入流中

  (3)通过输出流的write()方法将要发送的数据写入到流中

  (4)关闭Socket流资源

服务端:

  (1)建立服务端的Socket服务

   (2)获取连接过来的客户对象,通过ServerSocketaccept()方法

   (3)客户端如果发过来数据,则服务端要使用对应的客户端对象,并获取到该客户端对象的读取流读取发过来的数据,并输出到指定目的地。

   (4)关闭服务端。在实际应用中,随时有客户端在请求连接和服务,这里需要定时关闭客户端对象流,避免某一个客户端长时间占用服务器端。

练习一

 

  

4、应用

   1)运用TCP传输复制文件

    

 

   2)运用TCP传输上传图片

     一对一上传    

    

 

   3)运用TCP传输,完成客户端并发上传图片

      这个服务端有局限性,当A客户端连接以后,被服务端获取到,服务端执行具体执行流程,这时,B客户端连接,只有等待,  因为服务端还没有处理完A客户端的请求。还没有循环回来执行下一次accept方法。所以暂时获取不到B客户端对象。

 那么为了可以让多个客户端同时并发访问服务端,服务端最好就是将每个客户端封装到一个单独的线程中。   

 

 

 

 

  4)客户端并发登录

        客户端通过键盘录入用户名,服务端对这个用户名进行校验。

        如果该用户存在,在服务端显示xxx,已登陆;并在客户端显示xxx,欢迎光临。

        如果用户不存在,在服务端显示xxx,尝试登陆;并在客户端显示xxx,该用户不存在。

        最多就登录三次。

     

 

 

  5)浏览器客户端——自定义服务端

   

第一种访问

 打开浏览器

地址栏输入:服务端ip地址:11000

第二种访问  

 Telnet  windows提供的远程登陆的命令,它可以连接网络上的任意一台主机。可以对这台主机进行命令式的操作。

简单理解,它就是一个客户端软件。

   6)浏览器客户端——Tomcat服务端

     

 

 

 

  7URLConnection

      (1)用Socket的弊端

      我们写的程序没有消息头的原因:我们使用的传输层协议,我们获取的是服务器发给我们的所有消息,并把消息显示出来,而浏览器,对这些消息解析,把符合应用层信息的部分进行解析完拆包去掉了,把正确的数据显示出来了。

    (2) java.net包中的类 URL

      类 URL 代表一个统一资源定位符

      URL比较Scoket的优点: 它在内部帮我们做了连接的动作。不用再写socket,因为已经封装在内部了。以前我们写sokcet是在传输层,现在它带着http协议封装,就到了应用层。

3)方法

   String getFile() 

          获取此 URL 的文件名。 

 String getHost() 

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

 String getPath() 

          获取此 URL 的路径部分。 

 int getPort() 

          获取此 URL 的端口号。 

 String getProtocol() 

          获取此 URL 的协议名称。 

 String getQuery() 

          获取此 URL 的查询部分。

URLConnection openConnection() 

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

      也就是说调用此方法,就可以连接此主机,获取该主机的连接对象。

4Filepath的区别

假如URL

http://192.168.1.254:8080/myweb/demo.html?name=hah&&age=30

getPath()/myweb/demo.html

getFile()/myweb/demo.html?name=hah&&age=30

getQuery()name=hah&&age=30

这个参数非常重要

 (5)演示

  

 

5、小知识点:域名解析

   (1Socket类的构造函数中,有一个空参数的构造函数:

        Socket()//通过系统默认类型的SocketImpl创建未连接套接字对象

       可以通过connect(SocketAddress endpoint)方法来连接服务器。而SocketAddress是一个抽象类,它的子类InetSocketAddress实现了IP套接字地址(IP地址+端口号)。所以就可以连接到服务器了。

     (2) ServerSocket对象中的构造函数:

        ServerSocket(int port,int backlog),其中的backlog表示队列的最大长度,即最多连入客户端的个数,即最大连接数。

     (3)域名解析 : 将域名翻译成ip地址

想要将主机名翻译成ip地址,需要域名解析。 这就用到DNS域名解析服务器,它在公网中。 这台服务器中有域名对应的ip地址映射关系表。

在浏览器输入网址访问一台主机所做的操作:

             将主机名翻译成IP地址,即域名解析,在进行访问的时候,会先在本地的hosts文件(c:\windows\system32\drivers\ext\host)中找对应的映射。若有,则直接返回请求;若无,则到公网的映射列表即DNS中找对应的映射,找到后,将主机名对应的IP地址返回给本机,本机通过这个IP地址找到对应的服务器。

小应用:

http://127.0.0.1:8080

http://localhost:8080

其实,127localhost的映射关系就在本机上,c\windows\systems32\drivers\ext\host

当我们输入域名进行解析时,它先到本地找域名对应,本地没有的时候,才会到dns服务器中找。

这样,我们就可以在本地设置,使上网速度提高

可以帮助我们使用收费的软件

防止恶意网页攻击,屏蔽恶意网页。 


------------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值