一、知识回顾与补充
package frame;
import javax.swing.*;
//只是发现以后所有的框都是按照刚才那套流程画出来的
//只不过具体的组件,位置,布局都不一样,但是需要做的事情抽象来看都是一样的
//设计一个抽象的规则
//模板方法模式 23个设计模式当中的一个
//还有一种是:缺省适配器模式 MyFrame(接口 10个) baseFrame(挑一些不重要的实现掉{} 子类去实现一些必要的方法)
public abstract class BaseFrame extends JFrame {
public BaseFrame(String title){
super(title);
}
protected abstract void setOther();
protected abstract void addElements();
protected abstract void setSelf();
}
package frame;
import javax.swing.*;
import java.awt.*;
//简单梳理一下关于Swing的技术
//GUI 图形用户接口(规则) Client/Server
//GUI下面有两个接口:AWT Swing。 可以做但很少用来基于Browser/Server HTML <html></html>
//想要利用Swing技术来实现一个窗口的绘制
//里面有JFrame窗体 可看成类似于<body>
//还有JPanel面板 可看成类似于<div><span> 无色透明的容器 做布局管理
//各种组件 按钮 文本框 文本域 理解为HTMl中那些<input type="button">
//JButton按钮 JTextField
//最终肯定是需要有功能 事件-方法 HTML(布局)+CSS(样式)+JS(事件) Tomcat
//事件背后才是我们真正需要实现的强大逻辑/功能
//============================================================
//需要自己描述一个类
//可能需要描述属性,方法
//类与类的关系
//继承 泛化(实现) A is a B
// 聚合 组合 A has-a B
// 包含 依赖 A use-a B
public class QQFrame extends BaseFrame{//是一个窗口 类和类之间的关系 A is-a B 继承
//1.需要一个窗体/窗口
private JFrame frame=new JFrame("聊天框");//GC 边界管理
//2.需要一个无色透明的容器--面板
private JPanel panel=new JPanel();// 流式管理 可以有多个
//3.需要一些聊天窗口的组件
//这是两个带滚动条的文本域
private JTextArea messArea=new JTextArea();
private JScrollPane messPane=new JScrollPane(messArea);//滚动条范围大,里面是包着文本域的
private JTextArea sendArea=new JTextArea();
private JScrollPane sendPand=new JScrollPane(sendArea);
//两个按钮
private JButton sendButton=new JButton("发送");
private JButton cancelButton=new JButton("取消");
//构造方法 里面可以放这三个方法,或者这三个方法可以放在代码块,让它在构造方法之前加载
public QQFrame(String title){
super(title);
//2.调用里面的方法
this.setOther();
this.addElements();
this.setSelf();
}
//设计一个方法 做一些设置 布局 字体。。
@Override
protected void setOther(){
//4.为了让布局更好的好看一点,我们采用一个自动布局的方式
// 自定义布局需要将原有的布局清空
panel.setLayout(null);
//所有的组件按照自己的设计位置放置
messPane.setBounds(10, 10, 320, 220);
sendPand.setBounds(10, 240, 320, 140);
sendButton.setBounds(180, 390, 60, 30);
cancelButton.setBounds(260, 390, 60, 30);
//设置上面接收框的信息不能更改
messArea.setEnabled(false);
//设置文本域中字体的效果
messArea.setFont(new Font("宋体", Font.BOLD,18));
sendArea.setFont(new Font("宋体", Font.BOLD,18));
}
//设计一个方法 做一些组件之间的相互添加
@Override
protected void addElements(){
//5.将这些组件放在panel里,panel放在frame里
panel.add(messPane);
panel.add(sendPand);
panel.add(sendButton);
panel.add(cancelButton);
this.add(panel);
}
//设计一个方法 用来做窗体自己的一些设置 初始位置 不可拖拽
@Override
protected void setSelf(){
//需要在创建出来的同时,设置一下窗口的展示
this.setBounds(500, 200, 350, 480);
//可以设置窗口不可以拖拽改变大小
this.setResizable(false);
//设置点击右上角关闭按钮的同时,让程序结束
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// private static final int xxx=3;
//其实窗口已经创建出来了,默认效果是隐藏的
//需要设置那个窗口的状态 隐藏--->显示
//面向对象 窗口的状态-----对象的属性
// 设置状态----事情----方法 setXXXX
this.setVisible(true);
}
}
package frame;
public class Test {
public static void main(String[] args) {
//1.创建一个QQFrame窗口对象
new QQFrame("聊天框");//无参数构造方法
}
}
二、客户端与服务器通信
package client;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class TestClient {
public static void main(String[] args) {
try {
System.out.println("我是客户端");
//1.主动访问服务端,访问成功后,即连接成功,获取一个socket对象
Socket socket=new Socket("127.0.0.1",9999);//服务器地址(IP) 服务器开放的端口号(port)
System.out.println("我成功连接到服务器啦?");
//======================================
Scanner input=new Scanner(Sys