java利用Socket实现聊天室功能实例

发布时间 - 2026-01-10 22:54:25    点击率:

最近研究了下Java socket通信基础,利用代码实现了一个简单的多人聊天室功能,现把代码共享下,希望能帮到有兴趣了解的人。

目录结构:

ChatClient:

package com.panda.chat; 
 
import java.awt.*; 
import java.awt.event.*; 
import java.io.*; 
import java.net.*; 
 
@SuppressWarnings("serial") 
public class ChatClient extends Frame { 
 private TextArea ta = new TextArea(); 
 private TextField tf = new TextField(); 
 private DataOutputStream dos = null; 
 private DataInputStream dis = null; 
 private Socket socket = null; 
 private boolean bConnected = false; 
 private Thread thread=null; 
 public static void main(String[] args) { 
  new ChatClient().frameClient(); 
 } 
 public void frameClient(){ 
  setSize(400, 400); 
  setLocation(400,300); 
  add(ta,BorderLayout.NORTH); 
  add(tf,BorderLayout.SOUTH); 
  pack(); 
  tf.addActionListener(new TfListener()); 
  //关闭窗口事件监听 
  this.addWindowListener(new WindowAdapter() { 
   @Override 
   public void windowClosing(WindowEvent e) { 
    disconnected(); 
    System.exit(0); 
   } 
  }); 
  this.connect(); 
  setVisible(true); 
 } 
 //链接服务器地址 
 private void connect(){ 
  try { 
   socket = new Socket("127.0.0.1", 8888); 
   thread=new Thread(new ChatThread()); 
   thread.start(); 
   dos = new DataOutputStream(socket.getOutputStream()); 
   dis = new DataInputStream(socket.getInputStream()); 
  } catch (UnknownHostException e) { 
   // TODO Auto-generated catch block 
   e.printStackTrace(); 
  } catch (IOException e) { 
   // TODO Auto-generated catch block 
   e.printStackTrace(); 
  } 
 } 
 //断开连接 
 private void disconnected(){ 
  bConnected = false; 
  try { 
   dos.close(); 
   dis.close(); 
   socket.close(); 
  } catch (IOException e1) { 
   // TODO Auto-generated catch block 
   e1.printStackTrace(); 
  } 
 } 
 //键盘回车事件 
 private class TfListener implements ActionListener{ 
 
  @Override 
  public void actionPerformed(ActionEvent e) { 
   String strMsg = tf.getText(); 
   tf.setText(""); 
   try { 
    dos.writeUTF(strMsg); 
    dos.flush(); 
   } catch (IOException e1) { 
    // TODO Auto-generated catch block 
    e1.printStackTrace(); 
   } 
  } 
   
 } 
 //开启线程接受服务器信息 
 private class ChatThread implements Runnable{ 
  @Override 
  public void run() { 
   try { 
    bConnected = true; 
    while(bConnected){ 
     String msg = dis.readUTF(); 
     String taText = ta.getText(); 
     ta.setText(taText+msg+"\n"); 
    } 
   } catch (SocketException e) { 
    System.out.println("退出");; 
   } catch (IOException e) { 
    e.printStackTrace(); 
   } 
  } 
 } 
} 

ChatServer:

package com.panda.chat; 
 
import java.io.*; 
import java.net.*; 
import java.util.*; 
 
