zoukankan      html  css  js  c++  java
  • 黑马程序员——【Java基础】——网络编程

    ---------- android培训java培训、期待与您交流! ---------- 

    一、网络模型概述

      网络模型示意图:

      说明:

      (1)数据的传输:在用户端,应用层的数据,经过层层封包,最后到物理层,通过网络发送到网络的另一端,再从物理层到应用层进行层层解包。

      (2)常用层的协议,包括:应用层的FTP和HTTP协议等;传输层的UDP和TCP等;网际层的IP等。

      (3)对于开发者来讲,一般处于传输层和网际层。对于用户,通常停留在应用层。

    二、网络通讯要素

      网络通讯要素,包括:IP地址、端口号 以及 传输协议。

      (一)IP地址

      1、IP地址概述

      (1)它是网络设备标识;

      (2)可用主机名表示;

      (3)localhost:回路网络接口的标准主机名;

      (4)本机回环地址:127.0.0.1。

      2、IP地址对象——InetAddress

      (1)IP地址:在java中对应的是InetAddress类,存在于java.net包中。

      (2)InetAddress类:无构造函数。

      (3)可通过getLocalHost()方法获取InetAddress对象,此方法是静态的,返回本类对象。InetAddress ip = InetAddress.getLocalHost();

      (4)InetAddress常用方法:

       ① static InetAddress getByName(String host):获取指定主机的IP和主机名。

       ② String getHostAddress():返回IP地址字符串文本形式,以IP地址为主。

       ③ String getHostName():返回IP地址主机名。

       ④ static InetAddress[] getAllByName(String host):在给定主机名的情况下,根据系统上配置的名称服务返回IP地址所组成的数组,返回ip地址不唯一。

      (5)如何获取其他主机的IP地址对象:

       ① 功能:返回InetAddress对象

       ② 对于任意主机,需要指定传入主机名的参数

      注意:如果IP地址和对应的主机名,这种映射关系没有在网络上,就不会解析成功,返回的还是指定的IP。

      (6)示例代码:

      //     1、获取本地主机地址对象

      InetAddress ip = InetAddress.getLocalHost();

      System.out.println(ip.getHostAddress() + ip.getHostName());

      //     2、获取其他主机的ip地址对象

      ip = InetAddress.getByName(“ip地址或者DNS”);

      System.out.println(ip.getHostAddress);

      //     3、获取百度域名的ip地址群

      InetAddress[] ips = InetAddress.getAllByName(“www.baidu.com”);

      for( InetAddress ip : ips ){

             System.out.println(ip.getHostAddress())

      }

      (二)端口号

      1、用于标识进程的逻辑地址,不用进程的标识。

      2、有效端口:0 ~65535,其中0~ 1024是系统使用或保留的端口。

      (三)传输协议

      传输协议:即通信规则,常见的有UDP协议、TCP协议。

      1、UDP协议:是面向无连接,明确了对方的端口,无论在不在网上,只管传输,不在就会丢失数据。只求速度,应用于网络视频会议和聊天等应用程序中。其特点有:

      (1)将数据和源、目的封装成包,不需要建立链接;

      (2)每个数据包的大小限制在64K之内;

      (3)因无连接,是不可靠的协议;

      (4)不需建立连接,速度快;

      2、TCP协议:是面向连接的,必须连接成功才能传输数据,应用于下载等程序上。其特点是:

      (1)建立连接,形成传输数据通道;

      (2)在连接中进行大数据量传输;

      (3)通过三次握手完成连接,是可靠的协议;

      (4)必须建立连接,效率会低一些;

    三、网络传输协议

      (一)Socket:Socket是为网络服务提供的一种机制。

      1、通信两端都要有Socket;

      2、网络通信,其实就是Socket间的通信;

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

      (二)UDP传输

      1、概述

      UDP传输是通过DatagramSocket类来实现的,此类表示用来发送和接收数据包的套接字,存在java.net包中。

      2、常用方法:

      ① DatagramSocket():创建 UDPSocket发送服务对象,不指定端口号。

      ② DatagramSocket(int port):创建 UDPSocket发送服务对象,指定端口号。

      ③ void send(DatagramPacket p):发送数据报包。

      ④ void receive(DatagramPacket p):接收数据报包。

      3、创建UDP发送端、UDP接收端步骤:

      (1)UDP发送端

       ① 建立UDP的Socket服务。

       ② 将要发送的数据封装到数据包中。

       ③ 用UDP的socket服务将数据包发送出去。

       ④ 关闭Socket服务。

      (2)UDP接收端

       ① 建立UDP Socket服务,因为要接收数据,必须要明确一个端口号。

       ② 定义一个数据包,用来存储接收到的字节数据,因为数据包对象中有更多功能可以提取字节数据中的不同数据信息。

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

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

       ⑤ 关闭Socket服务。

      (3)注意事项:

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

      (2)在发送端,要在数据包对象中明确目的地IP及端口。

      (3)在接收端,要指定监听的端口。

      4、UDP发送端、UDP接收端代码示例

     1 //(1)UDP发送端代码:
     2 import java.net.*;
     3 class UDPSend{
     4     public static void main(String[] args)throws Exception{
     5         //1、创建UDP服务,使用DatagramSocket对象。
     6         DatagramSocket ds = new DatagramSocket(8888);
     7         //2、将要发送的数据封装到数据包中,用到DatagramPacket(byte[] buf, int length, InetAddress address, int port)
     8         byte[] buf = "udp shi shen ma".getBytes();
     9         DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10000);  
    10         //3、通过Socket服务,将已有的数据包发送出去。通过send方法
    11         ds.send(dp);
    12         //4、关闭资源
    13         ds.close();
    14     }
    15 }
    16 //(2)UDP接收端代码:
    17 class UDPReceive{
    18     public static void main(String[] args)throws Exception{
    19         //一直处于接收状态
    20         while(true)
    21         {
    22             //    1. 创建udp Socket服务,建立端点
    23             DatagramSocket ds = new DatagramSocket(10000);
    24             //    2. 定义数据包。用于存储数据
    25             byte[] buf = new byte[1024];
    26             DatagramPacket dp = new DatagramPacket(buf,buf.length);
    27             //    3. 通过Socket服务的receive方法将接收到的数据存入数据包中
    28             ds.receive(dp);//阻塞式方法
    29             //    4. 通过数据包的方法获取其中的数据
    30             String ip = dp.getAddress().getHostName();
    31             String text = new String(dp.getData(),0,dp.getLength());
    32             int port = dp.getPort();
    33             System.out.println(ip+"::"+text+"::"+port);
    34             //    5. 关闭资源
    35             ds.close();
    36         }
    37     }
    38 }

      5、练习题:

      (1)用键盘录入的方式,来发送数据。

      (2)编写一个聊天程序,有收数据的部分和发数据的部分。

      (三)TCP传输

      1、概述

      TCP传输分为“客户端”和“服务端”。客户端对应的对象是Socket,服务端对应的对象是ServerSocket。

      2、常用方法:

      (1)客户端Socket

      构造函数:

      ① Socket():创建未连接套接字。

      ② Socket(InetAddress address , tin port):创建连接到IP指定端口的套接字。

      ③ Socket( String host , int port ):创建流套接字并将其连接到指定主机上的指定端口号。

      特有方法:

      ① getInputStream():返回此套接字的输入流。

      ② getOutputStream():返回此套接字的输出流。

      ③ void shutdownInput():此套接字的输入流至于“流的末尾”。

      ④ void shutdownOutput():禁用此套接字的输出流。

      (2)服务端ServerSocket

      ① 构造函数:ServerSocket(int port):创建绑定到特定端口的服务器套接字。

      ② 特有方法:Socket accept():监听并接受到此套接字的连接,是阻塞式方法。

      3、创建TCP客户端、TCP服务端步骤:

      TCP是面向连接的,在建立Socket服务时,需要有服务端存在并连接成功,形成通路,再通过连接好的通路进行数据传输。

      (1)TCP客户端创建步骤

       ① 创建Socket服务,明确要连接的主机端口。

       ② 为了发送数据,应获取Socket中的输出流。如果要接收服务端的反馈信息,还需要获取Socket的输入流。

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

       ④ 关闭Socket流资源。

      (2)TCP服务端创建步骤

       ① 建立服务端的Socket服务,并监听一个端口。通过ServerSocet带端口参数的构造函数完成。

       ② 获取连接过来的客户端对象,通过ServerSocket的阻塞式方法accept()接收客户端对象。

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

       ④ 关闭资源。(关闭客户端,一般不关服务端)

      4、TCP客户端和服务端代码示例

     1 /* 需求:客户端给服务端发送数据,服务端收到后,给客户端反馈信息。 */
     2 import java.net.*;
     3 import java.io.*;
     4 //(1)客户端代码示例
     5 class  TcpClient{
     6     public static void main(String[] args) throws Exception{
     7         //1、创建客户端的Socket服务。指定目的主机和端口
     8         Socket s = new Socket("127.0.0.1",10000);
     9         //2、获取Socket流中输出流,发送数据
    10         OutputStream out = s.getOutputStream();
    11         out.write("你好!".getBytes());
    12         //3、获取Socket流中的输入流,用来接收服务端的反馈信息并打印
    13         InputStream in = s.getInputStream();
    14         byte[] buf = new byte[1024];
    15         int len = in.read(buf);//读取反馈的数据
    16         //输出接收的数据
    17         System.out.println(new String(buf,0,len));
    18         s.close();//关闭资源
    19     }
    20 }
    21 //(2)服务端代码示例
    22 class TcpServer{
    23     public static void main(String[] args)throws Exception{
    24         //1、创建服务端的Socket服务,并监听一个端口
    25         ServerSocket ss = new ServerSocket(10000);
    26         //2、通过accept方法获取连接过来的客户端对象。
    27         Socket s = ss.accept();
    28         //获取客户端ip
    29         String ip = s.getInetAddress().getHostName();
    30         System.out.println(ip+"connected....");
    31         //3、获取对应客户端对象的读取流读取发过来的数据,并打印
    32         InputStream in = s.getInputStream();
    33         byte[] buf = new byte[1024];
    34         int len = in.read(buf);
    35         System.out.println(new String(buf,0,len));  
    36         //4、调用对应的客户端的输出流写入返回数据
    37         OutputStream out = s.getOutputStream();
    38         out.write("哥们,收到!".getBytes());  
    39         //关闭资源
    40         s.close();
    41         ss.close();//可选操作
    42     }
    43 }

      5、练习题:

      (1)需求:建立一个文本转换服务器 ,客户端给服务端发送文本,服务端会将文本转成大写再返回给客户端,而且客户端可以不断的进行文本转换。当客户端输入over时,转换结束。

      (2)需求:向服务器上传一个文件,服务返回一条“上传成功”的信息。

      (四)应用示例

      需求:通过利用TCP传输,实现并发上传图片

      1 import java.io.*;
      2 import java.net.*; 
      3 //客户端
      4 class  PicClient {
      5     public static void main(String[] args) throws Exception{
      6         //对传入的值进行判断
      7         if (args.length!=1) {
      8             System.out.println("请指定一个图片文件!");
      9             return; 
     10         }
     11         File file = new File(args[0]);
     12         //对文件路径进行判断
     13         if (!(file.exists()&&file.isFile())){
     14             System.out.println("你上传的文件有问题,非文件或者不存在!");
     15             return;
     16         }
     17         //判断是否是图片文件
     18         if (!file.getName().endsWith(".jpg")){
     19             System.out.println("图片格式错误,请重新选择!");
     20             return;
     21         }  
     22         //对文件大小进行判断
     23         if (file.length()>1024*1024*5){
     24             System.out.println("你上传的文件过大,居心叵测!");
     25             return;
     26         }
     27         //创建服务
     28         Socket s = new Socket("localhost",10000);
     29         //读取图片数据
     30         FileInputStream fis = new FileInputStream(file);
     31         //用Socket服务输出流写入数据
     32         OutputStream out = s.getOutputStream();
     33         BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
     34         byte[] buf = new byte[1024];
     35         int len = 0;
     36         while ((len = fis.read(buf))! = -1){
     37             out.write(buf,0,len);
     38         }
     39         //结束标记,表示文件数据已经上传完了
     40         s.shutdownOutput();
     41         String info=in.readLine();//读取返回信息
     42         System.out.println(info);
     43         fis.close();//关流
     44         s.close();
     45     }
     46 }
     47 
     48 //服务端
     49 class PicServer{
     50     public static void main(String[] args)throws Exception{
     51         //创建服务,监听端口
     52         ServerSocket ss = new ServerSocket(10000);
     53         while (true){
     54             //获取客户端对象
     55             Socket s = ss.accept();
     56             //客户端执行线程
     57             new Thread(new PicThread(s)).start();
     58         }
     59         //ss.close();
     60     }
     61 }
     62 
     63 //利用多线程实现并发上传
     64 class PicThread implements Runnable{
     65     private Socket s;
     66     PicThread(Socket s){
     67         this.s = s;
     68     }
     69     public void run(){
     70         int count = 1;
     71         //获取客户端ip
     72         String ip = s.getInetAddress().getHostAddress();
     73         try{
     74             System.out.println(ip+"  connected.....");
     75             //通过客户端的读取流读取数据
     76             InputStream in = s.getInputStream();
     77             //文件保存路径
     78             File dir = new File("C:\Users\asus\Desktop");
     79             //文件名
     80             File file = new File(dir,ip+".jpg");
     81             //判断文件是否存在
     82             while(file.exists()){
     83                 file = new File(dir,ip+"("+(count++)+").jpg");
     84             }
     85             //将数据写入到指定文件中
     86             FileOutputStream fos = new FileOutputStream(file);
     87             byte[] buf = new byte[1024];
     88             int len = 0;
     89             while ((len = in.read(buf))! = -1){
     90                 fos.write(buf,0,len);
     91             }
     92             //将收到图片数据的信息返回给客户端
     93             OutputStream out = s.getOutputStream();
     94             out.write("上传成功!".getBytes());
     95             fos.close();//关流
     96             s.close();
     97         }catch (Exception e){
     98             throw new RuntimeException(ip+"图片上传失败");
     99         }
    100     }
    101 }

    四、URL&URLConnection

      (一)概述

      1、URI:表示一个统一资源标识符 (URI) 引用。

      2、URL:代表一个统一资源定位符,它是指向互联网“资源”的指针。

      3、URN:统一资源名称。

      (二)常用方法

      (1)构造函数:

      URL(String protocol,String host,int port,String file):根据指定 protocol、host、port号和 file 创建 URL对象。

      (2)InputStream openStream() :打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。

      (3)String getProtocol():获取协议名称。

      (4)String getHost():获取主机名。

      (5)int getPort():获取端口号。

      (6)String getFile():获取URL文件名。

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

      (8)String getQuery():获取此URL的查询部,客户端传输的特定信息。

      (三)URLConnection

      (1)URLConnection openConnection():用URL调用此方法,返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。

      (2)InputStream getInputStream():获取输入流

      (3)OutputStream getOutputStream():获取输出流

      注:openStream的底层是通过openConnection()实现的。url.openStream()的可以用以下代码来代替实现:

    1 URL url = new URL(“str_rul”);//str_url是表示“ip地址+端口+路径文件+参数”的字符串。
    2 URLConcetion conn = url.openConnection();
    3 InputStream in = conn.getInputStream();

      (四)URL应用示例

     1 import java.io.IOException;
     2 import java.io.InputStream;
     3 import java.net.URL;
     4 import java.net.URLConnection;
     5 public class URLDemo {
     6     public static void main(String[] args) throws IOException {
     7         String str_url = "http://127.0.0.1:8080/myweb/1.html";    
     8         URL url = new URL(str_url);    
     9          System.out.println("getProtocol:"+url.getProtocol());
    10          System.out.println("getHost:"+url.getHost());
    11          System.out.println("getPort:"+url.getPort());
    12          System.out.println("getFile:"+url.getFile());
    13          System.out.println("getPath:"+url.getPath());
    14          System.out.println("getQuery:"+url.getQuery());
    15          InputStream in = url.openStream();
    16         //获取url对象的Url连接器对象。将连接封装成了对象:java中内置的可以解析的具体协议的对象+socket.
    17         URLConnection conn = url.openConnection();
    18          String value = conn.getHeaderField("Content-Type");
    19           System.out.println(value);
    20          System.out.println(conn);
    21         InputStream in = conn.getInputStream();
    22         byte[] buf = new byte[1024];
    23         int len = in.read(buf);
    24         String text = new String(buf,0,len);
    25         System.out.println(text);
    26         in.close();
    27     }
    28 }

    五、常见网路结构

      (一)C/S结构(client/server

      1、特点:

        该结构的软件,客户端和服务端都需要编写。

        可发成本较高,维护较为麻烦。

      2、好处:

        客户端在本地可以分担一部分运算。

      (二)B/S结构(browser/server

      1、特点:

        该结构的软件,只开发服务器端,不开发客户端,因为客户端直接由浏览器取代。

        开发成本相对低,维护更为简单。

      2、缺点:

        所有运算都要在服务端完成。 

    ---------- android培训java培训、期待与您交流! ----------

  • 相关阅读:
    [JZOJ3339]【NOI2013模拟】wyl8899和法法塔的游戏
    [JZOJ3337] 【NOI2013模拟】wyl8899的TLE
    UVA 1262 Password
    UVA 10820 Send a Table
    UVA 12716 GCD XOR
    UVA 10791
    UVA 10375 choose and divide (唯一分解定理)
    欧拉函数
    51 Nod 1069 Nim游戏
    51 Nod 1242 矩阵快速幂求斐波那契数列
  • 原文地址:https://www.cnblogs.com/jianxingjianyuan2014/p/4006597.html
Copyright © 2011-2022 走看看