Java:JavaSocket编程开发多人聊天室

  • 实现内容
  • 运行结果
  • 部分代码
  • 完整代码

实现内容

  1. 用Java图形用户界面编写聊天室服务器端和客户端, 支持多个客户端连接到一个服务器。每个客户端能够输入账号。
  2. 可以实现群聊(聊天记录显示在所有客户端界面)。
  3. 完成好友列表在各个客户端上显示。
  4. 可以实现私人聊天,用户可以选择某个其他用户,单独发送信息。
  5. 服务器能够群发系统消息,能够强行让某些用户下线。
  6. 客户端的上线下线要求能够在其他客户端上面实时刷新。

运行结果




部分代码

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.*;
import java.text.*;
import javax.swing.*;public class ClientChat extends JFrame {private static final long serialVersionUID = 1L;private Socket socket ;                  //负责和服务器通信private JTextArea contentArea;           //群聊消息显示框private JTextArea sendArea;              //消息编辑区域private JTextArea friendsList;           //好友列表private String name;                     //用户名private JComboBox cmb;                   //发送对象下拉框public ClientChat(Socket socket,String name)  {this.socket = socket ;this.name  = name ;this.init();        //初始化聊天客户端this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);this.setVisible(true);//接下来启动单独线程,从服务器中读取数据ClientThread thread  = new ClientThread(socket,contentArea,cmb) ;thread.start();}public void init( )  {this.setTitle("我的聊天室");this.setSize(500,500);int x = (int)Toolkit.getDefaultToolkit().getScreenSize().getWidth() ;int y = (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight() ;this.setLocation( (x-this.getWidth() )/2, ( y-this.getHeight() )/2 );this.setResizable(false);contentArea = new JTextArea();contentArea.setLineWrap(true);  //换行方法JScrollPane logPanel = new JScrollPane(contentArea, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);contentArea.append("----------------------------消息记录--------------------------------------\n");sendArea = new JTextArea();sendArea.setLineWrap(true);    //控制每行显示长度最大不超过界面长度JScrollPane sendPanel = new JScrollPane(sendArea, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);friendsList = new JTextArea();friendsList.setLineWrap(true);JScrollPane friendPanel2 = new JScrollPane(friendsList, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);friendsList.append("------------好友列表-------------\n");JSplitPane splitpane1 = new JSplitPane(JSplitPane.VERTICAL_SPLIT,logPanel,sendPanel) ;splitpane1.setDividerLocation(290);JSplitPane splitpane2 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,splitpane1,friendPanel2) ;splitpane2.setDividerLocation(320);this.add(splitpane2,BorderLayout.CENTER);//按钮面板JPanel bPanel  = new JPanel() ;bPanel.setLayout(new FlowLayout(FlowLayout.RIGHT)) ;this.add(bPanel,BorderLayout.SOUTH) ;JLabel toNamelabel=new JLabel("发送对象:");cmb=new JComboBox(); cmb.addItem("所有人");bPanel.add(toNamelabel);bPanel.add(cmb);JLabel namelabel = new JLabel("用户名: "+this.name+"  ") ;bPanel.add(namelabel) ;JButton closeButton = new JButton("退 出") ;closeButton.addActionListener( new ActionListener() {  //退出按钮监听public void actionPerformed(ActionEvent e)  {String sendStr = name + "!!!!" ;PrintWriter out = null ;try  {out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream() ) ) ;out.println(sendStr) ;out.flush();}catch(Exception ex)  {ex.printStackTrace();}exit();}});bPanel.add(closeButton) ;JButton sendButton = new JButton("发 送") ;sendButton.addActionListener(new ActionListener() {  //发送按钮监听public void actionPerformed(ActionEvent e) {String str = sendArea.getText();  //获取发送的消息SimpleDateFormat formater = new SimpleDateFormat("HH:mm:ss") ;  //获取当前时间String time  = formater.format(new Date() ) ;String toName = (String) cmb.getSelectedItem();  //获取发送对象//发送给服务器的消息格式为    时间  本客户端用户名 对  发送对象  说:  消息   <本客户端用户名>(发送对象)String sendStr = time + "   " + name + " 对 " + toName +" 说: "+ str + "<" + name +">" + "(" + toName + ")";PrintWriter out = null ;try  {out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream() ) ) ;  //发送给服务器out.println(sendStr) ;out.flush();}catch(Exception ex)  {ex.printStackTrace();}sendArea.setText("");}});bPanel.add(sendButton) ;   }public void exit() {   //退出this.dispose();System.exit(0);}//客户端与服务器端通信的线程类
class ClientThread extends Thread  {private Socket socket ;private JTextArea contentArea ;private JComboBox cmb;public ClientThread(Socket socket, JTextArea  conteArea , JComboBox cmb) {this.socket = socket ;this.contentArea = conteArea ;this.cmb = cmb;}public void run() {BufferedReader br = null ;try  {br = new BufferedReader(new InputStreamReader(socket.getInputStream())) ;String str = null ;while( (str = br.readLine()) != null) {if(str.endsWith("上线了 ]")) {  //新用户上线,加入列表中if(!str.substring(3, str.length()-5).equals(name)) {friendsList.append(str.substring(3, str.length()-5));friendsList.append("\n");cmb.addItem(str.substring(3, str.length()-5));}contentArea.append(str);contentArea.append("\n");}else if(str.endsWith("下线了 ]")) {  //用户下线contentArea.append(str);contentArea.append("\n");cmb.removeItem(str.substring(3, str.length()-5));} else if(str.endsWith("被强制下线 ]")) {  //服务器强制下线消息if(str.substring(3, str.length()-7).equals(name)) {exit();}else {contentArea.append(str);contentArea.append("\n");cmb.removeItem(str.substring(3, str.length()-7));}}else if(str.endsWith("###")) { //将在本客户端连接之前就已连接的客户端用户名添加到列表中friendsList.append(str.substring(0, str.length()-3));friendsList.append("\n");cmb.addItem(str.substring(0, str.length()-3));}else if(str.substring(0,6).equals(" [ 通知:")) {  //服务器发送的系统通知contentArea.append(str);contentArea.append("\n");}else if(splitData(str,"<",">").equals(name)){ //自己发送的消息contentArea.append(str.substring(0, str.lastIndexOf("<")));contentArea.append("\n");}else if(splitData(str,"(",")").equals(name)){ //别人私聊给自己的消息contentArea.append(str.substring(0, str.lastIndexOf("<")));contentArea.append("\n");}else if(splitData(str,"(",")").equals("所有人")) { //对所有人发送的消息contentArea.append(str.substring(0, str.lastIndexOf("<")));contentArea.append("\n");}}}catch(Exception ex) {ex.printStackTrace();}finally {  if(br != null) {try {br.close () ;}catch(IOException e) {e.printStackTrace();}}}}public String splitData(String str, String strStart, String strEnd) {  //获取字符串中某两个字符间的字符串String tempStr;tempStr = str.substring(str.indexOf(strStart) + 1, str.lastIndexOf(strEnd));return tempStr;}}
}

完整代码

用JavaSocket编程开发多人聊天室(群聊、私聊等)

Java:JavaSocket编程开发多人聊天室相关推荐

  1. java 多人聊天_java编程实现多人聊天室功能

    导读热词 本文实例为大家分享了java实现多人聊天室的具体代码,供大家参考,具体内容如下 程序源代码及运行截图: server.java //server.java package Socket; i ...

  2. java仿qq聊天系统 多人聊天室

    目录 项目介绍 项目截图 服务器与客户端 新用户注册 注册新账号成功 进入聊天室 多人在线 选择发送文件 文件接收提醒 项目代码参考 服务器入口程序 服务器请求处理 原理解析 服务器多人网络连接: 如 ...

  3. Java Socket实现简易多人聊天室传输聊天内容或文件

    Java Socket实现简易多人聊天室传输聊天内容或文件 Java小练手项目:用Java Socket实现多人聊天室,聊天室功能包括传输聊天内容或者文件.相比于其它的聊天室,增加了传输文件的功能供参 ...

  4. java控制台输出版多人聊天室

    多人聊天室就要用到网络以及多线程以及输入输出流的知识 多人聊天室就是多个人同时聊天,一个发一条信息所有人都是可以接收得到. 接下来我们捋清楚一下思路 在这里面服务器充当了一个转发的作用,服务器要做的事 ...

  5. linux网络编程TCP多人聊天室

    用socket实现一个多人聊天室的思路很简单,即在服务器端定义一个fd的int型数组,用来存储已经连接的客户端的socket连接套接字fd(因为发送和接收数据都只需要借助连接套接字fd),当服务器接收 ...

  6. Java WebSocket编程与网页简易聊天室

    在webSocket还未引入前,许多开发人员通过各种非正规手段来完成更新网站的最新信息和到所有当前访问者的任务,其中一种手段就是通过浏览器向服务器轮询更新,但这种手段的网络延迟比较明显,其用户体验比较 ...

  7. 网络编程项目—— 多人聊天室->双人聊天

    一.Coding前的思考和步骤梳理 1. 又开始思考这个问题,拿到一个需求,是调用java底层的代码写1000行实现,还是直接调第三方库写50行实现? 都一样. 发现第一次写shell的时候其实思考过 ...

  8. 基于socket编程的多人聊天室

    效果图:      server.c 1 /* 服务器端 server.c */ 2 #include <glib.h> 3 #include <stdio.h> 4 #inc ...

  9. JAVA利用websocket实现多人聊天室、私信(附源码)

    声明:此文为原创,转载请声明出处! 小编曾在毕业设计中用到了聊天室这个功能,现在稍作整理分享一下,希望能对大家有所帮助,有不足之处请指出 在学习websocket前,首先得知道它的一些基本操作,可参考 ...

  10. socket编程实现多人聊天室

    说明:需先运行服务端,再运行客户端 要实现多个客户端同时进行可在控制台中运行多个客户端程序 代码分享  socket服务端 import socket import threading #存入用户和连 ...

最新文章

  1. 四轴飞行器实践教程(内部资料)
  2. php 接口 2.0,YII 2.0 API接口开发
  3. 三星手机Android9和10的区别,三星开始在Galaxy Note 9上测试Android 10
  4. 中兴通讯已在多个国家和地区商用了安全领域的解决方案
  5. 微信接口开发之高级篇系列【网页授权详细说明【提供测试账号使用】】
  6. 某度网盘转存限制500个文件?这个软件帮你搞定!
  7. c++中wstring 和 string的转换
  8. labuladong的算法小抄pdf_东哥手写正则通配符算法,结构清晰,包教包会!
  9. TensorFLow RCNN
  10. matlab的simin用法,在Maltlab 的simulink中怎么输入讯号
  11. python写病毒代码_十行 Python 代码写一个USB病毒
  12. Adobe Dreamweaver CC完美补丁amtlib.dll 解决进程CPU占用高问题
  13. Fundamentals of Power Electronics 第1版第2版 pdf 资源
  14. AD PCB画图注意点
  15. 使用 laravel-admin 配置后台管理系统
  16. 阿里云平台购买域名 域名配置 域名解析步骤
  17. 死链接处理,seo站长必会
  18. notepad打开java乱码_notepad打开中文乱码
  19. php后端自学,【后端开发】自学php有哪些好的方法
  20. IOT-Studio 物联网应用开发实例

热门文章

  1. 超微服务器怎么开虚拟化,amd服务器开启虚拟化(amd处理器开启虚拟化)
  2. python-snap7的安装记录
  3. zte机顶盒怎么投屏_中兴iptv机顶盒可以投屏吗?
  4. lora三层服务器协议,LoRa以及LoRa包含的几种协议
  5. 【速度↑20%模型尺寸↓36%】极简开源人脸检测算法升级
  6. postSQL hash分表
  7. 2网口全网通4G工业路由器特点
  8. glide 设置宽高_Glide加载ImageView显示不全的问题(宽高比一致,以及fitxy/centerCrop)...
  9. 黑马程序员最新Python教程——第一阶段(3)第二阶段(1)
  10. pycharm-perl脚本