黑马程序员 java基础24天 网络编程学习总结

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

一.网络编程的两个参考模型

网络编程有两个参考模型一个是OSI参考模型,另一个是TCP/IP参考模型,他们的对应分层方式如下:

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

应用层

表示层           应用层

会话层

-----------------------------------------------

传输层           传输层

-----------------------------------------------

网络层           网际层

------------------------------------------------

数据链路层       主机至网络层

物理层

-------------------------------------------------

【理解】这两种参考模型在实际的运用中没有多大的区别,TCP/IP参考模型只是将传输层次简化了。在实现网络传输的过程中,数据一般是从最上层向下传输,最后到达物理传输层,在向下传输的过程中,每一次都会对信息进行封包处理,添加该层的特有信息;当接收到了该信息包时,又会自下而上的进行拆包,最终完成信息的传输。

 

二.通讯要素

(1)IP地址

网络中设备的标识

不易记忆,可用主机名

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

【理解】:当一台计算机需要连接到互联网上的时候,就类似新建成的一栋房子,当它屋里面的事物不需要和外界事物交流的时候,当然就不需要门牌号了,但如果需要和外界交流的时候,就需要一个门牌号(地址),这样其他的事物就可以找到它了。所以IP地址就类似于计算机在互联网世界的门牌号,知道了它的地址自然就可以找到它了。

但是IP地址不易记忆,所以可以用一个名称来代替,如www.baidu.com.而这个名称则需要向DNS代理中找到对应名称www.baidu.com相对应的IP地址,然后返回给调用者,再去访问对应的服务器。

DNS通过键值对的形式记录域名对应的IP地址。

 

(2)端口号

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

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

【理解】类似于一栋大厦(计算机)有一个地址(IP地址),而大厦中有很多间房子每个房间有一个号码(端口号)。一个人(信息)需要来这栋大厦办事,需要知道大厦地址(IP地址),当然也要知道那个房间(端口号)可以给他办事。所以当信息需要传输到一台计算机的时候,需要知道这台计算机的IP地址和端口号,而这台计算机上的服务器程序,就可以监听对应的端口,从而接受传递过来的信息。

计算机中一定要有运行的程序监听该端口号,来完成信息传输的,这种传输形式称为;TCP传输;而可以没有正在运行的程序监听该端口时,这种传输形式称为UDP传输。因为监听程序可有可无,所以这种传输容易丢失数据。

 

(3)传输协议

通讯的规则

常见协议:TCP和UDP

     【理解】传输协议就是事项定义一种方式,来完成信息的传输;比如送邮件,事先说好,发过来的邮件一定要你亲自接受,否则就是不进行投递(TCP),或者发送来的邮件,你在就给你,你不在我就把它丢了(UDP)

 

UDP

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

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

③ 因无连接,是不可靠协议⑻不需要建立连接,速度快【如网络会议】

 

TCP

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

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

③ 通过三次握手完成连接,是可靠协议⑻必须建立连接,效率会稍低

 

三.Socket[译:插座]

每一个运用程序都有自己类似于插座,而插座的型号是不一样的

只有匹配的才可以相互连接

 

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

通信的两端都有Socket

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

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

 

【理解】两个应用程序,需要进行信息的通讯,比如A->B通讯,就需要将两个应用程序“连接”起来,类似与我们将用电器插在电源插座上,插头有两脚的,也有三脚的,当然插座有两孔的,也有三孔的;那么只有两脚对两孔,三脚对三孔,这样才能正常通电。

我们知道通讯必须知道IP地址和端口号,而通讯协议却有两种(TCP和UDP),这就说明两个运用程序要建立连接则有两种方式,这就类似于要建立连接可以使用三脚插头,也可以使用两脚插头,如果使用了两脚插头,那么就得插在两脚插座上。

每个计算机上有两种类型的插座,要么都用三孔通讯,要么都用两孔通讯

 

UDP通讯使用的插座类型为DatagramSocket

TCP通讯使用的插座类型为Socket(客服端)和ServerSocket(服务端)

 

四、InetAddress 类

此类表示互联网协议 (IP) 地址。

给类构造方法为私有,如果要创建该类对象,则需要调用其静态方法获取对象,

例如:InetAddressi = InetAddress.getLocalHost();

常用方法:

static InetAddress   getLocalHost()

