用Java实现聊天室功能

聊天室功能分为两个部分,一部分是服务器的代码实现,一部分是客户端的代码实现,那么如何实现服务器和客户端的通信连接,如何实现客户端和客户端之间的信息通信就是我们要考虑的问题了。

先看一下我们做出的聊天室效果:

接下来上代码:

//首先是服务器主程序代码
package chatroom;import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;/**
* @description:
* @date:created in 2020-07-08 16:19
* @author:Dylan
* @modified by:
*/
public class ChatServer {//主函数入口public static void main(String[] args) throws IOException {//实例化一个服务器类的对象ChatServer cs=new ChatServer();//调用方法,为指定端口创建服务器cs.setUpServer();}private void setUpServer() throws IOException {// TODO Auto-generated method stubServerSocket server=new ServerSocket(9000);//打印出当期创建的服务器端口号System.out.println("服务器创建成功!端口号:"+ 9000);while(true) {//等待连接进入Socket socket=server.accept();System.out.println("进入了一个客户机连接:"+socket.getRemoteSocketAddress().toString());//启动一个线程去处理这个对象ServerThread st=new ServerThread(socket);st.start();}}
}

//聊天室线程代码
package chatroom;import java.io.*;
import java.net.Socket;/*** @description:* @date:created in 2020-07-08 16:21* @author:Dylan* @modified by:*/
public class ServerThread extends Thread {private Socket client;//线程中的处理对象private OutputStream ous;//输出流对象private UserInfo user;//用户信息对象public ServerThread(Socket client) {this.client=client;}public UserInfo getOwerUser() {return this.user;}@Overridepublic void run() {try {processSocket();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//在显示屏中打印信息,例如"用户名"、"密码"等等public void sendMsg2Me(String msg) throws IOException {msg+="\r\n";ous.write(msg.getBytes());ous.flush();}private void processSocket() throws IOException {// TODO Auto-generated method stubInputStream ins=client.getInputStream();ous=client.getOutputStream();BufferedReader brd=new BufferedReader(new InputStreamReader(ins));sendMsg2Me("欢迎你来聊天,请输入你的用户名:");String userName=brd.readLine();sendMsg2Me("请输入密码:");String pwd=brd.readLine();user=new UserInfo();user.setName(userName);user.setPassword(pwd);//调用数据库,验证用户是否存在boolean loginState=DaoTools.checkLogin(user);if(!loginState) {//如果不存在这个账号则关闭this.closeMe();return;}sendMsg2Me("是否加入聊天:");String input=brd.readLine();if("是".equals(input)){sendMsg2Me("你已加入聊天");}ChatTools.addClient(this);//认证成功,把这个用户加入服务器队列while(!input.equals("bye")) {input=brd.readLine();System.out.println("服务器读到的是:"+input);ChatTools.castMsg(this.user, input);}ChatTools.castMsg(this.user, "bye");this.closeMe();}//关闭当前客户机与服务器的连接。public void closeMe() throws IOException {client.close();}
}

