热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

java实现简单聊天软件

这篇文章主要为大家详细介绍了java实现简单的聊天软件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文为大家分享了java实现简单聊天软件的具体代码,供大家参考,具体内容如下

介绍

这是我自己学习Socket时写的,用到了多线程,Socket的知识,还有Java的IO技术,并且做了一个Java的UI,废话不多说,先上效果图

SendThread

这个类是用来实现数据的发送的,当按键按下时,会调用sendMessage方法

public class SendThread {

 ChatWindow chatWindow;
 private String remoteIP = "";
 private int port = 0;
 private String message = "";

 public SendThread(int port,ChatWindow window) {
  chatWindow = window;
 }

 public void notRun() {
  InetSocketAddress isa = new InetSocketAddress(remoteIP, port);
  try {
   Socket socket = new Socket();
   socket.connect(isa);
   OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream());
   writer.write(message);
   writer.flush();
   writer.close();
   System.out.println("将数据写入到流中");
  } catch (IOException e) {
   e.printStackTrace();
  }finally{
   message = "";
  }
 }

 public void senMessage(String host,int port,String message){
  remoteIP = host;
  this.port = port;
  this.message = message;
  notRun();
 }

}

ReceiveThread

这个类实现的功能是维护一个阻塞线程,来对端口进行监听,接受收到的信息,每当收到信息时,都会显示。

public class ReceiveThread extends Thread {

 private ServerSocket server;
 private ChatWindow window;

 public ReceiveThread(ChatWindow window) {
  this.window = window;
  try {
   server = new ServerSocket(0);
   window.setLocalPort(server.getLocalPort());
   start();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   window.printError("连接出错");
  }
 }

 @Override
 public void run() {
  // TODO Auto-generated method stub
  while(true){
   Socket socket;
   try {
    socket = server.accept();
    InputStreamReader reader = new InputStreamReader(socket.getInputStream());
    int c;
    StringBuilder sb = new StringBuilder();
    while((c = reader.read()) != -1){
     sb.append((char)c);
    }
    window.setReceive(sb.toString());
   } catch (IOException e) {
    // TODO Auto-generated catch block
    System.out.println("线程将接受到的数据写入对话框出错");
   }
  }
 }
}

ChatWindow

这个类是UI的实现,通过绑定各个按钮的操作来实现别的功能

public class ChatWindow extends JFrame {

 private JButton sendButton;
 private JButton cancelButton;
 private JButton receiveButton;
 private JTextArea receiveText;
 private JTextField sendText;

 private JLabel localPort;

 private JTextField remoteAddress;
 private JTextField remotePort;
 private SendThread sendThread;
 private ReceiveThread receiveThread;

 private void GUIini(){
  Container c = this.getContentPane();
  c.setLayout(new BorderLayout());
  setSize(400, 500);

  //第一个panel
  JPanel panel1 = new JPanel(new GridLayout(4, 2));
//  JPanel panel1 = new JPanel(new (4, 2));
  panel1.setSize(400, 75);
  panel1.add(new JLabel("当前机器的IP地址是:"));
  try {
   panel1.add(new JLabel(InetAddress.getLocalHost().getHostAddress()));
  } catch (UnknownHostException e) {
   // TODO Auto-generated catch block
   panel1.add(new JLabel("当前机器的IP地址是:" + "Unknown"));
  }
  panel1.add(new JLabel("当前对话的端口是:"));
  panel1.add(localPort = new JLabel(""+0));
  panel1.add(new JLabel("Remote Host IP Address:"));
  remoteAddress = new JTextField();
  remoteAddress.setColumns(0);
  panel1.add(remoteAddress);
  panel1.add(new JLabel("Remote Host Port:"));
  remotePort = new JTextField();
  remotePort.setColumns(0);
  panel1.add(remotePort);
  c.add(panel1,BorderLayout.NORTH);


  //第二个panel
  JPanel panel2 = new JPanel(new FlowLayout(FlowLayout.LEADING));
  panel2.setSize(400,200);
  panel2.add(new JLabel("收到的内容"));
  receiveText = new JTextArea(15,30);
  receiveText.setEditable(false);
  receiveText.setAutoscrolls(true);
  JScrollPane jsp = new JScrollPane(receiveText);
  panel2.add(jsp);
  //第三个panel
//  JPanel panel3 = new JPanel(new GridLayout(2, 1));
  panel2.add(new JLabel("请输入发送的内容"));
  sendText = new JTextField(30);
  sendText.setAutoscrolls(true);
  panel2.add(sendText);
  c.add(panel2,BorderLayout.CENTER);
  //c.add(panel3);
  //第四个panel
  JPanel panel4 = new JPanel(new GridLayout(1, 0));
  panel4.setSize(400,20);
  receiveButton = new JButton("开始接受数据");
  sendButton = new JButton("发送");
  cancelButton = new JButton("取消");
  panel4.add(receiveButton);
  panel4.add(cancelButton);
  panel4.add(sendButton);
  c.add(panel4,BorderLayout.SOUTH);
  //四个面板内容设置完毕

  setVisible(true);
  setResizable(false);
  setDefaultCloseOperation(EXIT_ON_CLOSE);
 }

