配色: 字号:
JAVA之旅(三十一,二)
2016-10-08 | 阅:  转:  |  分享 
  
JAVA之旅(三十一,二)

JAVA之旅(三十一)

一.GUI的概述



GUI全称叫做GraphicalUserIntergace(图形用户接口),用图形的方式,来显示计算机操作的界面,这样更加方便直观,与用户交互



说道交互,其实系统跟用户有两种交互,一种是GUI,一种叫做CLI,也就是命令行,全称叫做CommandUserIntergace,这个需要一些学习成本,倒是不怎么推荐,比如创建文件夹之类的,要是你用CLI那就有点麻烦了



回到JAVA,java中为GUI提供的对象都存在java.Awt和javax.Swing两个包中,这两个是什么意思呢?

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

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

我们来看看大致的组件



二.GUI布局



我们来学习这些控件之前,我们要学习他的布局,这些组件应该按照什么样的样式排放,这就是布局,常见的布局管理器有以下这几种

FlowLayout(流式布局管理器)

从左往右的顺序排列

Panel默认的布局管理器

BorderLayout(边界布局管理器)

东南西北中

Frame默认的布局管理器

GridLayout(网格布局管理器)

规则的矩阵

CardLayout(卡片布局管理器)

选项卡

GridBagLayout(网格包布局管理器)

非规矩的矩阵

三.Frame



我们来玩一下这个布局

packagecom.lgl.hello;



importjava.awt.Frame;



publicclassTest{

publicstaticvoidmain(String[]args){



Framef=newFrame("GUI");

//设置宽高

f.setSize(300,200);

//设置显示位置

f.setLocation(720,560);

//显示

f.setVisible(true);

}



}

运行的结果



紧接着,我们往里面放控件

packagecom.lgl.hello;



importjava.awt.Button;

importjava.awt.FlowLayout;

importjava.awt.Frame;



publicclassTest{

publicstaticvoidmain(String[]args){



//默认边界布局

Framef=newFrame("GUI");

//设置布局管理器

f.setLayout(newFlowLayout());

//设置宽高

f.setSize(300,200);

//设置显示位置

f.setLocation(720,560);



//按钮

Buttonb=newButton("Button");

f.add(b);



//显示

f.setVisible(true);

}



}

运行的结果



既然如此,我们就给他设置点击事件了

四.GUI事件监听机制



我们怎么去监听他的事件?我们先来看下流程图



1.事件源

2.事件

3.监听器

4.事件处理

我们就直接看代码了,我们先监听这个窗体右上角的关闭按钮

//窗体监听

f.addWindowListener(newWindowAdapter(){

@Override

publicvoidwindowClosing(WindowEvente){

//关闭窗口

System.exit(0);

}

});



五.Action事件



我们继续来看,我们先按传统的四位给写好布局

packagecom.lgl.hello;



importjava.awt.Button;

importjava.awt.FlowLayout;

importjava.awt.Frame;

importjava.awt.event.WindowAdapter;

importjava.awt.event.WindowEvent;



publicclassTest{



publicstaticvoidmain(String[]args){



newTest1();

}

}



classTest1{



//定义组件

privateFramef;

privateButtonb;



//构造方法

publicTest1(){

init();

}



//初始化

privatevoidinit(){

//初始化坐标

f=newFrame("MyGUI");

//设置坐标

f.setBounds(300,100,600,500);

//设置布局

f.setLayout(newFlowLayout());

//初始化按钮

b=newButton("Button");

//添加到布局

f.add(b);

//显示之前加载一下

myEvent();

//显示

f.setVisible(true);

}



//监听器

privatevoidmyEvent(){

f.addWindowListener(newWindowAdapter(){

@Override

publicvoidwindowClosing(WindowEvente){

System.exit(0);

}

});



//添加按钮事件





}

}



仔细看代码,我们现在才是添加按钮事件

//添加按钮事件

