首页 聊天室代码

聊天室代码

举报
开通vip

聊天室代码/**建数据库*/ if EXISTS(select*from sysdatabases where name='ChatRoom') drop database ChatRoom create database ChatRoom on primary( name='ChatRoom_data', filename='F:\JAVA\JAVA高级\聊天室\Data\ChatRoom_data.mdf', size= 5mb, maxsize= 100mb, filegrowth= 15% ) ...

聊天室代码
/**建数据库*/ if EXISTS(select*from sysdatabases where name='ChatRoom') drop database ChatRoom create database ChatRoom on primary( name='ChatRoom_data', filename='F:\JAVA\JAVA高级\聊天室\Data\ChatRoom_data.mdf', size= 5mb, maxsize= 100mb, filegrowth= 15% ) log on ( name='ChatRoom_log', filename='F:\JAVA\JAVA高级\聊天室\Data\ChatRoom_data.ldf', size= 2mb, filegrowth= 1mb ) go use ChatRoom GO /**建表*/ drop table chatMsg create table chatMsg( msg_id int identity (1,1), client_IP varchar(20), client_msg varchar(500) ) /**创建存储过程*/ if exists(select*from sysobjects where name='p_chatMsg_Add') drop proc p_chatMsg_Add go create proc p_chatMsg_Add @sIP varchar(20), @sMsg varchar(500) as begin insert into chatMsg(client_IP,client_msg)values (@sIP,@sMsg) end select*from chatMsg package com.cn.ChatRoomServer; import java.util.ArrayList; public class Broadcast implements Runnable { ArrayList clientList; ArrayList clientOtherList; @Override public void run() { // 广播 while (true) { try { checkCommIsUnline(); //检查是否下线 broadcast(); //调用广播方法 Thread.sleep(200); } catch (Exception e) { // e.printStackTrace(); } } } /** * 检查是否下线 */ public void checkCommIsUnline(){ for(Commiuncation comm:clientList){ //遍历clientList集合 if(comm.bStop){ clientList.remove(comm); //移除客户端通信对象 clientOtherList.remove(comm); continue; } } } //客户端消息集合,获取每个人的消息 public Broadcast(ArrayList clientList) { this.clientList = clientList; this.clientOtherList = clientList; /** * 广播方法 * @throws Exception */ private void broadcast() throws Exception { if (clientList == null || clientList.size() == 0) { //判断集合是否为空 return; } //找到所有消息 for (Commiuncation comm : clientList) { if (comm == null || comm.clientMsgList == null || comm.clientMsgList.size() == 0) { continue; } for (String sMsg : comm.clientMsgList) { if (clientOtherList == null || clientOtherList.size() == 0) { continue; } //发送消息给其他人 for (Commiuncation commOther : clientOtherList) { if (commOther == null) { continue; } if (commOther != comm) {//调用发送信息方法 commOther.SendMsg(comm.socket.getInetAddress() + "说:" + sMsg); } } } comm.clientMsgList.removeAllElements(); //清空所有消息记录} } } package com.cn.ChatRoomServer; import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.Socket; import java.sql.Types; import java.util.Vector; * * @author Administrator * */ public class Commiuncation implements Runnable { Socket socket = null; DataInputStream dis = null; DataOutputStream dos = null; Vector clientMsgList = new Vector();//储存当前客户端对象的消息(泛型) public boolean bStop = false; //判断是否停止下线 /** * 下线 * @throws Exception */ public void stop() throws Exception{ //stop()方法 bStop = true; System.out.println(socket.getInetAddress()+"下线了"); dos.close(); dis.close(); socket.close(); //关闭socket } public Commiuncation(Socket socket) { this.socket = socket; //当前通信对象 } @Override public void run() { while (!bStop) { try { ReciveMsg(); //调用接收信息 Thread.sleep(200); } catch (Exception e) { System.out.println(socket.getInetAddress()+"下线了"); if(!bStop){ try { stop(); //调用下线方法 } catch (Exception e1) { } } } } } /** * 接收消息 * @throws Exception */ public void ReciveMsg() throws Exception { //接收信息的方法 dis = new DataInputStream(socket.getInputStream()); String sData = dis.readUTF(); System.out.println("客户端说:"+sData); if (sData != null) { if("bye".equals(sData)){ sData = socket.getInetAddress()+"下线了"; stop(); } clientMsgList.add(sData); } try{ DBHelp.getSqlServerConn(); //调用DBHelp方法连接数据库 String[] paramValues = {socket.getInetAddress().toString(),sData}; //客户端地址,消息记录集合 DBHelp.execProcedure("{?=call p_chatMsg_Add(?,?)}", Types.INTEGER, paramValues);//调用数据库中的存储过程 DBHelp.closeDB(); //关闭数据库 }catch(Exception e){ System.out.println("保存记录失败"); } } /** * 发送消息 * @param msg * @throws Exception */ public void SendMsg(String msg) throws Exception { //此方法可在广播时调用dos = new DataOutputStream(socket.getOutputStream()); dos.writeUTF(msg); dos.flush(); } } package com.cn.ChatRoomServer; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class DBHelp { //接口 static Connection conn; static Statement stmt; static ResultSet rs; static CallableStatement cstmt; static final String SQL_URL = "jdbc:sqlserver://localhost:1433;DatabaseName=ChatRoom;user=sa;password=123"; /** * 连接数据库 * @throws Exception */ public static void getSqlServerConn() throws Exception { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");//连接到数据库 conn = DriverManager.getConnection(SQL_URL); //加载驱动 stmt = conn.createStatement(); } /** * 执行存储过程 * @param sql * @param returnType * @param paramValues * @return * @throws Exception */ public static int execProcedure(String sql, int returnType, String[] paramValues) throws Exception { int iFlag = 0; cstmt = conn.prepareCall(sql); if (returnType != -1) { cstmt.registerOutParameter(1, returnType); } if (paramValues != null && paramValues.length > 0) { for (int i = 0; i < paramValues.length; i++) { cstmt.setString(i + 2, paramValues[i]); } } cstmt.executeUpdate(); if (returnType != -1) { iFlag = cstmt.getInt(1); } return iFlag; } /** * 关闭数据库 * @throws Exception */ public static void closeDB() throws Exception { //关闭数据库的方法 if (rs != null) { //如果结果集不为空,就关闭rs.close(); rs = null; } if (cstmt != null) { cstmt.close(); cstmt = null; } if (stmt != null) { stmt.close(); stmt = null; } if (conn != null) { conn.close(); conn = null; } } } package com.cn.ChatRoomServer; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; public class Server implements Runnable { private static final int PORT = 9999; //指定默认端口(常量不可改) protected static ServerSocket serversocket = null; //静态main方法需静态变量protected Socket socket = null; //一个客户端需一个socket ArrayList clientList = new ArrayList(); //客户端消息集合 Commiuncation comm = new Commiuncation(socket); //指定一个新的通信对象 public static void main(String[] args) { System.out.println("欢迎使用聊天室"); try { serversocket = new ServerSocket(PORT); DBHelp.getSqlServerConn(); //调用DBHelp的getSqlServerConn连接数据库 new Thread(new Server()).start(); //启动服务线程 System.out.println("服务器已启动..."); } catch (Exception e) { System.out.println("服务器启动失败"); } } @Override public void run() { while(true){ try { listener(); //使用循环,不断监听客户端 // return; } catch (Exception e) { e.printStackTrace(); } // finally{ // System.out.println("A"); // } } } /** * 监听端口 * @throws Exception */ //封装方法,方便调用 private void listener() throws Exception { socket = serversocket.accept(); //接收客户端连接 String sMsg = socket.getInetAddress()+"已上线..."; System.out.println(sMsg); //输出上线消息 Commiuncation comm = new Commiuncation(socket); comm.clientMsgList.add(sMsg); //添加信息到clientMsgList集合中 clientList.add(comm); //添加客户端消息到clientList集合中 new Thread(comm).start(); //启动一个新的线程 Thread.sleep(200); new Thread(new Broadcast(clientList)).start(); //启动广播线程,广播消息} }
本文档为【聊天室代码】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_995397
暂无简介~
格式:doc
大小:39KB
软件:Word
页数:19
分类:互联网
上传时间:2019-05-23
浏览量:14