• .Net转Java自学之路—基础巩固篇十七(网络编程、Tomcat、URL)


    网络编程

      网络模型:

        OSI模型:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。

        TCP/IP模型:应用层、传输层、网际层、数据链路层。

      网络通讯最基本的三大要素:IP地址、端口号、传输协议。

      网络编程主要作用于:传输层、网际层。

      IP地址:

    /*
    * IP地址:
    *     InetAddress类 import java.net.*;
    */
    InetAddress ip = InetAddress.getLocalHost();
    ip.getHostAddress();//本地IP地址
    ip.getHostName();//本地主机名
    
    ip=InetAddress.getByName("ip地址/域名");//没有连接成功会报 UnknowHostException 未知主异常
    ip.getHostAddress();//指定机器的IP地址
    ip.getHostName();//指定机器的主机名
    
    getAllByName(strHost);//获取一个主机对应的所有IP地址

      端口号:

        逻辑端口就是给应用程序分配的一个数字标识。

      传输协议:

        通讯规则。常见的协议有:TCP、UDP。

        UDP:将数据及技术员和目的封装成数据包中,不需要建立连接。数据包的大小限制在64k内。因为不需要建立连接,所以速度快;但 是不可靠协议。

        TCP:需要建立连接,形成传输数据的通道。在连接中可以进行大数据量传输。效率低、速度相对慢,但 是可靠协议。

      Socket机制:

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

        网络通信就是Socket间的通信,数据是在俩个Socket间的IO传输。

        UDP:

          关联的对象:DatagramSocket、Datagrampacket

    //发送端
    DatagramSocket ds = new DatagramSocket();
    byte[] bytes = "数据内容".getBytes();
    DatagramPacket dp = new DatagramPacket(bytes,bytes.length,InetAddress.getByName("IP地址"),端口号);//发送数据
    ds.send(dp);//通过udp的Socket服务中的功能,完成数据包的发送。
    ds.close();
    
    /*接收端:
    *在建立udpSocket服务时,需要该应用程序定义数字标识,也就是端口,也就是说,让该应用程序监听一个端口,只要是这个端口发送的数据,该应用程序就可以进行处理。
    */
    DatagramSocket ds = new DatagramSocket(int);
    //预先定义好一个数据包,用于存储接收到的数据;因为数据包中必须有一个容器存储这些数据。所以要先定义字节数据。
    byte[] buf = new byte[1024];
    DatagramPacket dp=new DatagramPacket(buf,buf.length);
    //使用Socket服务的receive()将接收到的数据存储到数据包中。该方法是堵塞式方法
    ds.receive(dp);
    //获取数据内容。地址、端口、数据主体
    String strText=new String(dp.getData(),0,dp.getLength());

        TCP:

          面向连接、可靠的协议

          客户端:Socket  

          服务器端:ServerSocket 

            服务器端没有直接流对象,通过accept()获取客户端对象

    //客户端
    Socket sk=new Socket("IP地址",端口号);
    OutputStream out=sk.getOutputStream();//获取Socket的输出流
    out.write("数据内容".getBytes());
    sk.close();
    
    //服务器端
    ServerSocket ss=new ServerSocket(端口);
    Socket sk=ss.accept();//该方法式堵塞式方法
    
    String ip=sk.getInetAddress.getHostAddress();
    InputStream in=sk.getInputStream();//获取客户端发送的输入流
    byte[] bytes=new byte[1024];
    int len=in.read(bytes);
    String str=new String(bytes,0,len);
    sk.close();
    ss.close();

          TCP传输容易出现客户端和服务端都等待的情况;因为客户端和服务器端有阻塞式方法存在,比如 read()、readLine() 。所以要定义结束标记。

          read() 定义-1为结束标记。readLine() 定义回车和-1为结束标记。

    实例:上传

    //客户端
    Socket s=new Socket("ip",端口号);
    BufferedReader bufr=new BufferedReader(new FileReader(path));
    PrintWriter pw=new PrintWriter(new getOutputStream(),true);
    String line=null;
    while((line=bufr.readLine())!=null){
        pw.println(line);
    }
    s.shutdownOutput();//结束标记
    
    BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
    String str=bufIn.readLine();
    System.out.println(str);
    bufr.close();
    s.close();
    
    //服务端
    ServerSocket ss=new ServerSocket(端口号);
    Socket s=ss.accept();
    BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
    PrintWriter pw=new PrintWriter(new FileWriter(path),true);
    String line=null;
    while((line=bufIn.readLine())!=null){
        pw.println(line);
    }
    PrintWriter pwOut=new PrintWriter(s.getOutputStream(),true);
    pwOut.println("成功");
    pw.close();
    s.close();
    ss.close();

    实例:TCP上传图片

     1 import java.io.*;
     2 import java.net.*;
     3 
     4 Class UploadServer{
     5     public static void main(String[] args) throws Exception {
     6         ServerSocket ss=new ServerSocket(端口号);
     7         While(true){
     8             Socket s=ss.accept();
     9             new Thread(new PicThread(s)).start();
    10         }
    11     }
    12 }
    13 
    14 Class UploadClient{
    15     public static void main(String[] args) throws Exceptin {
    16         Socket s=new Socket(ip,端口号);
    17         FileInputStream fis=new FileInputStream(file);
    18         OutputStream out=s.getOutputStream();
    19         byte[] bytes=new byte[1024*n];
    20         int len=0;
    21         while((len=fis.read(bytes))!=-1){
    22             out.writer(bytes,0,len);
    23         }
    24         s.shtdownOutput();//结束标记
    25         InputStream in=s.getInputStream();
    26         byte[] buf=new byte[1024];
    27         len=in.read(buf);
    28         String str=new String(buf,0,len);
    29         System.out.println(sttr);
    30         fis.close();
    31         s.close();
    32     }
    33 }
    34 
    35 Class PicThread implements Runnable {
    36     private Socket s;
    37     PicThread(Socket s){
    38         this.s=s;
    39     }
    40 
    41     public void run(){
    42         int count=1;
    43         String ip=s.getInetAddress().getHostAddress();
    44         try{
    45             //获取客户端发送的数据
    46             InputStream in=s.getInputStream();
    47             byte[] bytes=new byte[1024*n];
    48             //定义目的,接收数据写入文件
    49             File dir=new File(Path);
    50             if(!dir.exists()) dir.mkdir();
    51             File file=new File(dir,ip+(count++)+".jpg");
    52             while(file.exists()){
    53                 file=new File(dir,ip+(count++)+".jpg");
    54             }
    55             FileOutputStream fos=new FileOutputStream(file);
    56             int len=0;
    57             while((len=in.read(buf))!=-1){
    58                  fos.write(bytes,0,len);
    59             }
    60 
    61             OutputStream out=s.getOutputStream();
    62             out.write("成功");
    63             fos.close();s.close();
    64         }catch(Exception ex){
    65             throw new RuntimeException(ip+"失败");
    66         }
    67     }
    68 }
    View Code

    Tomcat:

      服务器端应用。地址栏输入http://IP:端口号(server.xml中配置的端口号)可以访问tomcat服务器的指定资源

      访问tomcat中的自定义资源:

        只要在tomcat服务器的webapps目录下定义的应用程序即可。

      启动:

        bin文件夹下 打开startup.bat 启动tomcat。

        若启动startup.bat后窗口一闪即消失:

          检查JAVA_HOME环境变量配置是否正确

      关闭:

        bin文件夹下 打开shutdown.bat 关闭tomcat
      配置端口号:
        在server.xml中配置<Connector port="配置端口号" ..../>
      配置外部应用:
        1、在server.xml中配置在<Host .....></Host>中加入
          <Context path="文件夹名称" docbase="路径" />
        2、conf/cataline/localhost 下创建一个xml文件,并录入:
          <Context docBase="路径" />
      映射虚拟主机:
        1、修改端口号为80
        2、修改hosts文件,添加对象的绑定关系
          路径c:WINDOWSsystem32driversetc
        3、在server.xml文件中添加一个<Host>

    URI、URL、URN:

      URI:统一资源标识符

      URL:统一资源定位符

      URN:统一资源名称

      每个URL都是URI,但不一定每一个URI都是URL。应为URI还包含了一个子类URN,URN命名资源但不指定如何定位资源。

    URL类:

    //常用方法
    boolean equals(Object);//URL是否等于另一个对象
    getAuthority();//获取URL的授权部分
    Object getContent();//获取URL内容
    int getDefaultPort();//获取URL关联协议的默认端口号
    getFile();//获取URL的文件名
    getHost();//获取URL的主机名
    getPath();//获取URL的路径部分
    int getPort();//获取URL的端口号
    getProtocol();//获取URL的协议名称
    getQuery();//获取URL的查询部分(参数信息)
    getRef();//获取URL的锚点
    URLConnection openConnection();//打开连接
  • 相关阅读:
    详解单例模式
    Spring整合Mybatis案例,献给初学的朋友
    Java反射学习总结
    IDEA JSP项目构建及学习心得
    SQL Server数据库表锁定原理以及如何解除表的锁定
    MySQL锁定机制简介
    Cassandra简介
    Linux机器上实现程序自动部署以及更新
    服务器时间同步平台化
    内存查看平台化
  • 原文地址:https://www.cnblogs.com/zltao/p/10041978.html
Copyright © 2020-2023  润新知