聊天室代码/**建数据库*/
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,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。