Java:JavaSocket编程开发多人聊天室「建议收藏」

Java:JavaSocket编程开发多人聊天室「建议收藏」Java|JavaSocket编程开发多人聊天室实现内容运行结果部分代码完整代码实现内容用Java图形用户界面编写聊天室服务器端和客户端,支持多个客户端连接到一个服务器。每个客户端能够输入账号。可以实现群聊(聊天记录显示在所有客户端界面)。完成好友列表在各个客户端上显示。可以实现私人聊天,用户可以选择某个其他用户,单独发送信息。服务器能够群发系统消息,能够强行让某些用户下线。客户端的上线下线要求能够在其他客户端上面实时刷新。运行结果部分代码importjava.awt

大家好,又见面了,我是你们的朋友全栈君。

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编程开发多人聊天室(群聊、私聊等)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/150004.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Java新手、小白入门。多敲练习代码!!!

    Java新手、小白入门。多敲练习代码!!!如果你喜欢Java,但是想学不会!我建议你没事的时候敲敲这些代码,希望对你有用!publicclassDemo{ publicstaticvoidmain(String[]args){ System.out.print(“你好\n世界”); System.out.println(“你好\tJava”); System.out.println(“1.电脑要求相对干…

  • phpstorm2021 0.3.12 激活码 blog 3月最新注册码

    phpstorm2021 0.3.12 激活码 blog 3月最新注册码,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • python微信自动群发脚本_python 微信批量发送消息脚本

    python微信自动群发脚本_python 微信批量发送消息脚本通过python利用微信公众号,批量发送消息但是,因为免费的,一天一个用户,只能发90条消息。。。可以用于zabbix啊,。等监控#!/usr/bin/envpython#-*-coding:utf-8-*-importurllib2importsysimportsimplejsonasjsonreload(sys)sys.setdefaultencoding(“utf-8…

  • 政府大数据应用案例,政府大数据治理方法[通俗易懂]

    政府大数据应用案例,政府大数据治理方法[通俗易懂]​大数据不仅将改变生产方式、生活方式,社会组织方式尤其是政府治理也将因之发生深刻变革。以大数据提升政府治理能力是大势所趋。科技革命的加速推进特别是大数据时代的到来,迫切要求政府治理加快。大数据将成为加快政府治理能力现代化的最重要、最有力推手。在大数据思维下,基于大数据的科学决策、精细管理、精准服务将成为常态,将大大推动政府管理理念和社会治理模式进步,推进法治政府、创新政府、廉洁政府、智慧政府和服务型政府建设,逐步实现治理能力现代化。政府如何利用大数据提升治理水平?1.用数据说话治理理念的转变是提高政府

  • Tomcat配置环境变量

    Tomcat配置环境变量Tomcat是目前比较流行的开源且免费的Web应用服务器,在我的电脑上第一次安装Tomcat,再经过网上教程和自己的摸索后,将这个过程重新记录下来,以便以后如果忘记了可以随时查看。注意:首先要明确一点,Tomcat与Java密切相关,因此安装使用之前要先安装JDK并设置JDK的环境变量,由于机子上已经安装好了JDK,也设置好了JDK环境变量,因此这里不再过多叙述,只说明我设置好的环境变量:JAV…

  • 字符串类型的时间和时间类型的相互转换

    字符串类型的时间和时间类型的相互转换publicstaticDategetDate(StringsDate)throwsException{Datedate=newDate(); SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd");  //要转换的格式SimpleDateFormatsdf2=newSimpleDateFormat("yyy…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号