基于Java Socket实现一个简易在线聊天功能(一)

 更新时间:2016年05月18日 14:26:38   转载 作者:Past_Future  
这篇文章主要给大家介绍基于Java Socket实现一个简易在线聊天功能(一),分为客户端和服务端两段代码,非常具有参考价值,感兴趣的朋友一起学习吧

最近做了一个项目,其中有一个在线网页交流的需求,好久没写代码了,手都生疏了,于是先写demo练练手,分享到脚本之家平台,以此做个记录,方便自己和大家使用。

先给大家说下实现步骤分这样几大步:

1、使用awt组件和socket实现简单的单客户端向服务端持续发送消息;

2、结合线程,实现多客户端连接服务端发送消息;

3、实现服务端转发客户端消息至所有客户端,同时在客户端显示;

4、把awt组件生成的窗口界面改成前端jsp或者html展示的界面,java socket实现的客户端改为前端技术实现。

这里首先实现第一步的简单功能,难点在于:

1、没有用过awt组件,没有用过java相关的监听事件;

2、长时间没有使用socket进行客户端和服务端的交互,并且没有真正进行过cs结构的开发。

实现功能的代码如下:

客户端:

package chat.chat; 
import java.awt.BorderLayout; 
import java.awt.Frame; 
import java.awt.TextArea; 
import java.awt.TextField; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.net.Socket; 
import java.net.UnknownHostException; 
/** 
 * 在线聊天客户端 1、生成图形窗口界面轮廓 2、为轮廓添加关闭事件 3、在轮廓中加入输入区域和内容展示区域 4、为输入区域添加回车事件 
 * 5、建立服务端连接并发送数据 
 * 
 * @author tuzongxun123 
 * 
 */ 
public class ChatClient extends Frame { 
  // 用户输入区域 
  private TextField tfTxt = new TextField(); 
  // 内容展示区域 
  private TextArea tarea = new TextArea(); 
  private Socket socket = null; 
  // 数据输出流 
  private DataOutputStream dataOutputStream = null; 
  public static void main(String[] args) { 
    new ChatClient().launcFrame(); 
  } 
  /** 
   * 建立一个简单的图形化窗口 
   * 
   * @author:tuzongxun 
   * @Title: launcFrame 
   * @param 
   * @return void 
   * @date May 18, 2016 9:57:00 AM 
   * @throws 
   */ 
  public void launcFrame() { 
    setLocation(300, 200); 
    this.setSize(200, 400); 
    add(tfTxt, BorderLayout.SOUTH); 
    add(tarea, BorderLayout.NORTH); 
    pack(); 
    // 监听图形界面窗口的关闭事件 
    this.addWindowListener(new WindowAdapter() { 
      @Override 
      public void windowClosing(WindowEvent e) { 
        System.exit(0); 
        disConnect(); 
      } 
    }); 
    tfTxt.addActionListener(new TFLister()); 
    setVisible(true); 
    connect(); 
  } 
  /** 
   * 连接服务器 
   * 
   * @author:tuzongxun 
   * @Title: connect 
   * @param 
   * @return void 
   * @date May 18, 2016 9:56:49 AM 
   * @throws 
   */ 
  public void connect() { 
    try { 
      // 新建服务端连接 
      socket = new Socket("127.0.0.1", 8888); 
      // 获取客户端输出流 
      dataOutputStream = new DataOutputStream(socket.getOutputStream()); 
      System.out.println("连上服务端"); 
    } catch (UnknownHostException e) { 
      e.printStackTrace(); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
  } 
  /** 
   * 关闭客户端资源 
   * 
   * @author:tuzongxun 
   * @Title: disConnect 
   * @param 
   * @return void 
   * @date May 18, 2016 9:57:46 AM 
   * @throws 
   */ 
  public void disConnect() { 
    try { 
      dataOutputStream.close(); 
      socket.close(); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
  } 
  /** 
   * 向服务端发送消息 
   * 
   * @author:tuzongxun 
   * @Title: sendMessage 
   * @param @param text 
   * @return void 
   * @date May 18, 2016 9:57:56 AM 
   * @throws 
   */ 
  private void sendMessage(String text) { 
    try { 
      dataOutputStream.writeUTF(text); 
      dataOutputStream.flush(); 
    } catch (IOException e1) { 
      e1.printStackTrace(); 
    } 
  } 
  /** 
   * 图形窗口输入区域监听回车事件 
   * 
   * @author tuzongxun123 
   * 
   */ 
  private class TFLister implements ActionListener { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
      String text = tfTxt.getText().trim(); 
      tarea.setText(text); 
      tfTxt.setText(""); 
      // 回车后发送数据到服务器 
      sendMessage(text); 
    } 
  } 
} 

服务端:

package chat.chat; 
import java.io.DataInputStream; 
import java.io.EOFException; 
import java.io.IOException; 
import java.net.BindException; 
import java.net.ServerSocket; 
import java.net.Socket; 
/** 
 * java使用socket和awt组件简单实现在线聊天功能服务端 可以实现一个客户端连接后不断向服务端发送消息 
 * 但不支持多个客户端同时连接,原因在于代码中获得客户端连接后会一直循环监听客户端输入,造成阻塞 
 * 以至于服务端无法二次监听另外的客户端,如要实现,需要使用异步或者多线程 
 * 
 * @author tuzongxun123 
 * 
 */ 
public class ChatServer { 
  public static void main(String[] args) { 
    // 是否成功启动服务端 
    boolean isStart = false; 
    // 服务端socket 
    ServerSocket ss = null; 
    // 客户端socket 
    Socket socket = null; 
    // 服务端读取客户端数据输入流 
    DataInputStream dataInputStream = null; 
    try { 
      // 启动服务器 
      ss = new ServerSocket(8888); 
    } catch (BindException e) { 
      System.out.println("端口已在使用中"); 
      // 关闭程序 
      System.exit(0); 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
    try { 
      isStart = true; 
      while (isStart) { 
        boolean isConnect = false; 
        // 启动监听 
        socket = ss.accept(); 
        System.out.println("one client connect"); 
        isConnect = true; 
        while (isConnect) { 
          // 获取客户端输入流 
          dataInputStream = new DataInputStream( 
              socket.getInputStream()); 
          // 读取客户端传递的数据 
          String message = dataInputStream.readUTF(); 
          System.out.println("客户端说:" + message); 
        } 
      } 
    } catch (EOFException e) { 
      System.out.println("client closed!"); 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } finally { 
      // 关闭相关资源 
      try { 
        dataInputStream.close(); 
        socket.close(); 
      } catch (IOException e) { 
        e.printStackTrace(); 
      } 
    } 
  } 
} 

以上所述是小编给大家介绍的Java Socket实现一个简易在线聊天功能(一)的相关知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Java中终止线程的三种方法

