黑马程序员——GUI 网络编程 正则

时间:2023-01-27 12:35:56

-----------android培训java培训、java学习型技术博客、期待与您交流!------------ 

一,GUI

GUIGraphicalUser Interface,即图形用户界面,用于计算机与用户交互的一种方式。

计算机与用户交互的两种方式:GUICL

java也将这种界面封装为对象,其中的对象都放在了两个包中:java.Awt包和javax.Swing包。


继承关系图

黑马程序员——GUI 网络编程 正则


布局管理器

1,布局:容器中的组件排列方式

2,常见的布局管理器:

        1FlowLayout:流式布局管理器。从左向右排列,是Panel默认的布局管理器

        2BorderLayout:边界式布局管理器,东南西北中的排列方式,是Frame的默认布局管理器。如果窗体中只有一个组件,将会覆盖整个窗体。

        3GridLayout:网格式布局管理器,规则的矩阵

        4CardLayout:卡片式布局管理器,即选项卡

        5GridBayLayout:网格包布局管理器,非规则矩阵



窗体创建过程


创建Frame窗体:

        Frame f = new Frame("my Frame");//可设置标题,即窗体名字

对窗体进行基本设置:如大小,位置,布局等:

        f.setSize(int wight,int hight);//窗体大小设置

        f.setLocation(int x,int y);//窗体显示位置设置,横纵坐标

        f.setBounds(int x,int y,int wight,int hight),也可以直接用这个方法对大小和位置设置

        f.setLayout(Layout layout),参数为指定的布局管理器,如FlowLayout

定义组件:

       如Button b = new Button(my Button);//可设置组件的名称

将组件通过窗体的add方法添加到窗体中:

        f.add(b);//将按钮组件添加进窗体

显示窗体:

        f.setVisible(boolean b);//通过设置参数是true还是false是否显示窗体


事件监听机制


步骤:

        1)确定事件源(容器或组件)。通过事件源对象的addXXXListener()方法将监听器注册到该事件源上。该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdapter的子类对象。

        2)一般用匿名内部类来表示。在覆盖方法的时候,方法的参数一般是XXXEvent类型的变量接收。事件触发后会把事件打包成对象传递给该变量。(其中包括事件源对象。通过getSource()或者,getComponent()获取。)


黑马程序员——GUI 网络编程 正则




示例:

frame.addWindowListener(new WindowAdapter()  
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});


菜单:Menu


先创建菜单条,再创建菜单,每一个菜单中建立菜单项。也可以菜单添加到菜单中,作为子菜单。通过Frame的setMenuBar()方法,将菜单添加到Frame中。


二,网络编程


网络通信三要素:IP地址,端口号,传输协议

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

端口号:

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

        b,有效端口:0 ~65535,系统使用或保留的端口是:0~ 1024

传输协议:

        即通信规则,包含TCPUDP协议

黑马程序员——GUI 网络编程 正则

UDP

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

协议特点:

         a、面向无连接,即将数据及源和目的封装成数据包中,不建立链接的发送

         b、每个数据包的大小限制在64K之内

         c、因无连接,是不可靠的协议

         d、不建立连接,速度快。

TCP

        是面向连接的,必须连接成功才能传输数据,应用于下载等程序上

协议特点:

         a、面向连接,在建立连接后,形成传输数据的通道

         b、在连接中进行大数据量的传输

         c、通过三次握手完成连接,是可靠的协议

         d、必须建立连接,效率稍慢

三次握手:第一次本方发送请求,第二次对方确认连接,第三次本方再次确认连接成功。


Socket

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


UDP传输

通过类DatagramSocket

方法:

        1)创建 UDPSocket发送服务对象:

              DatagramSocket(),不指定端口。DatagramSocket(int port),指定端口。

        2)发送:void send(DatagramPacket p)

        3)接收:void receive(DatagramPacket p)


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

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

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


示例:发送端
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
class UDPSend
{
public static void main(String[] args) throws Exception
{

DatagramSocket ds = new DatagramSocket(8000);//1,创建udp服务

//2,确定数据,并封装成数据包。DatagramPacket(byte[] buf, int length, InetAddress address, int port)

byte[] buf = "黑马程序员".getBytes();
DatagramPacket dp =
new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.254"),10000);


ds.send(dp);//3,通过socket服务,通过send方法将数据包发送出去。
ds.close();//4,关闭资源。

}
}


