基于C/S模式的简单聊天室

要求:
使用Socket实现网上聊天室,要求基于TCP或UDP协议,用户可以通过客户端连接到服务器端并进行聊天,聊天时可以启动多个客户端;服务器启动后,接收客户端发来的用户名和验证信息,验证通过则可以加入聊天室,当客户退出聊天时在聊天室公告改用户退出信息;要求界面美观。

  • 流程图

  • 运行结果

  • 代码重现
    客户端界面
// ClientFrame.java
package client;import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.net.InetAddress;
import java.util.Vector;import javax.swing.*;public class ClientFrame extends JFrame {JTextField field1; // 信息发送文本框JTextField usernamefield1; // 用户名文本框JPasswordField passwordfield2; // 密码文本框JLabel label1; // 显示用户名JLabel label2; // 显示密码JPanel panel;// 下方面板JTextArea area;// 信息接收文本域JButton button;// 发送按钮String userName;// 用户名称String passWord;// 用户密码Vector<String> username = new Vector(6);Vector<String> password = new Vector(6);int flag;// 密码验证是否正确的标志,flag=1成功,flag=0失败boolean is_empty = true;// 密码验证是否为空的标志ChatRoomClient client;// 客户端连接对象public ClientFrame() {setUser();do {try {// 手动输入IP地址进行连接服务器//String host = JOptionPane.showInputDialog(this, "请输入服务器IP地址");// 自动获取IP地址连接服务器String host = InetAddress.getLocalHost().getHostAddress().toString();if (host == null) {System.exit(0);// 如果host是空的,则关闭程序}client = new ChatRoomClient(host, 5678);// 连接服务器的5678接口} catch (IOException e) {e.printStackTrace();JOptionPane.showMessageDialog(this, "网络无法连接,请重新设置参数");}} while (client == null);// 如果客户端没有关闭,则一直连接while(is_empty) {// 验证输入的用户名、密码是否为空field1 = new JTextField(25);String str = JOptionPane.showInputDialog(this, "请输入用户名:");userName = str.trim();       usernamefield1 = new JTextField(15);           label1 = new JLabel(userName);         String str2 = JOptionPane.showInputDialog(this, "请输入"+userName+"的密码:");passWord = str2.trim();passwordfield2 = new JPasswordField(15);passwordfield2.setEchoChar('*');label2 = new JLabel(passWord);// 空:while循环重新输入,否则直接进入客户端client          is_empty = is_empty(userName,passWord);        // 验证用户名、密码是否正确int yz = is_true(userName,passWord);if(yz == 1) {area = new JTextArea(20, 15);area.setEditable(false);button = new JButton("发送");panel = new JPanel();init();addEventHandler();}else {if(is_empty == false) {JOptionPane.showMessageDialog(null, "账号或密码错误,请重新输入", "提示", 1);}is_empty = true;// 账号或密码错误,将用户名密码置空,is_empty置为true               }}}// 验证用户名、密码是否为空public boolean is_empty(String userName, String passWord) {// TODO Auto-generated method stubif(userName.length() == 0) {   is_empty = true;JOptionPane.showMessageDialog(this, "用户名不能为空");}else if(passWord.length() == 0){is_empty = true;JOptionPane.showMessageDialog(this, "密码不能为空");}else {is_empty = false;}return is_empty;}// 设定初始的用户和密码void setUser() {username.add("张三");username.add("李四");username.add("王五");password.add("zs123");password.add("ls123");password.add("ww123");}// 初始化方法public void init() {//add();JScrollPane jsp = new JScrollPane(area);// 添加滚动条this.setTitle(" 602聊天室");this.add(jsp);panel.add(label1);//panel.add(label2);panel.add(field1);//panel.add(passwordfield2);panel.add(button);this.add(panel, BorderLayout.SOUTH);// 下方面板,布局位置为南}// 展示窗口public void showMe() {this.pack();// 调整此窗口的大小,以适合其子组件的首选大小和布局。this.setVisible(true);// 窗口可显示this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);// 点击窗口叉,不做任何操作new ReadMessageThread().start();// 开启线程}// 验证用户名密码是否一致public int is_true(String userName,String passWord) {
//      System.out.println(username.size());flag = 0;for(int i=0;i<username.size();i++) {if(username.get(i).equals(userName) && password.get(i).equals(passWord)){flag = 1;}}if(flag == 1) {JOptionPane.showMessageDialog(null, "登录成功", "提示", -1);}
//      else {//          JOptionPane.showMessageDialog(null, "账号或密码错误,请重新输入", "提示", 1);
//          field1.setText("");
//          passwordfield2.setText("");
//          new ClientFrame().showMe();
//      }return flag;}// 添加监听方法public void addEventHandler() {button.addActionListener(new ActionListener() {// 开启按钮监听public void actionPerformed(ActionEvent e) {// 判断消息是否为空if(field1.getText().length() == 0) {JOptionPane.showMessageDialog(null, "消息不能为空", "注意", 1);is_empty = true;}else {is_empty = false;}if(is_empty == false) {client.sendMessage(userName + ":" + field1.getText());// 向服务器发送文本内容field1.setText("");// 输入框置空}             }});// 开启窗口监听this.addWindowListener(new WindowAdapter() {// 窗口关闭时public void windowClosing(WindowEvent atg0) {int op = JOptionPane.showConfirmDialog(ClientFrame.this,"确定要退出聊天室吗?", "确定", JOptionPane.YES_NO_OPTION);// 弹出提示框if (op == JOptionPane.YES_OPTION) {// 如果选择是client.sendMessage("%EXIT%:" + userName);// 发送消息try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}client.close();// 关闭客户端连接System.exit(0);// 关闭程序}}});}private class ReadMessageThread extends Thread {public void run() {while (true) {String str = client.reciveMessage();// 客户端收到服务器发来的文本内容area.append(str + "\n");// 向文本框添加文本内容}}}public static void main(String[] args) {new ClientFrame().showMe();}
}