返回本地主机。

String                 getHostAddress()

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

String                 getHostName()

                          获取此 IP 地址的主机名。 getAllByName

static InetAddress[  ]    getAllByName(Stringhost)

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

 

【DatagramPacket中的getAddress 和Socket,ServerSocket中的getInetAddres都可以获取

一个InetAddress对象】

 

代码示例:

import java.net.*;

import java.io.*;

import java.util.*;

 

class  IPDemo

{

  public static void main(String[] args) throws Exception

  {

   InetAddress i= InetAddress.getLocalHost();//返回本地主机对象

   System.out.println(i.toString());

   //PC-201403242043/192.168.0.213【计算机名和IP地址】

   System.out.println(i.getHostAddress());

   //192.168.0.213

   System.out.println(i.getHostName());

        // PC-201403242043

 

   InetAddress[] ia =InetAddress.getAllByName("www.baidu.com");

   for(InetAddress iax : ia )

   {

     System.out.println(iax.getHostAddress());

     System.out.println(iax.getHostName());

     //115.239.211.110

     //www.baidu.com

     //115.239.210.27

     //www.baidu.com

   }

  }

}


五.UDP传输

(1)DatagramSocket与DatagramPacket

①建立发送端,接受端

②建立数据包

③调用Socket的发送接受方法

④关闭Socket

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

 

(2)类 DatagramPacket 

此类表示数据报包。

数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能

按不同的顺序到达。不对包投递做出保证。

 

【构造方法摘要】

DatagramPacket(byte[] buf, int length)

         构造DatagramPacket,用来接收长度为 length 的数据包。

DatagramPacket(byte[] buf, int length,InetAddress address, int port)

         构造数据报包,用来将长度为length 的包发送到指定主机上的指定端口号。

【方法】

void   receive(DatagramPacket p)

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

void   send(DatagramPacket p)

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

 

代码实例:

/*

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

思路:

1.建立udpsocket服务

2.提供数据,并将数据封装到数据包中

3.通过socket服务的发送功能,将数据包发送出去

4.关闭资源

*/

class UDPSend

{

       publicstatic void main(String[] args) throws Exception

       {

              //1.创建udp服务,通过DatagramSocket对象

              DatagramSocketds = new DatagramSocket();

             

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

              byte[]buf = "我  来  了 !!".getBytes();

              DatagramPacketdp =

              NewDatagramPacket(buf,buf.length,InetAddress.getByName("192.168.0.213"),10000);

       

              //3.通过Socket,将已有数据包发送出去,通过send方法

       ds.send(dp);;

 

              //4.关闭资源

              ds.close();

       }

}

 

/*

思路;

1.定义udpsocket服务

2.定义一个字节数组,因为要储存接收到的数据,并定义要监听本地那一个端口

3,通过socket服务的receive方法将收到的数据存入已定义好的数据包中

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

5.关闭资源

*/

 

class UDPReceive

{

       publicstatic void main(String[] args) throws Exception

       {

              //1.定义UDP的socket服务

              DatagramSocketds = new DatagramSocket(10000);

 

         //2.定义一个数据包,因为要存储接受到的字节数据中的不同数据信息

              //因为数据包对象中有更多功能可以提取字节数据中的不同数据信息

              byte[]buf = new byte[1024];

              DatagramPacket dp = new DatagramPacket(buf,buf.length);

       

              //3.通过服务的receive方法将受到数据存入数据包中。

              ds.receive(dp);

 

              //4通过数据包的方法获取其中的数据

              Stringip = dp.getAddress().getHostAddress();

     int port = dp.getPort();

              

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

              System.out.println(ip+"::"+data+"::"+port);

 

              //5.关闭资源

             ds.close();

       }

}

 

六.TCP传输

Socket和ServerSocket

①建立客户端和服务端

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

③关闭socket

同样,客服端与服务端是两个独立的应用程序

 

类 Socket

构造方法摘要

 Socket()

         通过系统默认类型的SocketImpl 创建未连接套接字

 Socket(InetAddress address, int port)

         创建一个流套接字并将其连接到指定 IP 地址的指定端口号。

 Socket(String host, int port)

         创建一个流套接字并将其连接到指定主机上的指定端口号。

【Socket一建立,其本身就包含了输入流和输出流,是内部封装的