 private void ActionIni() {

  //键盘动作
  this.addKeyListener(new KeyListener() {

   @Override
   public void keyTyped(KeyEvent e) {

   }

   @Override
   public void keyReleased(KeyEvent e) {
    // TODO Auto-generated method stub
    if(e.getKeyCode() == KeyEvent.VK_ENTER){
     //发送文本
     sendThread.senMessage(remoteAddress.getText(), Integer.parseInt(remotePort.getText()), sendText.getText());
     receiveText.setText(receiveText.getText() + "\n" + "发送:" + sendText.getText());
    }
   }

   @Override
   public void keyPressed(KeyEvent e) {
    // TODO Auto-generated method stub

   }
  });
  //取消按钮的动作
  cancelButton.addMouseListener(new MouseListener() {

   @Override
   public void mouseReleased(MouseEvent e) {
    // TODO Auto-generated method stub
    sendText.setText("");
   }

   @Override
   public void mousePressed(MouseEvent e) {
    // TODO Auto-generated method stub

   }

   @Override
   public void mouseExited(MouseEvent e) {
    // TODO Auto-generated method stub

   }

   @Override
   public void mouseEntered(MouseEvent e) {
    // TODO Auto-generated method stub

   }

   @Override
   public void mouseClicked(MouseEvent e) {
    // TODO Auto-generated method stub

   }
  });
  sendButton.addMouseListener(new MouseListener() {

   @Override
   public void mouseReleased(MouseEvent e) {
    //发送文本
    sendThread.senMessage(remoteAddress.getText(), Integer.parseInt(remotePort.getText()), sendText.getText());
    receiveText.setText(receiveText.getText() + "发送:" + sendText.getText()+ "\n");
   }

   @Override
   public void mousePressed(MouseEvent e) {
    // TODO Auto-generated method stub

   }

   @Override
   public void mouseExited(MouseEvent e) {
    // TODO Auto-generated method stub

   }

   @Override
   public void mouseEntered(MouseEvent e) {
    // TODO Auto-generated method stub

   }

   @Override
   public void mouseClicked(MouseEvent e) {
    // TODO Auto-generated method stub

   }
  });
 }

 private void ThreadIni() {
  // TODO Auto-generated method stub
  sendThread = new SendThread(0, this);
  receiveThread = new ReceiveThread(this);
 }
 //构造函数
 public ChatWindow() {
  GUIini();
  ActionIni();
  ThreadIni();
 }

 public void printError(String err){
  System.out.println("Error occur:" + err);
 }

 //回调函数,用于接受从线程中返回的数据
 public void setReceive(String receive){
  receiveText.setText(receiveText.getText() + "收到:" + receive+ "\n" );
 }

 //当接受数据的线程开始工作以后,就调用该回调函数,设置当前聊天窗口使用的端口是哪个
 public void setLocalPort(int localPortText){
  localPort.setText(""+localPortText);
 }

