zoukankan      html  css  js  c++  java
  • 黑马程序员_java基础笔记(08)...GUI,网络编程,正则表达式

    —————————— ASP.Net+Android+IOS开发.Net培训期待与您交流! ——————————

    GUI(Graphical User Interface)(图形用户接口):用图形的方式,来 显示计算机操作的界面,这样更方便更直观

    CLI(Conmand line User Interface)(命令行用户接口):就是常见的Dos命令操作。需要记忆一些常用的命令,操作不直观

    比如:创建文件夹,或者删除文件夹等等

     

    Java为GUI提供的对象都存在java.Awt和javax.Swing两个包中

      java.Awt(Abstract Window ToolKit)(抽象窗口工具包),需要调用本地系统方法实现功能。重量级控件。

      javax.Swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现。增强了移植性,轻量级控件。

                  继承关系图

      

    布局管理器:容器中组件的排放方式,就是布局

      常见的布局管理器

        FlowLayout(流式布局管理器)①:从左到右的顺序排放。②:Panel默认的布局管理器。

        BorderLayout(边界布局管理器)①:东,南,西,北,中。②:Frame默认的布局管理器。

        GridLayout(网络布局管理器)①:规矩的矩形。

        CardLayout(卡片布局管理器)①:选项卡。

        GridBagLayout(网络包布局管理器)①:非规矩的矩阵。

      建立一个简单的窗体

        Containe常用子类:Window  Panel(面板,不能单独存在)

        Window常用子类:Frame  Dialog

        简单的窗体创建过程

          Frame f = new Frame("my window");

          f.setLayout(new FlowLayout());

          f.setSize(500,400);//设置窗体大小

          f.setLocation(300,200);//设置窗体出现在屏幕的位置

          f.setVisible(true);

     

      事件监听机制

        组成【事件源(组件),事件(Event),监听器(Listener),事件处理(引发事件后处理方式)】

                事件监听机制流程图

      

      确定事件源(容器或组件)

      通过事件源对象的addXXXListener()方法将侦听器注册到该事件源上。

      该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdapter的子类对象。

      一般用匿名内部类来表示。

      在覆盖方法的时候,方法的参数一般是XXXEvent类型的变量接收。

      事件触发后会把事件打包成对象传递给该变量。(其中包括事件源对象。通过getSource()或者,getComponent()获取。)

    菜单

    MenuBar,Menu,MenuItem

    先创建菜单条,再创建菜单,每一个菜单中建立菜单项。

    也可以菜单添加到菜单中,作为子菜单。

    通过setMenuBar()方法,将菜单添加到Frame中。

    练习:完成一个简单的记事本程序。

    网络编程

       网络模型 :①:OSI参考模型。 ②:TCP/IP参考模型。

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

          

      

      网络通信要素

        IP地址:InetAddress:①网络中设备的标识。②不宜记忆,可用主机名。③本地回环地址:127.0.0.1 主机名:localhost。

        端口号:①用于标识进程的逻辑地址,不同进程的标识。②有效端口:0~65535,其中0~1024系统使用或保留端口。

        传输协议:①通信的规则。②常见协议:TCP,UDP。

       UDP将数据及源和目的封装成数据包中,不需要建立连接。②每个数据包的大小限制在64k内。③因无连接,是不可靠协议。④不需要建立连接,速度快。

       TCP①建立连接,形成传输数据的通道。②在连接中进行大数据量传输。③通过三次握手完成连接,是可靠协议。④必须建立连接,效率会稍低。

          TCP/IP协议Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。

     Socket:★★★★,套接字,通信的端点。

      Socket:①是为网络服务提供的一种机制。②通信的两端都有Socket。③网络通信其实就是Socket间的通信。④数据在两个Socket间通过IO传输。

      UDP传输:①SatagramSocket与DatagramPacke。②建立发送端,接受端。发送端,接受端是两个独立的运行程序。③建立数据包。④调用Socket的发送接收方法。⑤关闭Socket。

      TCP传输:①Socket和ServerSocket。②建立客户端和服务器端。客户端,服务器端是两个独立的运行程序。③建立连接后,通过Socket中的IO流进行数据的传输。④关闭Socket。 

    /*演示tcp传输
    1,tcp分客户端和服务端。
    2, 客户端对应的对象是Socket。
        服务端对应的对象是ServerSocket。

    需求:给服务端发送给一个文本数据。
    步骤:
    1,创建Socket服务。并指定要连接的主机和端口。
    */
    class  TcpClient{
        public static void main(String[] args) throws Exception {
            //创建客户端的socket服务。指定目的主机和端口
            Socket s = new Socket("192.168.1.254",10003);
            //为了发送数据,应该获取socket流中的输出流。
            OutputStream out = s.getOutputStream();
            out.write("tcp ge men lai le ".getBytes());
            s.close();
        }
    }
    /*
    需求:定义端点接收数据并打印在控制台上。
    服务端:
    1,建立服务端的socket服务。ServerSocket();并监听一个端口。
    2,获取连接过来的客户端对象。通过ServerSokcet的 accept方法。没有连接就会等,所以这个方法阻塞式的。
    3,客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据。并打印在控制台。
    4,关闭服务端。(可选)
    */
    class  TcpServer{
        public static void main(String[] args) throws Exception{
            //建立服务端socket服务。并监听一个端口。
            ServerSocket ss = new ServerSocket(10003);
            //通过accept方法获取连接过来的客户端对象。
            while(true){
            Socket s = ss.accept();
            String ip = s.getInetAddress().getHostAddress();
            System.out.println(ip+".....connected");
            //获取客户端发送过来的数据,那么要使用客户端对象的读取流来读取数据。
            InputStream in = s.getInputStream();
            byte[] buf = new byte[1024];
            int len = in.read(buf);
            System.out.println(new String(buf,0,len));
            s.close();//关闭客户端.
            }
        }
    }


    //需求:上传文件
    import java.io.*;
    import java.net.*;
    class  Client{
        public static void main(String[] args) throws Exception{
            Socket s = new Socket("192.168.1.254",10006);
            BufferedReader bufr =
                new BufferedReader(new FileReader("IPDemo.java"));

            //定义目的,将数据写入到socket输出流。发给服务端。
            //BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
            PrintWriter out = new PrintWriter(s.getOutputStream(),true);
            String line = null;
            while((line=bufr.readLine())!=null){
                out.println(line);
            }
            s.shutdownOutput();//关闭客户端的输出流。相当于给流中加入一个结束标记—1.  

       //定义一个socket读取流,读取服务端返回的信息。      
            BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
            String str = bufIn.readLine();
            System.out.println(str);
            bufr.close();
            s.close();
        }
    }
    class  Server{
        public static void main(String[] args) throws Exception{
            ServerSocket ss = new ServerSocket(10006);
            Socket s = ss.accept();
            String ip = s.getInetAddress().getHostAddress();
            System.out.println(ip+"....connected");

       //读取socket读取流中的数据。
            BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));

            //目的。socket输出流。将大写数据写入到socket输出流,并发送给客户端。
            //BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
            PrintWriter out  = new PrintWriter(new FileWriter("server.txt"),true);
            String line = null;
            while((line=bufIn.readLine())!=null){
                //if("over".equals(line))
                    //break;
                out.println(line);
            }
            PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
            pw.println("上传成功");
            out.close();
            s.close();
            ss.close();
        }
    }

    /*需求:上传图片
    客户端。
    1,服务端点。
    2,读取客户端已有的图片数据。
    3,通过socket 输出流将数据发给服务端。
    4,读取服务端反馈信息。
    5,关闭。*/
    import java.io.*;
    import java.net.*;
    class  PicClient{
        public static void main(String[] args)throws Exception {
            if(args.length!=1){
                System.out.println("请选择一个jpg格式的图片");
                return ;
            }
            File file = new File(args[0]);
            if(!(file.exists() && file.isFile())){
                System.out.println("该文件有问题,要么补存在,要么不是文件");
                return ;
            }
            if(!file.getName().endsWith(".jpg")){
                System.out.println("图片格式错误,请重新选择");
                return ;
            }
            if(file.length()>1024*1024*5){
                System.out.println("文件过大,没安好心");
                return ;
            }
            Socket s = new Socket("192.168.1.254",10007);
            FileInputStream fis = new FileInputStream(file);
            OutputStream out = s.getOutputStream();
            byte[] buf = new byte[1024];
            int len = 0;
            while((len=fis.read(buf))!=—1){
                out.write(buf,0,len);
            }
            //告诉服务端数据已写完
            s.shutdownOutput();
            InputStream in = s.getInputStream();
            byte[] bufIn = new byte[1024];
            int num = in.read(bufIn);
            System.out.println(new String(bufIn,0,num));
            fis.close();
            s.close();
        }
    }
    //服务端
    class PicThread implements Runnable{
        private Socket s;
        PicThread(Socket s){
            this.s = s;
        }
        public void run(){
            int count = 1;
            String ip  = s.getInetAddress().getHostAddress();
            try{
                System.out.println(ip+"....connected");
                InputStream in = s.getInputStream();
                File dir =  new File("d:\pic");
                File file = new File(dir,ip+"("+(count)+")"+".jpg");
                while(file.exists())
                    file = new File(dir,ip+"("+(count++)+")"+".jpg");
                FileOutputStream fos = new FileOutputStream(file);
                byte[] buf = new byte[1024];
                int len = 0;
                while((len=in.read(buf))!=—1){
                    fos.write(buf,0,len);
                }
                OutputStream out = s.getOutputStream();
                out.write("上传成功".getBytes());
                fos.close();
                s.close();
            }
            catch (Exception e){
                throw new RuntimeException(ip+"上传失败");
            }
        }
    }
    class  PicServer{
        public static void main(String[] args) throws Exception{
            ServerSocket ss = new ServerSocket(10007);
            while(true){
                Socket s = ss.accept();
                new Thread(new PicThread(s)).start();
            }
            //ss.close();
        }
    }

    /*
    编写一个聊天程序
    有收数据的部分,和发数据的部分。
    这两部分需要同时执行。
    那就需要用到多线程技术。
    一个线程控制收,一个线程控制发。
    因为收和发动作是不一致的,所以要定义两个run方法。
    而且这两个方法要封装到不同的类中。
    */
    import java.io.*;
    import java.net.*;
    class Send implements Runnable{
        private DatagramSocket ds;
        public Send(DatagramSocket ds){
            this.ds = ds;
        }
        public void run(){
            try{//定义读取键盘数据的流对象。
                BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
                String line = null;
                while((line=bufr.readLine())!=null){
                    byte[] buf = line.getBytes();
                    DatagramPacket dp =
                        new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.255"),10002);
                    ds.send(dp);
                    if("886".equals(line))
                        break;
                }
            }
            catch (Exception e){
                throw new RuntimeException("发送端失败");
            }
        }
    }
    class Rece implements Runnable{
        private DatagramSocket ds;
        public Rece(DatagramSocket ds){
            this.ds = ds;
        }
        public void run(){
            try{
                while(true){
                    byte[] buf = new byte[1024];
                    DatagramPacket dp = new DatagramPacket(buf,buf.length);
                    ds.receive(dp);
                    String ip = dp.getAddress().getHostAddress();
                    String data = new String(dp.getData(),0,dp.getLength());
                    if("886".equals(data)){
                        System.out.println(ip+"....离开聊天室");
                        break;
                    }
                    System.out.println(ip+":"+data);
                }
            }
            catch (Exception e)        {
                throw new RuntimeException("接收端失败");
            }
        }
    }

    class  ChatDemo{
        public static void main(String[] args) throws Exception{
            DatagramSocket sendSocket = new DatagramSocket();
            DatagramSocket receSocket = new DatagramSocket(10002);
            new Thread(new Send(sendSocket)).start();
            new Thread(new Rece(receSocket)).start();
        }
    }


    /*
    需求:通过udp传输方式,将一段文字数据发送出去。
    定义一个udp发送端。
    思路:
    1,建立updsocket服务。
    2,提供数据,并将数据封装到数据包中。
    3,通过socket服务的发送功能,将数据包发出去。
    4,关闭资源。
    */

    import java.net.*;
    class  UdpSend{
        public static void main(String[] args) throws Exception{
            //1,创建udp服务。通过DatagramSocket对象。
            DatagramSocket ds = new DatagramSocket(8888);
            //2,确定数据,并封装成数据包。DatagramPacket(byte[] buf, int length, InetAddress address, int port)
            byte[] buf = "udp ge men lai le ".getBytes();
            DatagramPacket dp =
                new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.254"),10000);
            //3,通过socket服务,将已有的数据包发送出去。通过send方法。
            ds.send(dp);
            //4,关闭资源。
            ds.close();
        }
    }
    /*
    需求:
    定义一个应用程序,用于接收udp协议传输的数据并处理的。
    定义udp的接收端。
    思路:
    1,定义udpsocket服务。通常会监听一个端口。其实就是给这个接收网络应用程序定义数字标识。
        方便于明确哪些数据过来该应用程序可以处理。
    2,定义一个数据包,因为要存储接收到的字节数据。
    因为数据包对象中有更多功能可以提取字节数据中的不同数据信息。
    3,通过socket服务的receive方法将收到的数据存入已定义好的数据包中。
    4,通过数据包对象的特有功能。将这些不同的数据取出。打印在控制台上。
    5,关闭资源。
    */
    class  UdpRece{
        public static void main(String[] args) throws Exception{
            //1,创建udp socket,建立端点。
            DatagramSocket ds = new DatagramSocket(10000);
            while(true){
            //2,定义数据包。用于存储数据。
            byte[] buf = new byte[1024];
            DatagramPacket dp = new DatagramPacket(buf,buf.length);
            //3,通过服务的receive方法将收到数据存入数据包中。
            ds.receive(dp);//阻塞式方法。
            //4,通过数据包的方法获取其中的数据。
            String ip = dp.getAddress().getHostAddress();
            String data = new String(dp.getData(),0,dp.getLength());
            int port = dp.getPort();
            System.out.println(ip+"::"+data+"::"+port);
            }
            //5,关闭资源
            //ds.close();
        }
    }

    正则表达式:★★★☆,其实是用来操作字符串的一些规则。

      好处:正则的出现,对字符串的复杂操作变得更为简单。

      特点:将对字符串操作的代码用一些符号来表示。只要使用了指定符号,就可以调用底层的代码对字符串进行操作。符号的出现,简化了代码的书写。

      弊端:符号的出现虽然简化了书写,但是却降低了阅读性。

        其实更多是用正则解决字符串操作的问题。

     

      :用小括号标示,每定义一个小括号,就是一个组,而且有自动编号,从1开始。

        只要使用组,对应的数字就是使用该组的内容。别忘了,数组要加\。

        (aaa(wwww(ccc))(eee))技巧,从左括号开始数即可。有几个左括号就是几组。

     

    常见操作:

      1,匹配:其实用的就是String类中的matches方法。

        String reg = "[1—9][0—9]{4,14}";

        boolean b = qq.matches(reg);//将正则和字符串关联对字符串进行匹配。

      2,切割:其实用的就是String类中的split方法。

      3,替换:其实用的就是String类中的replaceAll();

      4,获取:

        1),先要将正则表达式编译成正则对象。使用的是Pattern中静态方法 compile(regex);

        2),通过Pattern对象获取Matcher对象。

          Pattern用于描述正则表达式,可以对正则表达式进行解析。

          而将规则操作字符串,需要从新封装到匹配器对象Matcher中。

          然后使用Matcher对象的方法来操作字符串。

          如何获取匹配器对象呢?

          通过Pattern对象中的matcher方法。该方法可以正则规则和字符串想关联。并返回匹配器对象。

        3),使用Matcher对象中的方法即可对字符串进行各种正则操作。

    网页爬虫(蜘蛛)

       public static void main(String[] args) throws Exception{
            getMails_1();
       }
        public static void getMails_1()throws Exception{
            URL url = new URL("http://192.168.1.254:8080/myweb/mail.html");
            URLConnection conn = url.openConnection();
            BufferedReader bufIn = new BufferedReader(new InputStreamReader(conn.getInputStream()));    
            String line = null;
            String mailreg = "\w+@\w+(\.\w+)+";
            Pattern p = Pattern.compile(mailreg);
            while((line=bufIn.readLine())!=null){
                Matcher m = p.matcher(line);
                while(m.find())    {
                    System.out.println(m.group());
                }
            }
        }

    /*获取指定文档中的邮件地址。  使用获取功能。Pattern  Matcher*/  

      public static void getMails()throws Exception{
            BufferedReader bufr = new BufferedReader(new FileReader("mail.txt"));
            String line = null;
            String mailreg = "\w+@\w+(\.\w+)+";
            Pattern p = Pattern.compile(mailreg);
            while((line=bufr.readLine())!=null){
                Matcher m = p.matcher(line);
                while(m.find()){
                    System.out.println(m.group());
                }
            }
        }

    ——————————ASP.Net+Android+IOS开发.Net培训期待与您交流!——————————

     详细请查看:http://edu.csdn.net 
  • 相关阅读:
    20200226 Java IO流——廖雪峰
    20200225 Java 多线程(2)-廖雪峰
    20200225 Java 多线程(1)-廖雪峰
    20200224 尚硅谷ElasticSearch【归档】
    20200224 一 概述
    20200222 尚硅谷Dubbo【归档】
    20200222 四、dubbo原理
    Improved robustness of reinforcement learning policies upon conversion to spiking neuronal network platforms applied to Atari Breakout game
    Reinforcement learning in populations of spiking neurons
    Solving the Distal Reward Problem through Linkage of STDP and Dopamine Signaling
  • 原文地址:https://www.cnblogs.com/In-order-to-tomorrow/p/3528537.html
Copyright © 2011-2022 走看看