通过java建立一个简单的聊天室,可以实现多个客户端的通信:
一共分为五个类:
ChatServer类:建立一个服务器并让服务器处于等待状态
package 服务器v1.a0; import java.net.ServerSocket; import java.net.Socket; public class ChatServer{ public void SetUpServer(int port){ try { //建立绑定在指定端口上的服务器对象 ServerSocket server= new ServerSocket(port); System.out.println("服务器运行成功"+port); //让服务器始终处于等待状态:阻塞状态 while(true){ Socket client=server.accept(); //进行多线程任务使服务器同时接受多客户端信息 ChatThread ct = new ChatThread(client); ct.start(); } }catch(Exception ef){ ef.printStackTrace(); } } public static void main(String[] args){ ChatServer ct=new ChatServer(); ct.SetUpServer(9090); } }
ChatThread类:可以验证用户,通过多线程实现多客户端之间的通信,并实现字符串的输入
package 服务器v1.a0; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.Socket; public class ChatThread extends Thread{ private Socket client; private UserInfo user; private OutputStream out; public UserInfo getOwerUser(){ return user; } public ChatThread(Socket client){ this.client = client; } public void sendMsgToMe(String msg){ try{ msg+="\r\n"; out.write(msg.getBytes());//用输出对象发送数据 //取得组成这个字符串的字节 out.flush();//强制输出 }catch(Exception ef){ } } public void run(){ try { //从连接对象上得到输入流对象 out = client.getOutputStream(); InputStream in=client.getInputStream(); String s="欢迎来javaKe.com\r\n"; BufferedReader brd=new BufferedReader(new InputStreamReader(in)); sendMsgToMe("欢迎你来聊天!请输入你的用户名:"); String userName=brd.readLine(); sendMsgToMe(userName+",请输入你的密码:"); String pwd=brd.readLine(); user=new UserInfo(); user.setName(userName); user.setPwd(pwd); // System.out.println("user的名字"+user.getName()); // System.out.println("user的密码"+user.getPwd()); System.out.println(user); boolean loginState=DaoTools.checkLogin(user); if(!loginState){//不存在这个用户账号则关闭 client.close(); return ; } ChatTools.addClient(this); String inputs=brd.readLine(); while(!inputs.equals("#")){//当遇到‘#’时关闭与客户端的连接 System.out.println("客户端发过来的消息是"+inputs); s="服务器收到"+inputs+"\r\n"; ChatTools.castMsg(this.user, inputs); inputs= brd.readLine();//读取下一条 } sendMsgToMe(s); client.close(); } catch (Exception e) { e.printStackTrace(); } } //创建一个字符串缓冲区 private String readString(InputStream in) throws Exception{ StringBuffer stb=new StringBuffer(); char c=0; while(c!=10){ //遇到一个换行,就是一句话 int i=in.read();//读取客户机发来的一个字节 c=(char)i;//将输入的字节转换成char型 stb.append(c);//将读到的一个字符加到字符串缓冲区中 } //将读到的字符串转为字符串,并调用trim去掉尾部的空格 String inputs=stb.toString().trim(); return inputs; } }
ChatTools类:实现发送消息的方法
package 服务器v1.a0; import java.util.List; import java.util.ArrayList; public class ChatTools { private static List<ChatThread> stList=new ArrayList(); public static void addClient(ChatThread ct){ //通知己在线用户,有人上线了: castMsg(ct.getOwerUser(),"我上线啦!目前人数"+stList.size()); stList.add(ct);//将这个处理线程对象加入到队列中 } public static void castMsg(UserInfo sender,String msg){ msg=sender.getName()+"说:"+msg; for(int i=0;i<stList.size();i++){ ChatThread st=stList.get(i); //ChatThread类中定义有一个将消息发送出去的方法 st.sendMsgToMe(msg);//发消息给每一个客户机 } } }
DaoTools类:实现验证用户的方法
package 服务器v1.a0; import java.util.HashMap; public class DaoTools { /** * 查看这个用户是否可以登录成功! * @param user :要检查的用户对象 * @return:是否登录成功 */ public static boolean checkLogin(UserInfo user){ //在此只验证用户名是否存在 if(userDB.containsKey(user.getName())){ return true; } System.out.println("认证失败!: "+user.getName()); return false; } //内存用户信息数据库 private static java.util.Map<String, UserInfo> userDB=new HashMap(); //静态块:模拟生成内存中的用户数据,用户名为user1~10 //当程序启动时,这段代码(静态块中的)会自动执行,向userDB中存放数据 static{ for(int i=0;i<10;i++){ UserInfo user=new UserInfo(); user.setName("user"+i); System.out.println("输完用户名"+i); user.setPwd("pwd"+i); System.out.println("输完密码"+i); userDB.put(user.getName(), user); } } }
UserInfo类:保存用户信息
package 服务器v1.a0; public class UserInfo { private String name;//用户名 private String pwd;//密码 private String logictime;//登陆时间 private String address;//登陆地址 public void setName(String name){ this.name=name; } public String getName(){ return name; } public void setPwd(String pwd){ this.pwd=pwd; } public String getPwd(){ return pwd; } public void setLogicTime(String logictime){ this.logictime=logictime; } public String getLogicTime(){ return logictime; } public void setAddress(String address){ this.address=address; } public String getAddress(){ return address; } }
初步了解通信之后写的一个简单的聊天室,功能还不太完善,之后会实现客户端,以及中文输入的实现。
相关推荐
2.掌握Java 多线程的创建技术; 3.熟悉线程调度和控制技术; 4.能在程序中熟练应用Java 多线程技术; 5.熟悉Java C/S程序的结构和工作原理; 6.能开发客户端应用程序; 7.会编写服务器端多线程应用程序。 8.熟悉Java...
帮同学做的毕业设计-java版聊天室 实现了群聊,私聊,发送表情,传送文件,邮箱获取密码 还有一个mysql的数据表的创建sql我没有上传,自己创建一下就行了,但是顺序好像不是跟entity里面的usermodel顺序一致的。所以...
本代码运用了Java的socket网络编程技术,diamagnetic简单易懂,还添加了注释。适合初学者学习。
java基于tcp创建有图形用户界面聊天室
这是一个名为"Java聊天室程序"的源码文件包,它是基于Java语言开发的聊天室应用程序。这个程序可以作为计算机科学或相关领域的学生的毕业设计或课程设计项目。该程序的主要功能是实现用户之间的实时在线聊天,包括...
**Java聊天室程序** 是一个基于Java的聊天室应用,它允许多个用户在同一时间进行实时通信。该程序可以作为Java毕业设计项目,为学生提供了一个实践Java网络编程和多线程技术的机会。本资源介绍将围绕该项目的功能、...
寄存于环信的进入直播或其他过程中创建用户聊天室,自动注册环信账号创建聊天室
Java聊天室程序是一个基于Java技术的在线实时通信平台,允许用户在不同的设备上实时发送和接收消息。本程序采用JSP、Servlet、JDBC等技术进行开发,具备良好的可扩展性和可定制性,可以根据实际需求进行二次开发。 ...
通过Java的GUI来编写服务器和客服端来创建一个聊天室程序
【源码】基于Java的聊天室程序是一款功能丰富、易于扩展的Java后端开发资源源码包。该程序利用Java的强大功能,为开发者提供了一个构建实时聊天室的框架,为用户提供了一个便捷、高效的交流平台。 该聊天室程序基于...
JAVA基于局域网的聊天室系统(源代码+论文) 摘 要 视频聊天系统作为一种新型的通信和交流工具,突破了地域的限制,可以提供更为便捷、灵活、全面的音、视频信息的传递和服务,具有极其广泛的发展前景。 本文介绍了...
本聊天室命名为mfqq聊天室 主要用于局域网内的文本信息交流 在此聊天室中共有以下功能: 注册:直接输入用户名和密码就可成功注册并登录进入聊天室 登录:输入已注册的用户和密码即可进入聊天室 创建群聊:能够创建...
JAVA程序设计 多人聊天室 设计目的 Java 编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高 性能、多线程和静态的语言。本次课程设计旨在应用JAVA编程语言中的网络通信,多线 程,...
java亲加实现即时通讯,原理简单,简单可靠,聊天免费。
本文介绍了一款基于局域网的聊天室系统的设计和实现。该系统采用Java语言开发,使用Socket通信技术实现局域网内的实时聊天。 系统架构主要包括:客户端、服务端和数据库。客户端采用Swing技术开发,主要负责用户登陆、...
基于java的网络白板+聊天室+教育白板6个白板集合,资源丰富:多用户之间的信息共享,绘图区绘图共享,可以聊天并且发表情;用Java编写界面,用seversocket创建服务端,socket创建客户端,实现简单图形绘画和一对多...
利用java网络编程技术实现的聊天室 由服务器端和客户端,先运行service,创建Socket服务器,再运行客户端client,多线程实现的,能启动多个客户端实现聊天,服务器只需启动一次
系统采用的开发语言是java语言,因此运行此系统的环境搭建为java开发环境和开发平台即可。 数据库采用的是MySQL,轻量级易安装。系统内含相应的SQL脚本文件,只要运行即可获得相应数据库,无需手动创建。 建议安装...
使用mysql+Tomcat+jsp+servlet创建的javaweb聊天室,集成环境为eclipse运行,java1.8。百分百可运行
涉及 JAVA GUI Socket 且对JAVA的swing组件进行了扩展使用 <br> <br> <br> <br> <br> <br> <br> 注:语音聊天部分还未完成,还需要些时间:) <br> <br>1.运行服务器端需要你的机器上...