b.addActionListener(newActionListener(){



@Override

publicvoidactionPerformed(ActionEvente){

System.out.println("点击事件");

}

});



这样按钮也就具备了点击事件

六.鼠标事件



什么都有事件,那这样我们来监听一下鼠标的事件

//鼠标事件

b.addMouseListener(newMouseAdapter(){

@Override

publicvoidmouseEntered(MouseEvente){

System.out.println("鼠标进入了");

}



@Override

publicvoidmouseExited(MouseEvente){

System.out.println("鼠标出去了");

}

});



十分的简单是吧,那相对的,还有一个键盘事件,提示框什么的,我们这个篇幅就到这里了,下篇文章我们再详细的介绍!

JAVA之旅(三十二)

一.JAVA网络请求概述



关于JAVA的网络请求,我们大致的可以分为以下几个分类

网络模式

OSI

TCP/IP

网络通讯

IP地址

端口号

传输协议

拿这些都是干嘛的呢?我们接下来都会讲到



首先我们应该思考的是他们通信的一个过程的步骤

1.找到对方IP

2.数据发送到指定应用程序上,为了识别,就有了端口的概念

3.定义通信协议(也就是后来的传输协议)国际协议/TCP/IP

4.三要素:IP,端口,协议

OK,那我们就研究下网络模型,OSI和TCP/IP的区别

其实理解起来也不难,我们看一下他的逻辑结构就知道了

OSI



应用层

表示层

会话层

传输层

网络层

数据链路层

物理层

TCP/IP



应用层

传输层

网络层

主机-网络层

应用层,我们就在这里玩,TCP封装了就比较好用,他们都有使用规则,而我们常用的大概就是HTTP协议了

二.IP地址



通讯要素大致的就是这些,我们来说一下我们耳熟能详的IP地址,他是什么概念呢?

IP地址



网络中设备的标识

可用主机名

本地回环地址:127.0.0.1,主机名:location

端口号



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

有效端口:0-65535,其中0-1024系统使用或者保留,我们熟知的8080

通讯协议



通讯的规则

常见的TCP,UDP

我们可用用代码获得哦,先看API文档,会发现JAVA给我们提供了一个类InetAddress



我们可用直接去用代码使用

try{

InetAddresslocalHost=InetAddress.getLocalHost();

System.out.println(localHost.toString());

}catch(UnknownHostExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}



可以得到



得到的本机的主机名和IP地址

当然,你要单独获取也是没问题的

try{

InetAddresslocalHost=InetAddress.getLocalHost();

StringhostAddress=localHost.getHostAddress();

StringhostName=localHost.getHostName();

System.out.println(localHost.toString());

}catch(UnknownHostExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}



三.TCP/UDP通讯协议概述



端口我们没什么可说的,我们直接说通讯协议,目前常见的就是TCP/UDP了,我们先来简单的说下他们的概念

TCP



建立连接,形成传输数据的通道

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

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

必须建立连接,效率稍微低点

UDP



将数据及源和目的封装在数据包中,不需要建立连接

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

因无连接,是不可靠协议

不需要建立连接,速度快

这些这么多,java肯定会给我们封装对象的,这个是毋庸置疑的,那我们接着往下看

四.Socket



Socket就厉害了,我们先来看看他的概念

Socket就是为网络服务提供的一种机制

通信的两端都有socket

网络通信其实就是socket通信

数据在两个socket通过IO传输

我们现在先说概念,后期再实战

五.UDP传输



UDP传输的socket服务该怎么建立?

DatagramSocket和DatagramPacket

建立发送端和接收端

建立数据包

调用socket的发送和接收方法

关闭socket

客户端和服务端是两个单独的服务,我们可用来用代码讲解下,用到的就是DatagramSocket和DatagramPacket



所以这里应该是有两个,一个传输端,一个接收端

传输端





/

需求:通过UDP传输方式将一段文字数据发送出去

思路:

1.建立UDP的socket服务

2.建立数据包

3.发送数据

4.关闭资源