public class ChatServer { 
 private boolean started = false; 
 private List<ChatThread> chatThreads = new ArrayList<ChatThread>(); 
 public static void main(String[] args) { 
  new ChatServer().startServer(); 
 } 
 private void startServer(){ 
  try { 
   //开启服务端Socket 
   ServerSocket seso = new ServerSocket(8888); 
   started = true; 
   while(started){ 
    //接受客户端连接请求 
    Socket sos = seso.accept(); 
    System.out.println("一个客户端已连接"); 
    //开启线程处理客户端通信 
    ChatThread ct = new ChatThread(sos); 
    chatThreads.add(ct); 
    new Thread(ct).start(); 
   } 
  } catch (IOException e) { 
   e.printStackTrace(); 
  } 
 } 
 private class ChatThread implements Runnable{ 
  private Socket socket; 
  private DataInputStream din=null; 
  private DataOutputStream don=null; 
  private boolean bConnected = false; 
  public ChatThread(Socket socket) { 
   super(); 
   this.socket = socket; 
  } 
  //发送信息的函数 
  private void send(String strMsgIn){ 
   try{ 
    don.writeUTF(strMsgIn); 
    don.flush(); 
   }catch(IOException e){ 
    e.printStackTrace(); 
   } 
  } 
  @Override 
  public void run() { 
   try{ 
    din = new DataInputStream(socket.getInputStream()); 
    don = new DataOutputStream(socket.getOutputStream()); 
    //读取数据 
    bConnected = true; 
    while(bConnected){ 
     String strMsgIn = din.readUTF(); 
     System.out.println(strMsgIn); 
     //接收到数据后发送给每个客户端 
     for(int i =0;i<chatThreads.size();i++){ 
      chatThreads.get(i).send(strMsgIn); 
     } 
    } 
   }catch (IOException e) { 
    try { 
     //如果客户端出错或关闭,直接关闭连接,并移除List中的当前线程 
     socket.close(); 
     chatThreads.remove(this); 
    } catch (IOException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
   } finally{ 
    try { 
     din.close(); 
     don.close(); 
     socket.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
   } 
  } 
  
 } 
} 

运行ChatSever后,再同时打开多次ChatClient,就可以实现多人聊天了,你也试试。

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


# java  # socket做聊天室  # java实现聊天室  # socket实现聊天室  # 使用Java和WebSocket实现网页聊天室实例代码  # java socket实现聊天室 java实现多人聊天功能  # Java基于socket实现简易聊天室实例  # java实现一个简单TCPSocket聊天室功能分享  # Java Socket聊天室编程(一)之利用socket实现聊天之消息推送  # Java Socket聊天室编程(二)之利用socket实现单聊聊天室  # 用java WebSocket做一个聊天室  # 基于Tomcat7、Java、WebSocket的服务器推送聊天室实例  # Java编程实现基于TCP协议的Socket聊天室示例  # Java基于Socket实现多人聊天室  # 客户端  # 的人  # 你也  # 希望能  # 有兴趣  # 关闭窗口  # 服务端  # 大家多多  # 移除  # 就可以  # 实现了  # 发送给  # 聊天室  # void  # static  # args  # frameClient  # String  # main  # thread 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: JavaScript模板引擎Template.js使用详解  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  如何在IIS服务器上快速部署高效网站?  如何在服务器上配置二级域名建站?  Laravel模型事件有哪些_Laravel Model Event生命周期详解  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  Laravel Fortify是什么,和Jetstream有什么关系  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  Laravel如何保护应用免受CSRF攻击?(原理和示例)  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  Android实现代码画虚线边框背景效果  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  活动邀请函制作网站有哪些,活动邀请函文案?  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  Android自定义控件实现温度旋转按钮效果  如何基于PHP生成高效IDC网络公司建站源码?  JavaScript如何实现倒计时_时间函数如何精确控制  详解jQuery中的事件  Laravel如何配置Horizon来管理队列?(安装和使用)  googleplay官方入口在哪里_Google Play官方商店快速入口指南  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  原生JS获取元素集合的子元素宽度实例  如何在IIS中新建站点并配置端口与物理路径?  ,南京靠谱的征婚网站?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  JavaScript常见的五种数组去重的方式  如何在建站宝盒中设置产品搜索功能?  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  网站优化排名时,需要考虑哪些问题呢?  原生JS实现图片轮播切换效果  深入理解Android中的xmlns:tools属性  简历在线制作网站免费版,如何创建个人简历?  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  如何在万网开始建站?分步指南解析  Android中AutoCompleteTextView自动提示  如何在阿里云通过域名搭建网站?  ,网页ppt怎么弄成自己的ppt?  如何在云主机上快速搭建网站?  重庆市网站制作公司,重庆招聘网站哪个好?  长沙做网站要多少钱,长沙国安网络怎么样?  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  如何为不同团队 ID 动态生成多个独立按钮  如何用AI帮你把自己的生活经历写成一个有趣的故事?  在Oracle关闭情况下如何修改spfile的参数  高性价比服务器租赁——企业级配置与24小时运维服务  如何在云虚拟主机上快速搭建个人网站?  中山网站推广排名,中山信息港登录入口?