《黑马程序员》Java网络编程 GUI 正则表达式

来源:互联网 发布:投资保姆软件下载 编辑:程序博客网 时间:2024/06/09 12:08

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

一.网络编程
1.socket套接字
Socket通常也称作”套接字”,用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。
2.UDP传输
1),只要是网络传输,必须有socket 。
2),数据一定要封装到数据包中,数据包中包括目的地址、端口、数据等信息。
直接操作udp不可能,对于java语言应该将udp封装成对象,易于我们的使用,这个对象DatagramSocket. 封装了udp传输协议的socket对象。
因为数据包中包含的信息较多,为了操作这些信息方便,也一样会将其封装成对象。这个数据包对象就是:DatagramPacket.通过这个对象中的方法,就可以获取到数据包中的各种信息。
DatagramSocket具备发送和接受功能,在进行udp传输时,需要明确一个是发送端,一个是接收端。
Udp发送端
定义一个udp发送端。
1,建立updsocket服务。
2,提供数据,并将数据封装到数据包中。
3,通过socket服务的发送功能,将数据包发出去。
4,关闭资源。
代码实现:

class  UdpSend{    public static void main(String[] args) throws Exception    {//      Integer.        //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();    }}

Tcp传输
1.tcp分客户端和服务端。
2.客户端对应的对象是Socket。服务端对应的对象是ServerSocket。

客户端部分
通过查阅socket对象,发现在该对象建立时,就可以去连接指定主机。
因为tcp是面向连接的。所以在建立socket服务时,
就要有服务端存在,并连接成功。形成通路后,在该通道进行数据的传输。
代码实现:

import java.io.*;import java.net.*;class  TcpClient{    public static void main(String[] args) throws Exception     {        //创建客户端的socket服务。指定目的主机和端口        Socket s = new Socket("192.168.255.95",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();        int port=s.getPort();        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();//关闭客户端.        }    }}

下面给出客户端与服务端演示实例2:
代码如下:

/*演示tcp的传输的客户端和服务端的互访。需求:客户端给服务端发送数据,服务端收到后,给客户端反馈信息。*//*客户端:1,建立socket服务。指定要连接主机和端口。2,获取socket流中的输出流。将数据写到该流中。通过网络发送给服务端。3,获取socket流中的输入流,将服务端反馈的数据获取到,并打印。4,关闭客户端资源。*/class TcpClient2 {    public static void main(String[] args)throws Exception {        Socket s = new Socket("192.168.255.95",10004);        OutputStream out = s.getOutputStream();        out.write("服务端,你好".getBytes());        InputStream in = s.getInputStream();        byte[] buf = new byte[1024];        int len = in.read(buf);        System.out.println(new String(buf,0,len));        s.close();    }}class TcpServer2{    public static void main(String[] args) throws Exception{        ServerSocket ss = new ServerSocket(10004);        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));        OutputStream out = s.getOutputStream();        Thread.sleep(10000);        out.write("哥们收到,你也好".getBytes());        s.close();        ss.close();    }}

二。GUI编程
1.概念
图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。

2.Swing和AWT包
AWT 是Abstract Window ToolKit (抽象窗口工具包)的缩写,这个工具包提供了一套与本地图形界面进行交互的接口。AWT 中的图形函数与操作系统所提供的图形函数之间有着一一对应的关系,我们把它称为peers。 也就是说,当我们利用 AWT 来构件图形用户界面的时候,我们实际上是在利用操作系统所提供的图形库。由于不同操作系统的图形库所提供的功能是不一样的,在一个平台上存在的功能在另外一个平台上则可能不存在。为了实现Java语言所宣称的”一次编译,到处运行”的概念,AWT 不得不通过牺牲功能来实现其平台无关性,也就是说,AWT 所提供的图形功能是各种通用型操作系统所提供的图形功能的交集。由于AWT 是依靠本地方法来实现其功能的,我们通常把AWT控件称为重量级控件。

Swing 是在AWT的基础上构建的一套新的图形界面系统,它提供了AWT 所能够提供的所有功能,并且用纯粹的Java代码对AWT 的功能进行了大幅度的扩充。例如说并不是所有的操作系统都提供了对树形控件的支持, Swing 利用了AWT 中所提供的基本作图方法对树形控件进行模拟。由于 Swing 控件是用100%的Java代码来实现的,因此在一个平台上设计的树形控件可以在其他平台上使用。由于在Swing 中没有使用本地方法来实现图形功能,我们通常把Swing控件称为轻量级控件。

Swing使用示例:

import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.event.*;class  SwingDemo{    public static void main(String[] args)     {        JFrame f = new JFrame();        f.setBounds(300,100,500,400);        f.setLayout(new FlowLayout());        JButton but = new JButton("我是一个按钮");        f.add(but);        f.addWindowListener(new WindowAdapter()        {            public void windowClosing(WindowEvent e)            {                System.exit(0);            }        });        f.setVisible(true);    }}

Awt使用示例:

class  AwtDemo{    public static void main(String[] args)     {        Frame f = new Frame("my awt");        f.setSize(500,400);        f.setLocation(300,200);        f.setLayout(new FlowLayout());        Button b = new Button("我是一个按钮");        f.add(b);        f.addWindowListener(new WindowAdapter()        {            public void windowClosing(WindowEvent e)            {                System.out.println("我关");                System.exit(0);            }            public void windowActivated(WindowEvent e)             {                System.out.println("我活了。");            }            public void windowOpened(WindowEvent e)             {                System.out.println("我被打开了,hahahhahah");            }        });        f.setVisible(true);        //System.out.println("Hello World!");    }}

创建图形化界面步骤:
1),创建frame窗体。
2),对窗体进行基本设置。
比如大小,位置,布局。
3),定义组件。
4),将组件通过窗体的add方法添加到窗体中。
5),让窗体显示,通过setVisible(true)
3.事件监听机制的特点:
1),事件源。
2),事件。
3),监听器。
4),事件处理。
事件源:就是awt包或者swing包中的那些图形界面组件。
事件:每一个事件源都有自己特有的对应事件和共性事件。
监听器:将可以触发某一个事件的动作(不只一个动作)都已经封装到了监听器中。
以上三者,在java中都已经定义好了。
直接获取其对象来用就可以了。
我们要做的事情是,就是对产生的动作进行处理。
三.正则表达式
1)概念:
正则表达式指符合一定规则的表达式。
作用:用于专门操作字符串。
特点:用于一些特定的符号来表示一些代码操作。这样就简化书写。所以学习正则表达式,就是在学习一些特殊符号的使用。
好处:可以简化对字符串的复杂操作。
弊端:符号定义越多,正则越长,阅读性越差。
2)正则表达式的功能
i)匹配:String matches方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。
ii)切割:String split();
iii)替换:String replaceAll(regex,str);如果regex中有定义组,可以在第二参数中通过$符号获取正则表达式中的已有的组。
iv)获取:将字符串中的符合规则的子串取出。
3)操作步骤:
i),将正则表达式封装成对象。
ii),让正则对象和要操作的字符串相关联。
iii),关联后,获取正则匹配引擎。
iv),通过引擎对符合规则的子串进行操作,比如取出
4)正则表达式的相关应用
下面给出用正则表达式检验QQ号的方法与普通方法的比较:
普通做法:

/*    对QQ号码进行校验    要求:5~15  0不能开头,只能是数字    这种方式,使用了String类中的方法,进行组合完成了需求。但是代码过于复杂。    */    public static void checkQQ_1()    {        String qq = "1882345a0";        int len = qq.length();        if(len>=5 && len<=15){            if(!qq.startsWith("0"))//Integer.parseInt("12a");NumberFormatException                {                try                {                    long l = Long.parseLong(qq);                    System.out.println("qq:"+l);                }                catch (NumberFormatException e)                {                    System.out.println("出现非法字符.......");                }                char[] arr = qq.toCharArray();//123a4                boolean flag = true;                for(int x=0;x<arr.length; x++)                {                    if(!(arr[x]>='0' && arr[x]<='9'))                    {                        flag = false;                        break;                    }                }                if(flag)                {                    System.out.println("qq:"+qq);                }                else                {                    System.out.println("出现非法字符");                   }            }            else            {                System.out.println("不可以0开头");            }        }        else        {            System.out.println("长度错误");        }    }}

正则表达式做法

public static void checkQQ(){        String qq = "123a454";        String regex = "[1-9]\\d{4,14}";        boolean flag = qq.matches(regex);        if(flag)            System.out.println(qq+"...is ok");        else            System.out.println(qq+"... 不合法");    }
0 0
原创粉丝点击