客户端

// ChatRoomClient.java
package client;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Vector;import javax.swing.JOptionPane;public class ChatRoomClient {Socket s;// 客户端套接字BufferedReader br;// 读取字节流PrintWriter pw;// 写入字节流public ChatRoomClient(String host, int port) throws UnknownHostException,IOException {s = new Socket(host, port);// 连接服务器br = new BufferedReader(new InputStreamReader(s.getInputStream()));// 字节流读取套接字输入流pw = new PrintWriter(s.getOutputStream());// 字节流写入套接字输出流}public void sendMessage(String str) {// 发送消息pw.println(str);pw.flush();}public String reciveMessage() {// 获取消息try {String xx = br.readLine();return xx;} catch (IOException e) {e.printStackTrace();}return null;}public void close() {// 关闭套接字连接try {s.close();} catch (IOException e) {e.printStackTrace();}}
}

服务器

// ChatRoomServer.java
package server;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;public class ChatRoomServer {ServerSocket serversocket;//服务器套接字HashSet<Socket> allSockets;//客户端套接字集合public ChatRoomServer() {try {serversocket = new ServerSocket(5678);//开启服务器5678接口} catch (IOException e) {e.printStackTrace();}allSockets = new HashSet<Socket>();//实例化客户端套接字结合}public void startService() throws IOException {System.out.println("服务器已成功开启");while (true) {Socket s = serversocket.accept();//获得一个客户端的连接System.out.println("用户已进入聊天室");allSockets.add(s);//将客户端连接的套接字放到集合中new ServerThread(s).start();//为此客户端单独创建一个事务处理线程}}private class ServerThread extends Thread {//线程类Socket s;public ServerThread(Socket s) {//通过构造方法获取客户端连接this.s = s;}public void run() {BufferedReader br = null;try {br = new BufferedReader(new InputStreamReader(s.getInputStream()));//将客户端套接字输入流转换为字节流读取while (true) {//无限循环String str = br.readLine();//读取到一行之后,则赋值给字符串if (str.indexOf("%EXIT%") == 0) {//如果文本内容中包括"%EXIT%"allSockets.remove(s);//集合删除此客户端连接sendMessageTOAllClient("-" + str.split(":")[1]+ "-已退出聊天室");//服务器向所有客户端接口发送退出通知s.close();//关闭此客户端连接return;//结束循环}sendMessageTOAllClient(str);//向所有客户端此客户端发来的文本信息}} catch (IOException e) {e.printStackTrace();}}public void sendMessageTOAllClient(String message) throws IOException {//向所有客户端发送文本内容Date date = new Date();//创建时间类SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");//在文本后面添加时间System.out.println(message + "\t[" + df.format(date) + "]");for (Socket s : allSockets) {//循环集合中所有的客户端连接PrintWriter pw = new PrintWriter(s.getOutputStream());//创建输出流pw.println(message + "\t[" + df.format(date) + "]");//输写入文本内容pw.flush();//输出流刷新}}}public static void main(String[] args) {try {new ChatRoomServer().startService();} catch (IOException e) {e.printStackTrace();}}
}

需要详细报告或者有问题可以加QQ: 2953094905