方法

 InputStream    getInputStream()

              返回此套接字的输入流

OutputStream    getOutputStream()

              返回此套接字的输出流。

 

!!创建【客户端】

通过查阅socket对象,发现在该对象建立时,就可以去连接指定主机

因为tcp是面向连接的,并连接成功,形成通络后,在该通道进行数据的传输

 

需求:给服务端发送文本数据

【步骤】

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

2.通过getOutputStream()方法,获取socket内部封装的输出流

3.通过获取的输出流向服务端发送数据

4.关闭资源

*/

class TcpClient

{

       publicstatic void main(String[] args) throws Exception

       {

              //1.创建客服端socket服务,指定目的主机和端口

             Socket s = newSocket("192.168.0.213",10005);

              //2.为了发送数据,应该获取socket流中的输出流

              OutputStreamout = s.getOutputStream();

               / /3.发送数据到指定服务端

              out.write("wolai le !!!".getBytes());

              //4.关闭资源

              s.close();

       }

}

!!创建【【服务端】

需求:定义端点接受数据并打印在控制台上

 

类 ServerSocket【类似一个包装类】

构造方法摘要

ServerSocket()

         创建非绑定服务器套接字。

ServerSocket(int port)

         创建绑定到特定端口的服务器套接字。

方法

Socket                   accept()

                              侦听并接受到此套接字的连接。

InetAddress          getInetAddress()

                              返回此服务器套接字的本地地址。

 

【步骤】

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

2.获取连接过来的客户端对象。

    通过ServerSocket的accept方法,没有连接就会等,所以

    这个方法是阻塞式的

3.客户端如果发来数据,那么服务端就使用对应的客服端对象

    并获取该客户端对象的读取流来读取客户端发送的数据

4,关闭资源

*/

class TcpServer

{

       publicstatic void main(String[] args) throws Exception

       {

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

              ServerSocketss = new ServerSocket(10005);

 

              //2.通过accept方法获取连接过来的客户端对象

              Sockets = ss.accept();

 

              Stringip = s.getInetAddress().getHostAddress();

              intport = s.getPort();

       

              byte[]buf = new byte[1024];//接受数据,缓冲区

             

              //3.获取客户端的读取流,并来读出客户端发送的数据

              InputStream is = s.getInputStream();

              intlen = is.read(buf);

              Stringdata = new String(buf,0,len);

              System.out.println("ip:"+ip+"端口:"+port+"::"+data);

 

              //4.关闭资源

              s.close();

              ss.close();

       }

}

 

 

【自我总结】

UDP传输

1.创建发送端

     首先,生成一个DatagramSocket对象和一个DatagramPacket对象;生成DatagramPacket对象要向传入四个参数,分别是:缓冲区,缓冲区调用的长度,InetAddress对象,端口号;

InetAddress对象可以通过InetAddress.getByName(“主机名”);缓冲区中存入的是要发送的数据。

     然后,调用DatagramSocket对象的send方法将DatagramPacket对象发送出去

     最后,关闭资源。

 

2.创建接收端

      首先,定义一个DatagramSocket对象,监听相应端口号,创建一数组缓冲区,将这个数组缓冲区传递给一个DatagramPacket对象;

      然后,调用DatagramSocket对象的receive,将数据获得并传给DatagramPacket对象;

      再次,调用DatagramPacket对象的getData方法获取传入的数组,并返回一个字节数组

     最后,关闭资源。

 

TCP传输

1.创建客服端

    首先,定义一个Socket对象,指定传入的主机和端口

    然后,获取Socket对象内部的输出流,通过该输出流向服务器发送数据

   最后,关闭资源

 

2.创建服务端

    首先,定义一个ServerSocket对象,并指定监听的接口

    然后,调用ServerSocket对象的accept方法,获得服务端传过来的Socket对象

   再次,调用获取的Socket对象获取客服端传递过来的输入流,将客户端传递过来的数据读取出来。

   最后,关闭资源

 

【实现互访】

  TCP传输,客服端和服务端的互访

  调用Socket自带的输入流和输出流,输入流的read方法是阻塞式的,要注意不要让他们都等待了。

 

【实现复制功能】

在文件发送完成之后,要给服务端发送一个结束标记s.isShutDown();s为Socket对象


---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------详细请查看:www.itheima.com




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值