JAVA之旅三十一二.docx
- 文档编号:5627083
- 上传时间:2022-12-29
- 格式:DOCX
- 页数:16
- 大小:138.54KB
JAVA之旅三十一二.docx
《JAVA之旅三十一二.docx》由会员分享,可在线阅读,更多相关《JAVA之旅三十一二.docx(16页珍藏版)》请在冰豆网上搜索。
JAVA之旅三十一二
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"Bytes();
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;
import.DatagramPacket;
import.DatagramSocket;
import.InetAddress;
import.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,搞定,其实主要还是要了解他的思想,编码什么的不重要的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 三十 一二