创建专属聊天室练习(客户端与服务端通信|客户端界面交互)

一、知识回顾与补充

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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值