java基础——GUI、网络编程
来源:互联网 发布:中国迁都 知乎 编辑:程序博客网 时间:2024/04/27 23:16
GUI
GUI:图形用户界面
用图形的方式,来显示计算机操作的界面,这样更方便,更直观
java为GUI提供的对象都存在java.awt和javaX.swing两个包中
Awt和Swing
1、java.awt:抽象窗口工具包,需要调用本地系统方法实现功能,属于重量级控件(与系统的耦合性强)
2、javaX.swing:在awt基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由java实现,增强了移植性,属于轻量机控件
建立一个简单的窗体
//1,创建一个窗体。Frame Frame f = new Frame("my frame"); //2, 对窗体进行基本设置。 f.setSize(500, 400); f.setLocation(400, 200); //设置布局。 f.setLayout(new FlowLayout()); //给窗体添加组件。 Button but = new Button("my button"); //加入一个文本框组件。 TextField tf = new TextField(40); //将组件添加到窗体中。 f.add(tf); f.add(but);
事件监听机制
组成部分:
事件源(组件)
事件(Event)
监听器(Listener)
事件处理(引发事件后处理方式)
练习: /* * 需求:想要点击按钮有效果,比如打印一句话。 * 思路: * 1,确定事件源。按钮。 * 2,确定监听器。按钮添加监听器,按钮对象最清楚。到按钮对象中查找。 * 3,定义处理方式。 * * 定义的规范:XXXLinstener:XXX监听器。 --对应的XXXEvent事件。 */ //1,在按钮上添加所需的监听器。 but.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) {// System.out.println("按钮被触发了....."+e);// System.exit(0); /* for (int i = 0; i < 4; i++) { for (int j = 0; j < 5; j++) { System.out.print("*"); } System.out.println(); }*/ } }); /* * 需求:想要实现点击窗体X就可以实现窗体的关闭。 * 思路: * 1,事件源:窗体。 * 2,监听器。通过窗口对象去查。 * 3,事件处理。 * * 到底哪些监听接口有适配器类? * 只要监听接口的中的方法在2个以内,都没有适配器类。适配器的出现只为方便创建监听器对象。 * 但是一般监听接口都有适配器。 * */ f.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.out.println("window closing"); System.exit(0); } @Override public void windowOpened(WindowEvent e) { System.out.println("孔雀开屏!window open"); } }); /* * 演示鼠标监听。 * * 按钮事件源。 * 鼠标监听器注册到按钮上。 * * * 组件.addXXXListener(new XXXAdapter() * { * public void methodName(XXXEvent e){} * })); * */ but.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { /* * 想要对鼠标双击进行处理。应该找鼠标事件对象。因为事件对象一产生,内部必然封装事件源以及事件相关内容。 * 要查MouseEvent对象。 */ if(e.getClickCount() == 2){ System.out.println("mouse double click"); } } }); /* * 需求:文本框中只能输入数字。 * 事件源:文本框。 * 文本框注册键盘监听。 * 事件处理 */ tf.addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { //1,如何获取录入的内容。通过键盘事件对象获取。// char key = e.getKeyChar();// int code = e.getKeyCode();// System.out.println(code+"...."+KeyEvent.getKeyText(code));// int code = e.getKeyCode();// if(!(code>=KeyEvent.VK_0 && code<=KeyEvent.VK_9)){// System.out.println("必须是0-9数字");// e.consume();//直接取消默认处理方式。// } if(e.isControlDown() && e.getKeyCode()==KeyEvent.VK_ENTER){ System.out.println("ctrl+enter run"); } } }); //3,让窗体显示。 f.setVisible(true); System.out.println("over"); }
小结:
确定事件源(容器或组件)
通过事件源对象的addXXXListener()方法将侦听器注册到该事件源上。
该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdapter的子类对象。
一般用匿名内部类来表示。
在覆盖方法的时候,方法的参数一般是XXXEvent类型的变量接收。
事件触发后会把事件打包成对象传递给该变量。(其中包括事件源对象。通过getSource()或者,getComponent()获取。
网络编程
网络模型
OSI(开放系统互联参考模型)
TCP/IP参考模型
网络通讯的要素:IP地址、端口号、传输协议
UDP
将数据及源和目的封装成数据包,不需要建立连接,每个数据包大小限制在64K内,因为无连接,是不可靠协议,不需建立连接,速度快。
简记:面向无连接,不可靠,速度快,将数据封装成包传输,最大64K
TCP
建立连接,形成传输数据的通道,在连接中进行大数据传输,通过三次握手完成连接,是可靠协议,必须建立连接,效率稍低
简记:面向连接,安全可靠,效率稍低,通过三次握手确保连接 的建立,
Socket
端口,就是为网络服务提供的一种机制
通信的两端都有Socket
网络通信其实就是Socket间的通信
数据在两个Socket间通过IO流传输
UDP传输
DatagramSocket和DatagramPacket
建立发送端,接收端
建立数据包
调用Socket的发送接收方法
关闭Socket
发送端与接收端是两个独立的运行程序
在发送端,要在数据包对象中明确目的地IP及端口
/* * 案例一:通过udp实现群聊程序。 * 思路: 这个程序中既有收又有发,需要同时执行,需要使用多线程技术。 * 一个线程负责发,一个线程负责收。需要两个任务。 */public static void main(String[] args) throws IOException { //发送端的socket 接收端的socket DatagramSocket sendSocket = new DatagramSocket(); DatagramSocket receSocket = new DatagramSocket(10002); //创建任务对象。 Send send = new Send(sendSocket); Rece rece = new Rece(receSocket); //创建线程并开启。 Thread t1 = new Thread(send); Thread t2 = new Thread(rece); t1.start(); t2.start(); }}// 发送任务class Send implements Runnable { private DatagramSocket ds; public Send(DatagramSocket ds) { super(); this.ds = ds; } @Override 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.223"), 10002); ds.send(dp); if ("886".equals(line)) { break; } } // 4,关闭资源。 ds.close(); } catch (IOException e) { } }}// 接收任务。class Rece implements Runnable { private DatagramSocket ds; public Rece(DatagramSocket ds) { super(); this.ds = ds; } @Override public void run() { while (true) { try { byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf, buf.length); ds.receive(dp);// 阻塞 String ip = dp.getAddress().getHostAddress(); int port = dp.getPort(); String text = new String(dp.getData(), 0, dp.getLength()); System.out.println(ip + ":" + port + ":" + text); if(text.equals("886")){ System.out.println(ip+"....离开聊天室"); } } catch (IOException e) { } } }
IP
ip地址对象。InetAddress
获取本地主机地址对象。
InetAddress ip = InetAddress.getLocalHost();
获取其他主机的地址对象。
InetAddress ip = InetAddress.getByName(“www.sina.com.cn”);
TCP传输=====需求:通过TCP传输将数据发送给服务器基本思路客户端:1、客户端需要明确服务器的IP地址以及端口,这样才可以去试着建立连接,如果连接失败,会出现异常2、连接成功,说明客户端与服务端建立了通道,那么通过IO流,就可以进行数据的传输,而Socket对象已经提供了输入流和输出流对象,通过getInputStream();getOutputStream();获取即可3、与服务端通讯结束后,关闭Socket服务端:1、服务端需要明确它要处理的数据时从哪个端口进入的2、当有客户端访问时,要明确哪个客户端可通过accept()获取已连接的客户端对象,并通过该对象与客户端通过IO流进行数据传输3、当客户端访问结束,并关闭该客户端 案例二:实现客户端和服务端的收发过程。
public static void main(String[] args) throws UnknownHostException, IOException {
// 创建客户端socket对象。明确服务端地址和端口。
Socket s = new Socket(“192.168.1.223”, 10004);
// 发送数据,通过socket输出流完成。
OutputStream out = s.getOutputStream();
out.write(“服务端,我来了”.getBytes());
// 读取服务端返回的数据,通过socket输入流
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
String text = new String(buf,0,len);
System.out.println(text);
// 关闭资源。
s.close();
}
}
public static void main(String[] args) throws IOException {
System.out.println(“服务端开启…..”);
* 需求:获取客户端的数据并显示在屏幕上。 思路: 1,创建服务端的socket。明确端口,监听一个端口。 * 2,服务端只要获取到连接过来的客户端就可以和指定的客户端通信了。 3,通过获取客户端的读取流对象读取客户端发来的数据。 4,并显示屏幕上。 // 1,创建服务端的socket。明确端口,监听一个端口。 ServerSocket ss = new ServerSocket(10003); while (true) { // 2,服务端只要获取到连接过来的客户端就可以和指定的客户端通信了。 Socket s = ss.accept(); String ip = s.getInetAddress().getHostAddress(); System.out.println(ip + ".....connected"); // 3,通过获取客户端的读取流对象读取客户端发来的数据。 InputStream in = s.getInputStream(); // 4,并显示屏幕上。 byte[] buf = new byte[1024]; int len = in.read(buf); String text = new String(buf, 0, len); System.out.println(text); // 5,关闭资源。 s.close(); } // ss.close();}
}
“`
TCP传输最容易出现的问题
1、客户端连接上服务端,两端都在等待,没有任何数据传输
2、通过例程分析:
因为read方法或readline方法是阻塞式的
3、解决办法
自定义结束标记
使用shutdowmInput、shutdowmOutput方法
最常见的客户端和服务端
客户端:浏览器
服务端:Tomcat
访问方式:
浏览器中输入 http://192.168.1.2239(IP):8000/自己的应用程序名/具体资源名
URL:
用于解析URL地址
URLConnection:获取URL的连接
HTTP1.0和HTTP1.1的区别
HTTP1.0:一次连接一次请求
HTTP1.1:一次连接多次请求
常见的网络架构
C/S:Client/Server
特点:
1、程序员需要开发客户端和服务端
2、维护较为麻烦
3、将一部分运算转移到客户端来完成,减轻服务器端压力
B/S:browser/Server
特点:
1、程序员只需开发服务端,客户端使用系统已有的浏览器即可
2、维护很简单,只需要维护服务端
3、所有的运算都在服务端
目前常用的的B/S网络架构
- java基础——GUI、网络编程
- 黑马程序员——Java基础---GUI,网络编程
- 黑马程序员--Java基础--GUI、网络编程
- JAVA基础——GUI编程
- Java基础—GUI
- Java基础—网络编程
- 黑马程序员——Java GUI和网络编程
- Java基础笔记五GUI和网络编程
- 黑马程序员----Java基础之Gui与网络编程
- 黑马程序员——java编程GUI基础总结
- Java基础——GUI编程和Applet
- 黑马程序员-Java基础总结12——GUI编程
- 黑马程序员——高新技术---Java基础-GUI编程
- 黑马程序员—java基础—GUI图形用户界面编程
- Java基础学习总结(23)——GUI编程
- java基础学习总结——GUI编程(二)
- java基础学习总结——GUI编程(一)
- java基础学习总结——GUI编程(一)
- ABAP中常见的接口技术类型
- servlet, spring, filter, listener加载顺序
- JAVA版CRC校验
- 邢台怎样治自闭症
- 第三章第40题
- java基础——GUI、网络编程
- 外贸英文网站优化那些事儿
- 邢台怎么治疗自闭症
- Android NDK学习 <五> C++ 支持
- 邢台怎么治自闭症
- 邢台小儿自闭症yiyuan
- 邢台小儿自闭症哪家yiyuan好
- Google now终于搞定了,附带教程
- iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用