基于socket实现java Swing简易聊天室[附完整源码]

简介: 基于socket实现java Swing简易聊天室[附完整源码]

一、程序设计方面的说明

程序分为三个类:

  • ChatFrame类
  • ChatClientAPP类
  • ChatServerAPP类

二、各个类介绍

1、ChatFrame类

package com.chat;
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class ChatFrame extends JFrame{
  private static final long serialVersionUID = -499796932332494480L;
  public JTextArea jta;
  public JScrollPane jsp;
  public JPanel jp;
  public JTextField jtf;
  public JButton jb;
  public String title;
  public ChatFrame(String title){
    this.title = title;
    jta = new JTextArea();
    jta.setEditable(false);
    jsp = new JScrollPane(jta);
    jp = new JPanel();
    jtf = new JTextField(10);
    jb = new JButton("发送");
    jp.add(jtf);
    jp.add(jb);
    this.add(jsp, BorderLayout.CENTER);
    this.add(jp, BorderLayout.SOUTH);
    this.setTitle(title);
    this.setSize(300, 300);
    this.setLocation(500, 300);
    this.setLocationRelativeTo(null);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);
  }
}

2、ChatClientAPP类

客户端类

package com.chat;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;
public class ChatClientAPP implements ActionListener, KeyListener {
  public static void main(String[] args) throws Exception {
    UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
    new ChatClientAPP(new ChatFrame("繁星聊天客户端"));
  }
  private BufferedWriter bh = null;
  private JTextField jtf;
  private JTextArea jta;
  public ChatClientAPP(ChatFrame chatFrame) {
    this.jtf = chatFrame.jtf;
    this.jta = chatFrame.jta;
    chatFrame.jb.addActionListener(this);
    jtf.addKeyListener(this);
    try {
      Socket Socket = new Socket("127.0.0.1", 8888);
      // InputStream in=Socket.getInputStream();
      BufferedReader br = new BufferedReader(new InputStreamReader(Socket.getInputStream()));
      bh = new BufferedWriter(new OutputStreamWriter(Socket.getOutputStream()));
      String line = null;
      Date sb = new Date();
      SimpleDateFormat sdf = new SimpleDateFormat();
      sdf.format(sb);
      jta.append("\t" + sdf.format(sb) + "\n");
      while ((line = br.readLine()) != null) {
        jta.append(line + System.lineSeparator());
      }
      Socket.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  @Override
  public void actionPerformed(ActionEvent e) {
    wdw();
  }
  // 定义一个方法
  private void wdw() {
    String text = jtf.getText();
    text = "客户端对服务端说:" + text;
    jta.append(text + System.lineSeparator());
    try {
      bh.write(text);
      bh.newLine();
      bh.flush();
      jtf.setText("");
    } catch (IOException e1) {
      e1.printStackTrace();
    }
  }
  @Override
  public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_ENTER) {
      wdw();
    }
  }
  @Override
  public void keyTyped(KeyEvent e) {
  }
  @Override
  public void keyReleased(KeyEvent e) {
  }
}

3、ChatClientAPP类

服务端类

package com.chat;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;
public class ChatServerAPP implements ActionListener, KeyListener {
  public static void main(String[] args) throws Exception {
    UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
    new ChatServerAPP(new ChatFrame("繁星聊天服务端"));
  }
  private JTextArea jta;
  private JTextField jtf;
  private BufferedWriter bh = null;
  public ChatServerAPP(ChatFrame chatFrame) {
    this.jtf = chatFrame.jtf;
    this.jta = chatFrame.jta;
    chatFrame.jb.addActionListener(this);
    jtf.addKeyListener(this);
    try {
      @SuppressWarnings("resource")
      ServerSocket ServerSocket = new ServerSocket(8888);
      Socket Socket = ServerSocket.accept();
      // InputStream in=Socket.getInputStream();
      BufferedReader br = new BufferedReader(new InputStreamReader(Socket.getInputStream()));
      bh = new BufferedWriter(new OutputStreamWriter(Socket.getOutputStream()));
      String line = null;
      Date sb = new Date();
      SimpleDateFormat sdf = new SimpleDateFormat();
      sdf.format(sb);
      jta.append("\t" + sdf.format(sb) + "\n");
      while ((line = br.readLine()) != null) {
        jta.append(line + System.lineSeparator());
      }
      Socket.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  @Override
  public void actionPerformed(ActionEvent e) {
    wdw();
  }
  // 定义一个方法
  private void wdw() {
    String text = jtf.getText();
    text = "服务端对客户端说:" + text;
    jta.append(text + System.lineSeparator());
    try {
      bh.write(text);
      bh.newLine();
      bh.flush();
      jtf.setText("");
    } catch (IOException e1) {
      e1.printStackTrace();
    }
  }
  @Override
  public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_ENTER) {
      wdw();
    }
  }
  @Override
  public void keyTyped(KeyEvent e) {
  }
  @Override
  public void keyReleased(KeyEvent e) {
  }
}


相关文章
|
7天前
|
运维 Java
Java版HIS系统 云HIS系统 云HIS源码 结构简洁、代码规范易阅读
云HIS系统分为两个大的系统,一个是基层卫生健康云综合管理系统,另一个是基层卫生健康云业务系统。基层卫生健康云综合管理系统由运营商、开发商和监管机构使用,用来进行运营管理、运维管理和综合监管。基层卫生健康云业务系统由基层医院使用,用来支撑医院各类业务运转。
31 5
|
2天前
|
搜索推荐 前端开发 Java
java医院绩效考核管理系统项目源码
系统需要和his系统进行对接,按照设定周期,从his系统获取医院科室和医生、护士、其他人员工作量,对没有录入信息化系统的工作量,绩效考核系统设有手工录入功能(可以批量导入),对获取的数据系统按照设定的公式进行汇算,且设置审核机制,可以退回修正,系统功能强大,完全模拟医院实际绩效核算过程,且每步核算都可以进行调整和参数设置,能适应医院多种绩效核算方式。
4 0
|
3天前
|
设计模式 算法 Java
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
|
3天前
|
设计模式 JavaScript Java
[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式
[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式
|
3天前
|
设计模式 存储 JavaScript
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式
|
3天前
|
设计模式 Java Go
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式
|
3天前
|
Java 调度
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
30 1
|
7天前
|
JavaScript Java 测试技术
基于Java的电影评论系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的电影评论系统的设计与实现(源码+lw+部署文档+讲解等)
27 0
|
7天前
|
JavaScript Java 测试技术
基于Java的在线日语培训平台的设计与实现(源码+lw+部署文档+讲解等)
基于Java的在线日语培训平台的设计与实现(源码+lw+部署文档+讲解等)
26 0
|
7天前
|
JavaScript Java 测试技术
基于Java的同城蔬菜配送管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的同城蔬菜配送管理系统的设计与实现(源码+lw+部署文档+讲解等)
11 0