    Java中终止线程的三种方法

    这篇文章主要为大家详细介绍了Java中终止线程的三种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • Spring Boot 自定义数据源DruidDataSource代码

    Spring Boot 自定义数据源DruidDataSource代码

    这篇文章主要介绍了Spring Boot 自定义数据源DruidDataSource代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 超详细介绍idea中java程序打jar包的两种方式

    超详细介绍idea中java程序打jar包的两种方式

    这篇文章主要介绍了超详细介绍idea中java程序打jar包的两种方式一种是可直接执行的runnable jar文件,另一种是包含多个主类,运行时需要指定主类全类名的jar包,感兴趣的可以了解一下
    2020-07-07
  • 设计模式之原型模式_动力节点Java学院整理

    设计模式之原型模式_动力节点Java学院整理

    这篇文章主要介绍了设计模式之原型模式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • MapStruct处理Java中实体与模型间不匹配属性转换的方法

    MapStruct处理Java中实体与模型间不匹配属性转换的方法

    今天小编就为大家分享一篇关于MapStruct处理Java中实体与模型间不匹配属性转换的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • 根据URL下载图片至客户端、服务器的简单实例

    根据URL下载图片至客户端、服务器的简单实例

    下面小编就为大家带来一篇根据URL下载图片至客户端、服务器的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • JSON--List集合转换成JSON对象详解

    JSON--List集合转换成JSON对象详解

    这篇文章主要介绍了List集合转换成JSON对象,小编觉得挺不错的,现在就分享给大家,也给大家做个参考。
    2017-01-01
  • idea2020最新版配置maven的方法

    idea2020最新版配置maven的方法

    这篇文章主要介绍了idea2020最新版配置maven的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Log4j日志记录框架配置及用法解析

    Log4j日志记录框架配置及用法解析

    这篇文章主要介绍了Log4j日志记录框架配置及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Java lambda表达式实现Flink WordCount过程解析

    Java lambda表达式实现Flink WordCount过程解析

    这篇文章主要介绍了Java lambda表达式实现Flink WordCount过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02

最新评论