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

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

这篇文章主要介绍了java利用Socket实现聊天室功能实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

最近研究了下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 chatThreads = new ArrayList(); 
 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

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

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


推荐阅读
  • 在使用Postman进行接口测试时,如果携带大量参数,可能会遇到‘请求头过大’的问题。本文将详细介绍如何调整Tomcat的请求头大小限制,并提供有效的路径映射解决方案,以避免因路径配置不当导致的404错误。 ... [详细]
  • 本文详细介绍了中心方形数的概念及其计算方法,并提供了多种编程语言下的实现代码。 ... [详细]
  • 解决MySQL Administrator 登录失败问题
    本文提供了解决在使用MySQL Administrator时遇到的登录错误的方法,包括启动变量和服务部分禁用的问题。同时,文章还介绍了通过安全配置模式来解决问题的具体步骤。 ... [详细]
  • 2023年PHP处理请求超时的全面指南
    本文详细介绍了在PHP中处理请求超时的各种方法,包括设置脚本执行时间、处理file_get_contents函数超时以及优化AJAX请求等,适合开发者参考学习。 ... [详细]
  • 本文详细介绍了使用Apache的AB工具和Webbench进行服务器性能测试的过程,分享了实际操作中的测试结果,并探讨了测试过程中遇到的问题及可能的解决方案。 ... [详细]
  • 浏览器、中间件与服务器的交互机制
    本文详细探讨了浏览器、中间件和服务器之间的交互过程,特别是HTTP请求的完整流程,包括DNS解析、TCP连接建立及数据传输等关键步骤。 ... [详细]
  • Sass 是一种 CSS 的预处理器,通过使用变量、嵌套、继承等高级功能,使得 CSS 的编写更加灵活和高效。本文将介绍 Sass 的基本语法及其安装使用方法。 ... [详细]
  • 在最近的项目测试中,我们遇到了一个棘手的问题——当使用 Nginx 作为反向代理服务器时,Tomcat 应用中的 Session 信息会丢失。通过深入研究和多次实验,最终找到了有效的解决方案。 ... [详细]
  • 远程访问用户 Kindle通过电子书实现控制
    介绍自2007年以来,亚马逊已售出数千万台Kindle,令人印象深刻。但这也意味着数以千万计的人可能会因为这些Kindle中的软件漏洞而被黑客入侵。他 ... [详细]
  • 本文介绍了FTP(文件传输协议)的基础知识,包括其定义、如何通过TCP建立控制和数据连接,以及主动模式与被动模式的区别。FTP作为一种重要的文件传输协议,在互联网数据交换中扮演着关键角色。 ... [详细]
  • 深入理解SAP Fiori及其核心概念
    本文详细介绍了SAP Fiori的基本概念、发展历程、核心特性、应用类型、运行环境以及开发工具等,旨在帮助读者全面了解SAP Fiori的技术框架和应用场景。 ... [详细]
  • 基于四套不同房屋的实际应用案例,本文深入探讨了全屋WiFi系统的构建方法与技巧,旨在帮助读者避免常见错误,实现最佳的家庭网络覆盖。 ... [详细]
  • 乌云网关闭四周年:回顾与展望
    乌云网曾是国内领先的漏洞报告平台,连接了众多白帽黑客与企业。本文回顾了乌云网的关闭历程及其对网络安全行业的影响,并探讨未来可能的发展方向。 ... [详细]
  • 理解HTTP状态码及其应用
    本文详细解析了HTTP状态码的分类及常见代码的意义,帮助开发者和用户更好地理解和解决网络请求中遇到的问题。 ... [详细]
  • 应对高并发面试题:构建稳健的系统架构策略
    本文探讨了如何在面试中有效地回答有关高并发系统设计的问题。通过逐步介绍从单机部署到集群化、数据库优化、缓存应用及消息队列的使用,帮助读者建立解决高并发挑战的基本思路。 ... [详细]
author-avatar
mobiledu2502861407
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有