接收端:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
class UDPReceive
{
public static void main(String[] args) throws Exception
{

DatagramSocket ds = new DatagramSocket(10000);//1.创建udp socket,建立端点。
while(true)
{

byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);//2.定义数据包,用于存储数据。

ds.receive(dp);//3.阻塞式方法,通过服务的receive方法将收到数据存入数据包中。
//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);

}

}
}


TCP传输

1TCP分客户端和服务端。客户端对应的对象是Socket,服务端对应的对象是ServerSocket

方法:

        创建客户端对象:

              Socket():创建空参数的客户端对象,一般用于服务端接收数据

              Socket(String host,int port),指定要接收的IP地址和端口号

        创建服务端对象:ServerSocket(int port):指定接收的客户端的端口

        Socket accept():监听并接受到此套接字的连接

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

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

        InputStream getInputStream():返回此套接字的输入流,Socket对象调用

        OutputStream getOutputStream():返回套接字的输出流,Socket对象调用



示例:客户端


import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
class services {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket sk = new Socket("zero-pc",9555);//建立服务
FileInputStream fis = new FileInputStream("E:\\mytext.java");//读取文件
OutputStream out = sk.getOutputStream();//写入到网络输出流。
byte[] by = new byte[1024];
int lens=0;
while((lens=fis.read(by))!=-1)
{

out.write(by,0,lens);

}
sk.shutdownOutput(); // 相当于发送结束标记-1。
InputStream in = sk.getInputStream();//读取服务端信息
byte[] bu = new byte[1024];
int len =in.read(bu);//阻塞式方法。
System.out.println(new String(bu, 0, len));
fis.close();
sk.close();
}
}



服务端:

class service2 {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(9555);//建立服务
Socket s = ss.accept();//获取客户端对象
//读取网络输入流 并写入数据库。
String add = s.getInetAddress().getHostAddress();//获取地址
System.out.println(add+"已连接");
InputStream in =s.getInputStream();
FileOutputStream fos = new FileOutputStream("E:\\copy.java");
byte[] buf = new byte[1024];
int lens = 0;
while((lens= in.read(buf))!=-1)//阻塞方法 等待-1标记。
{

fos.write(buf, 0, lens);
}
OutputStream out = s.getOutputStream();//返回信息
out.write("上传成功".getBytes());
ss.close();//关闭资源。
s.close();
fos.close();
}
}


三,正则表达式

正则表达式:符合一定规则的表达式。

        作用:用于专门操作字符串。

        特点:用于一些特定的符号来表示一些代码操作,这样可以简化书写。所以学习正则表达式,就是在学习一些特殊符号的使用。

        好处:可以简化对字符串的复杂操作。

        弊端:符合定义越多,正则越长,阅读性越差。


常用符号:


[a-zA-Z]               a z A  Z,两头的字母包括在内(范围)

 \d                         数字: [0-9]

 \D                       非数字: [^0-9]

 \w                       单词字符:[a-zA-Z_0-9]

 \W                      非单词字符:[^\w]

 X*                       X,零次或多次

 X+                       X,一次或多次

X{n}                    X,恰好 n

 X{n,}                   X,至少 n

X{n,m}                X,至少 n次,但是不超过 m 



具体功能

主要有四种具体功能:匹配、切割、替换和获取

匹配:String类中的booleanmatches(String regex)方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false

切割:String类中的String[]split(String regex)方法。 

替换: String replaceAll(String regex,String replacement)方法。如果regex中有定义组(),可以在第二参数中通过$符号获取正则表达式中的已有的组。

获取:将字符串中的符合规则的子串取出。

操作步骤:

1,将正则表达式封装成对象。
2,让正则对象和要操作的字符串相关联。
3,关联后,获取正则匹配引擎。
4,通过引擎对符合规则的子串进行操作,比如取出。

获取示例:

import java.util.regex.*;
public class reges_demo {

public static void main(String[] args)
{

String str="gherh98-17-10sggsdg iuih 78-14-36grgrg";
String regex="\\d{2}-\\d{2}-\\d{2}";<span style="font-family: Arial, Helvetica, sans-serif;">//规则</span>
Pattern p=Pattern.compile(regex);//将规则封装成对象。
Matcher m=p.matcher(str);//获取匹配器对象
while(m.find())//匹配查找子串
{
System.out.println(m.group());//获取子串
}
}

}