Java 聊天室实现
用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 聊天室实现相关推荐
- 多人群聊聊天室java_#java 聊天室(一)—— 实现一个简单Telnet多人群聊聊天室...
#java 聊天室(一)-- 实现一个简单Telnet多人群聊聊天室 学习本文须要先准备的知识点:队列(或数组).类与对象.线程.InputStream和OutputStream的使用.jav ...
- java聊天室(实训项目)
这里是我们实训的一个关于java聊天室的项目,有需要的同学可以看看,私聊功能未完善. 话不多说,直接上代码. 服务器: package ChatRoom;import java.awt.Color; ...
- Java聊天室的设计与实现
Java聊天室系统主要用于实现在线聊天,基本功能包括:服务端和客户端.本系统结构如下: (1)服务端: 1.能够开启和关闭服务器 2.等待着客户端从特殊端口发送的请求 3.监听的端口并不是固定的,服务 ...
- java聊天室论文,JAVA聊天室毕业论文
JAVA聊天室毕业论文 毕业设毕业设计计 姓 名 学 号 系 部 信息工程系信息工程系 专 业 软件技术软件技术 设计题目 聊天室(聊天室(JavaJava)) 指导教师 职 称 2012 年 07 ...
- Java聊天室项目GUI界面化实现(Java聊天室 IO流 Socket流 GUI界面 )
Java聊天室项目GUI界面化实现(Java聊天室 IO流 Socket流 GUI界面 ) 文章目录 Java聊天室项目GUI界面化实现(Java聊天室 IO流 Socket流 GUI界面 ) 1.J ...
- java 聊天室之 传送图片文字等功能的实现
前几日写的一篇简陋之极的java聊天室被各位前辈说是,一塌糊涂,乌烟瘴气,只是简单的实现了需要的功能,并未做到人性化.在下痛定思痛,心想还是先学会显示功能再做美化界面,美化代码的打算! 在奋斗了一天之 ...
- Java聊天室程序源码 Java即时通讯代码 Java局域网聊天系统 Java即时通讯 Java聊天系统
Java聊天室程序源码 Java即时通讯代码 Java局域网聊天系统 Java即时通讯 Java聊天系统 public Swingtest002() {// 设置标题setTitle("请 ...
- java 聊天室之 传送图片文字等功能的实现
前几日写的一篇简陋之极的java聊天室被各位前辈说是,一塌糊涂,乌烟瘴气,只是简单的实现了需要的功能,并未做到人性化.在下痛定思痛,心想还是先学会显示功能再做美化界面,美化代码的打算! 在奋斗了一天之 ...
- [java聊天室]多个客户端与服务器说话多线程(二)
多客户端链接 之前(java聊天室一)只有第一个连接的客户端可以与服务端说话. 原因: 服务端只调用过一次accept方法,因此只有第一个客户端链接时服务端接受了链接并返回了Socket,此时可以与其 ...
- java聊天室 博客_java网络聊天室
功能简述: 1.可以多用户登陆聊天室,用户可以选择私聊或者对所有人聊天.(这里时间关系仅实现群聊,私聊只要将私聊消息和群聊消息封装开来即可实现) 2.有人登陆聊天室时由系统通知所有在线用户,并刷新在线 ...
最新文章
- spring 框架学习(一)
- Go 语言编程 — 高级数据类型 — Map 集合
- 前端一HTML:一: 浏览器,服务器,请求报文
- 我们可以用SharePoint做什么
- SVN:安装svn进行上传和检出文件的常用命令
- 三菱FX 系列PLC 编程通信协议总览
- [转]跨域资源共享 CORS 详解
- NiceScroll接管iview table高度自适应变化
- Activiti6 下载安装
- 如何一次性保存html图片大小,保存网页图片的几种方法(批量)
- 大连IT产业解析(1布局篇)
- css简单画法,几种基本图形的CSS画法。(附源码)
- 获取图片外链的方法--网易相册
- 国家集训队论文分类整理(转)
- 如何利用springboot快速搭建一个消息推送系统
- python 爬取糗百
- 电脑上怎么发出电子版准考证
- 什么是restful?怎样用通俗的语言解释restful?
- Zabbix的SNMPTrap监控配置
- 李笑来《财富自由之路》读书笔记(Ⅰ)