基于C/S模式的简单聊天室相关推荐

  1. python socket 网络聊天室_Python基于Socket实现简单聊天室

    本文实例为大家分享了Python基于Socket实现简单聊天室,供大家参考,具体内容如下 服务端 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Ti ...

  2. java毕业设计——基于java+TCP+UDP的局域网聊天室系统设计与实现(毕业论文+程序源码)——局域网聊天室系统

    基于java+TCP+UDP的局域网聊天室系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+TCP+UDP的局域网聊天室系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地 ...

  3. java web利用mvc结构实现简单聊天室功能

    简单聊天室采用各种内部对象不适用数据库实现. 一个聊天室要实现的基本功能是:         1.用户登录进入聊天室, 2.用户发言 3.用户可以看见别人发言 刚才算是简单的需求分析了,现在就应该是进 ...

  4. 基于Node.js + WebSocket 的简易聊天室

    代码地址如下: http://www.demodashi.com/demo/13282.html Node.js聊天室运行说明 Node.js的本质就是运行在服务端的JavaScript.Node.j ...

  5. 利用socket.io+nodejs打造简单聊天室

    代码地址如下: http://www.demodashi.com/demo/11579.html 界面展示: 首先展示demo的结果界面,只是简单消息的发送和接收,包括发送文字和发送图片. ws说明: ...

  6. Android基于XMPP Smack openfire 开发的聊天室

    公司刚好让做即时通讯模块,服务器使用openfire,偶然看到有位仁兄的帖子,拷贝过来细细研究,感谢此仁兄的无私,期待此仁兄的下次更新 转自http://blog.csdn.net/lnb333666 ...

  7. 【java毕业设计】基于java+原生Sevlet+socket的聊天室系统设计与实现(毕业论文+程序源码)——聊天室系统

    基于java+原生Sevlet+socket的聊天室系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+原生Sevlet+socket的聊天室系统设计与实现,文章末尾附有本毕业设 ...

  8. java web聊天室原理_java web利用mvc结构实现简单聊天室功能

    简单聊天室采用各种内部对象不适用数据库实现. 一个聊天室要实现的基本功能是: 1.用户登录进入聊天室, 2.用户发言 3.用户可以看见别人发言 刚才算是简单的需求分析了,现在就应该是进行mvc结构的设 ...

  9. node.js入门 - 2.创建一个简单聊天室

    这篇文章将通过开发一个简单聊天室的方式,介绍node.js的net模块. 一.第一版,只向客户端发送信息   我们先实现一个简单的版本,代码如下: var net=require('net'); va ...

最新文章

  1. CSP 201812-2 小明放学 Python实现+详解
  2. 我把帮带份饭的信息错发给导师后.......
  3. salesforce 零基础学习(四十二)简单文件上传下载
  4. 用python写一个豆瓣通用爬虫并可视化分析
  5. 【car】为什么后轮驱动的电动小摩托后轮打滑时制动前轮能起到较好的防打滑效果(ESC、ESP、VSA车身稳定系统)
  6. E:Sleeping Schedule(DP)
  7. 不会Python爬虫?教你一个通用爬虫思路轻松爬取网页数据,赶紧收藏!!
  8. 【Siddhi 5】Siddhi 5 源码编译
  9. 一起学爬虫——如何爬取通过ajax加载数据的网站
  10. recurdyn和matlab联合仿真,基于RecurDyn与Simulink的液压破碎锤联合仿真与试验分析
  11. 有效利用ASP.NET用户控件的事件委托
  12. 服务器端 viewstate
  13. day20T3改错记
  14. Bend Labs弯曲传感器介绍
  15. P问题、NP问题和NPC问题
  16. leadtools将pdf转tif
  17. DHCP配置——Linux网络服务
  18. 盘点那些年BAT字节跳动等互联网公司的程序员、工程师一夜暴富的都市传说
  19. 计算机怎么打开隐藏的项目,展示win10系统怎么打开隐藏文件夹
  20. BI神器Power Query(3)-- PQ从表格导入数据

热门文章

  1. 工具类微信小程序-你记我账-实例源码
  2. 减少巨大pdf文件大小
  3. Android动画基础
  4. Revit二次开发小火车工具集的复现
  5. 交互设计师 mysql_UCD火花集2:有效的互联网产品设计 交互/信息设计 用户研究讨论...
  6. 纯css实现信封效果
  7. 传统燃油车迎来“诺基亚时刻”,油站行业或将加速上演“大逃亡”
  8. 三步获得免费的“360随身WiFi”
  9. 基于javaweb+mysql的大学生实习管理系统(java+springboot+thymeleaf+html+jquery+bootstrap)
  10. 6个语文写作技巧和方法