//服务器向客户分发消息代码
package chatroom;import java.io.IOException;
import java.util.ArrayList;/*** @description:* @date:created in 2020-07-08 16:32* @author:Dylan* @modified by:*/
public class ChatTools {//保存线程处理的对象private static final ArrayList<ServerThread> stList=new ArrayList();//不需要实例化类,因此构造器为私有private ChatTools() {}//将一个客户对应的线程处理对象加入到队列中public static void addClient(ServerThread st) throws IOException {stList.add(st);//将这个线程处理对象加入到队列中castMsg(st.getOwerUser(),"我上线了!目前人数:"+stList.size());}//发送消息给其他用户public static void castMsg(UserInfo sender,String msg) throws IOException {msg = sender.getName() + "说:" + msg;//加上说的对象for (int i = 0; i < stList.size(); i++) {ServerThread st = stList.get(i);st.sendMsg2Me(msg);//发消息给每一个客户机}}
}
```java
package chatroom;
//用户数据库代码
import java.util.HashMap;
import java.util.Map;/*** @description:* @date:created in 2020-07-08 16:23* @author:Dylan* @modified by:*/
public class DaoTools {//内存用户信息数据库private static Map<String, UserInfo> userDB = new HashMap();//静态块:模拟生成内存中的用户数据,用户名为1~10//当程序启动时这段代码会自动执行向userDB放入数据static {for (int i = 1; i <= 10; i++) {UserInfo user = new UserInfo();user.setName("Dylan"+i);user.setPassword("123456");userDB.put(user.getName(), user);}}public static boolean checkLogin(UserInfo user) {//在只验证用户名是否存在//return true;if (userDB.containsKey(user.getName())) {System.out.println("用户验证成功");return true;}System.out.println(user.getName() + "用户验证失败!");return false;}
}

//用户信息初始化代码
package chatroom;
/*** @description:* @date:created in 2020-07-08 16:22* @author:Dylan* @modified by:*/
public class UserInfo {private String name;//用户名private String password;//密码private String loignTime;//登录时间private String address;//客户机端口名public String getName() {return name;}public void setName(String name) {// TODO Auto-generated method stubthis.name=name;}public void setPassword(String psw) {this.password=password;}
}

接下来时客户端程序代码

//客户端主程序代码
package chatroom;import java.io.*;
import java.net.Socket;/*** @description:* @date:created in 2020-07-11 17:50* @author:Dylan* @modified by:*/
public class ClientThread extends Thread{private  Socket socket ;public ClientThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {while(true){try {getMsg();} catch (IOException e) {e.printStackTrace();}}}public void getMsg() throws IOException {InputStream is = socket.getInputStream();BufferedReader bis = new BufferedReader(new InputStreamReader(is));String i = bis.readLine();System.out.println(i);if("bye".equals(i)){socket.close();}}
}

//客户端1主程序代码
package chatroom;import java.io.*;
import java.net.Socket;
import java.util.Scanner;/*** @description:* @date:created in 2020-07-08 16:35* @author:Dylan* @modified by:*/
public class ChatClient {private static  Socket socket ;private static  OutputStream os ;public ChatClient() throws IOException { }public static void main(String[] args) throws IOException, InterruptedException {socket = new Socket("localhost",9000);InputStream is = socket.getInputStream();BufferedReader bis = new BufferedReader(new InputStreamReader(is));Scanner input = new Scanner(System.in);System.out.println(bis.readLine());String s = input.nextLine();sentMessage(s);System.out.println(bis.readLine());String s1 = input.nextLine();sentMessage(s1);System.out.println(bis.readLine());String s2 = input.nextLine();sentMessage(s2);System.out.println(bis.readLine());ClientThread ct = new ClientThread(socket);ct.start();while(true){String s3 = input.nextLine();sentMessage(s3);}}public static void  sentMessage(String s) throws IOException {os = socket.getOutputStream();s += "\r\n";os.write(s.getBytes());os.flush();}
}

//客户端2代码
package chatroom;import java.io.*;
import java.net.Socket;
import java.util.Scanner;/*** @description:* @date:created in 2020-07-08 17:29* @author:Dylan* @modified by:*/
public class ChatClient2 {private static Socket socket ;private static OutputStream os ;public ChatClient2() throws IOException { }public static void main(String[] args) throws IOException {socket = new Socket("localhost",9000);InputStream is = socket.getInputStream();BufferedReader bis = new BufferedReader(new InputStreamReader(is));Scanner input = new Scanner(System.in);System.out.println(bis.readLine());String s = input.nextLine();sentMessage(s);System.out.println(bis.readLine());String s1 = input.nextLine();sentMessage(s1);System.out.println(bis.readLine());String s2 = input.nextLine();sentMessage(s2);System.out.println(bis.readLine());ClientThread ct = new ClientThread(socket);ct.start();while(true){String s3 = input.nextLine();sentMessage(s3);}}public static void  sentMessage(String s) throws IOException {os = socket.getOutputStream();s += "\r\n";os.write(s.getBytes());os.flush();}
}

通过上面这些代码,我们就可以愉快的实现一个简易聊天室功能了。

Java 聊天室实现相关推荐

  1. 多人群聊聊天室java_#java 聊天室(一)—— 实现一个简单Telnet多人群聊聊天室...

    #java    聊天室(一)--  实现一个简单Telnet多人群聊聊天室 学习本文须要先准备的知识点:队列(或数组).类与对象.线程.InputStream和OutputStream的使用.jav ...

  2. java聊天室(实训项目)

    这里是我们实训的一个关于java聊天室的项目,有需要的同学可以看看,私聊功能未完善. 话不多说,直接上代码. 服务器: package ChatRoom;import java.awt.Color; ...

  3. Java聊天室的设计与实现

    Java聊天室系统主要用于实现在线聊天,基本功能包括:服务端和客户端.本系统结构如下: (1)服务端: 1.能够开启和关闭服务器 2.等待着客户端从特殊端口发送的请求 3.监听的端口并不是固定的,服务 ...

  4. java聊天室论文,JAVA聊天室毕业论文

    JAVA聊天室毕业论文 毕业设毕业设计计 姓 名 学 号 系 部 信息工程系信息工程系 专 业 软件技术软件技术 设计题目 聊天室(聊天室(JavaJava)) 指导教师 职 称 2012 年 07 ...

  5. Java聊天室项目GUI界面化实现(Java聊天室 IO流 Socket流 GUI界面 )

    Java聊天室项目GUI界面化实现(Java聊天室 IO流 Socket流 GUI界面 ) 文章目录 Java聊天室项目GUI界面化实现(Java聊天室 IO流 Socket流 GUI界面 ) 1.J ...

  6. java 聊天室之 传送图片文字等功能的实现

    前几日写的一篇简陋之极的java聊天室被各位前辈说是,一塌糊涂,乌烟瘴气,只是简单的实现了需要的功能,并未做到人性化.在下痛定思痛,心想还是先学会显示功能再做美化界面,美化代码的打算! 在奋斗了一天之 ...

  7. Java聊天室程序源码 Java即时通讯代码 Java局域网聊天系统 Java即时通讯 Java聊天系统

    Java聊天室程序源码 Java即时通讯代码 Java局域网聊天系统  Java即时通讯 Java聊天系统 public Swingtest002() {// 设置标题setTitle("请 ...

  8. java 聊天室之 传送图片文字等功能的实现

    前几日写的一篇简陋之极的java聊天室被各位前辈说是,一塌糊涂,乌烟瘴气,只是简单的实现了需要的功能,并未做到人性化.在下痛定思痛,心想还是先学会显示功能再做美化界面,美化代码的打算! 在奋斗了一天之 ...

  9. [java聊天室]多个客户端与服务器说话多线程(二)

    多客户端链接 之前(java聊天室一)只有第一个连接的客户端可以与服务端说话. 原因: 服务端只调用过一次accept方法,因此只有第一个客户端链接时服务端接受了链接并返回了Socket,此时可以与其 ...

  10. java聊天室 博客_java网络聊天室

    功能简述: 1.可以多用户登陆聊天室,用户可以选择私聊或者对所有人聊天.(这里时间关系仅实现群聊,私聊只要将私聊消息和群聊消息封装开来即可实现) 2.有人登陆聊天室时由系统通知所有在线用户,并刷新在线 ...

最新文章

  1. spring 框架学习(一)
  2. Go 语言编程 — 高级数据类型 — Map 集合
  3. 前端一HTML:一: 浏览器,服务器,请求报文
  4. 我们可以用SharePoint做什么
  5. SVN:安装svn进行上传和检出文件的常用命令
  6. 三菱FX 系列PLC 编程通信协议总览
  7. [转]跨域资源共享 CORS 详解
  8. NiceScroll接管iview table高度自适应变化
  9. Activiti6 下载安装
  10. 如何一次性保存html图片大小,保存网页图片的几种方法(批量)
  11. 大连IT产业解析(1布局篇)
  12. css简单画法,几种基本图形的CSS画法。(附源码)
  13. 获取图片外链的方法--网易相册
  14. 国家集训队论文分类整理(转)
  15. 如何利用springboot快速搭建一个消息推送系统
  16. python 爬取糗百
  17. 电脑上怎么发出电子版准考证
  18. 什么是restful?怎样用通俗的语言解释restful?
  19. Zabbix的SNMPTrap监控配置
  20. 李笑来《财富自由之路》读书笔记(Ⅰ)

热门文章

  1. 升级版DC/DC转换器有什么优点?
  2. ARMA 模型的参数估计 —— 增广最小二乘法
  3. DIY-希捷硬盘固件问题的解决方法
  4. 海洋磁力探测-G882海洋磁力仪内业处理软件MAP2000 操作指南
  5. Paxos算法原理与推导
  6. 墨迹天气html嵌入,墨迹天气怎么添加桌面插件
  7. 数学最重要 :一个经济博士的总结(常春藤)Ph.D
  8. 贝叶斯公式:通俗的理解
  9. 沙盒生存游戏:打造世界Craft the World Mac中文版
  10. Robocup 2D仿真足球机器人环境搭建(Ubuntu 16.04)