 //放远,这个是整个程序的起点
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  new ChatWindow();
 }

}

如何使用

将工程导入到Eclipse中以后,运行两次,因为这个程序不属于单例模式,所以可以出现两个窗口,在远程端口,远程地址那个输入框中分别输入另一个窗口中显示的IP和端口号,接下来在输入框中输入要发送的文字就可以了

源码下载:java实现简单聊天软件

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 本文探讨了在Java中实现系统托盘最小化的两种方法:使用SWT库和JDK6自带的功能。通过这两种方式,开发者可以创建跨平台的应用程序,使窗口能够最小化到系统托盘,并提供丰富的交互功能。 ... [详细]
  • 本文总结了Java程序设计第一周的学习内容,涵盖语言基础、编译解释过程及基本数据类型等核心知识点。 ... [详细]
  • 深入理解ExtJS:从入门到精通
    本文详细介绍了ExtJS的功能及其在大型企业前端开发中的应用。通过实例和详细的文件结构解析,帮助初学者快速掌握ExtJS的核心概念,并提供实用技巧和最佳实践。 ... [详细]
  • 本文详细介绍了如何在Python3环境中配置Appium1.4.6,并指导如何连接模拟器进行自动化测试。通过本文,您将了解从环境搭建到模拟器连接的完整流程。 ... [详细]
  • Eclipse 中 JSP 开发环境配置指南
    本文详细介绍了如何在 Eclipse 集成开发环境中配置 JSP 运行环境,包括必要的软件下载、Tomcat 服务器的配置以及常见问题的解决方法。 ... [详细]
  • 初探Java编程:从入门到实践
    本文旨在为初学者提供Java编程的基础知识,涵盖程序、算法、流程图的概念,以及JDK环境的配置和Eclipse的使用方法。 ... [详细]
  • 本文详细介绍了如何正确安装Java EE SDK,并解决在安装过程中可能遇到的问题,特别是关于servlet代码在Apache Tomcat 10中无法运行的情况。 ... [详细]
  • 本文旨在详细介绍如何在PL/SQL环境中调试Oracle数据库中的触发器。虽然触发器能够实现某些复杂的功能,但其使用可能增加系统的维护难度。因此,本文不仅提供技术指导,还讨论了触发器使用的利弊。 ... [详细]
  • 本文详细介绍如何在IntelliJ IDEA 14中打包Android应用APK文件,并提供查询SHA1值的具体步骤。 ... [详细]
  • 本文介绍了Java语言开发的远程教学系统,包括源代码、MySQL数据库配置以及相关文档,适用于计算机专业的毕业设计。系统支持远程调试,采用B/S架构,适合现代教育需求。 ... [详细]
  • Spring Cloud因其强大的功能和灵活性,被誉为开发分布式系统的‘一站式’解决方案。它不仅简化了分布式系统中的常见模式实现,还被广泛应用于企业级生产环境中。本书内容详实,覆盖了从微服务基础到Spring Cloud的高级应用,适合各层次的开发者。 ... [详细]
  • Java EE CDI:解决依赖关系冲突的实例
    在本教程中,我们将探讨如何在Java EE的CDI(上下文和依赖注入)框架中有效解决依赖关系的冲突问题。通过学习如何使用限定符,您将能够为应用程序的不同客户端提供多种接口实现,并确保每个客户端都能正确调用其所需的实现。 ... [详细]
  • 本文详细介绍了如何通过MyEclipse将Java工程项目导出为JAR文件,包括选择项目、配置JAR文件设置以及完成导出的具体步骤。 ... [详细]
  • 本文介绍了如何使用Gradle和gdx-setup.jar工具来创建LibGDX项目,包括详细的步骤和注意事项,适合初学者和有经验的开发者。 ... [详细]
  • Flowable 6.6.0 表单引擎在Web应用中的集成与使用
    本文档提供了Flowable 6.6.0版本中表单引擎在Web应用程序中的配置和使用指南,包括表单引擎的初始化、配置以及在Web环境下的具体实现方法。 ... [详细]
author-avatar
豪哥仔137600
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有