@authorLGL



/

publicclassUdpSend{

publicstaticvoidmain(String[]args){

try{

//1.建立UDP的socket服务,通过DatagramSocket对象

DatagramSocketdSocket=newDatagramSocket();

//2.确定数据,封装成数据包

byte[]data="udp".getwww.shanxiwang.netBytes();

DatagramPacketdp=newDatagramPacket(data,data.length,

InetAddress.getByName("192.168.1.102"),8080);

//3.发送数据

dSocket.send(dp);

//4.关闭资源

dSocket.close();

}catch(SocketExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}catch(UnknownHostExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}catch(IOExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}

}

}

接收端



/

需求:接收指定端口发送过来的数据

思路:

1.定义socket服务

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

3.通过socket的receive方法收到的数据存储到数据包中

4.将这些不同的数据取出,打印

5.关闭资源



@authorLGL



/

classUdpRece{

publicstaticvoidmain(String[]args){

try{

//1.创建服务,建立端点

DatagramSocketdSocket=newDatagramSocket(8080);

//2.定义数据包,存储数据

byte[]buf=newbyte[1024];

DatagramPacketdp=newDatagramPacket(buf,buf.length);

//3.存储

dSocket.receive(dp);

//4.获取其中的数据

Stringip=dp.getAddress().getHostAddress();

Stringdata=newString(dp.getData(),0,dp.getLength());

intport=dp.getPort();

System.out.println(ip+":"+data+":"+port);

//5.关闭资源

dSocket.close();

}catch(SocketExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}catch(IOExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}

}

}

这样就可以通信了

六.多线程UDP聊天应用



既然上面有模有样的写出来了,那我们可以动手写一个应用了,我们继续来看,我不开多个进程,我写一个进程,两个线程来实现聊天

packagecom.lgl.hellojava;



importjava.io.BufferedReader;

importjava.io.IOException;

importjava.io.InputStreamReader;

importjava.net.DatagramPacket;

importjava.net.DatagramSocket;

importjava.net.InetAddress;

importjava.net.SocketException;



/

编写一个聊天应用程序有收数据和发数据的部分,所以用到多线程的技术,一个接一个发收和发的动作不一致,所以有两个Runnable



@authorLGL



/

publicclassUdpSpeak{



publicstaticvoidmain(String[]args){



try{

DatagramSocketsendSocket=newDatagramSocket();

DatagramSocketreceSocket=newDatagramSocket(10000);



newThread(newsend(sendSocket)).start();

newThread(newrece(receSocket)).start();



}catch(SocketExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}

}

}



/

发送



@authorLGL



/

classsendimplementsRunnable{



privateDatagramSocketsocket;



publicsend(DatagramSocketsocket){

this.socket=socket;

}



@Override

publicvoidrun(){

try{

BufferedReaderbufr=newBufferedReader(newInputStreamReader(

System.in));

Stringline=null;

while((line=bufr.readLine())!=null){

if("close".equals(line)){

break;

}

byte[]buf=line.getBytes();

DatagramPacketdp=newDatagramPacket(buf,buf.length,

InetAddress.getByName("192.168.1.102"),10000);

socket.send(dp);

}

}catch(IOExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}

}



}



/

接收



@authorLGL



/

classreceimplementsRunnable{



privateDatagramSocketsocket;



publicrece(DatagramSocketsocket){

this.socket=socket;

}



@Override

publicvoidrun(){

while(true){

try{

byte[]buf=newbyte[1024];

DatagramPacketdp=newDatagramPacket(buf,buf.length);

socket.receive(dp);



Stringip=dp.getAddress().getHostAddress();

Stringdata=newString(dp.getData(),0,dp.getLength());

intport=dp.getPort();

System.out.println(ip+":"+data+":"+port);



}catch(IOExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}

}

}



}

OK,搞定,其实主要还是要了解他的思想,编码什么的不重要的

献花(0)
+1
(本文系网络学习天...首藏)