📄 sconnect.java
字号:
import java.util.*;
import java.net.*;
import java.io.*;
import java.sql.*;
import java.awt.event.*;
class sConnect extends Thread//与客户端的连接
{
Socket inFromClient;
ObjectOutputStream streamToClient;
ObjectInputStream streamFromClient;
static Vector Mvector=new Vector(1,1);
static int Mtotl=0;
private int Mlocl=Mvector.size();
static Vector Clients=new Vector(1,1);
private String logonName;//线程所对应的登陆用户名
public sConnect(ServerSocket sers,Socket Client)
{
new Socking(sers);//当连接进行初始化时,创建新的等待线程(Socking),以供下一位用户连接
inFromClient=Client;
try
{
streamToClient=new ObjectOutputStream(inFromClient.getOutputStream());
streamFromClient=new ObjectInputStream(inFromClient.getInputStream());
waitForClient();
}
catch(Exception e)
{
System.out.println(inFromClient.getInetAddress().toString()+" 断开连接....\n"+e);
}
}
void waitForClient()//监听客户端发来的消息
{
while(true)
{
try
{
Message Mget=(Message)streamFromClient.readObject();
DoMessage(Mget);//处理
}
catch(Exception e)
{
for(int i=0;i<Clients.size();i++)
{
if(logonName.equals((String)Clients.elementAt(i)))
{
Clients.remove(i);
break;
}
}
System.out.println(inFromClient.getInetAddress().toString()+" "
+logonName+" Logon Out....\n 原因:"+e);
Message logonOut=new Message(new Users(),"[系统消息]: "+
logonName+"离开聊天室",8);
logonOut.user.Name=logonName;
saveMessage(logonOut);//将该线程所对应的客户离线消息存入容器
this.stop();
break;
}
}
}
void SendtoClient(Object toClient)//向客户端发送对象
{
try
{
streamToClient.writeObject(toClient);
}
catch(Exception e)
{
System.out.println("send back failed...."+e);
}
}
synchronized String CheckUser(Users info)//处理客户端的登录请求,并返回消息
{
try
{
Connection SqlCon=DriverManager.getConnection("jdbc:odbc:LocalServer","sa","1629");
Statement SqlState=SqlCon.createStatement();
ResultSet SqlRs=SqlState.executeQuery("select * from ChatRoom..Userlist");
while(SqlRs.next())
{
if(info.Name.equals(SqlRs.getString(1).trim()))
{
if(info.Password.equals(SqlRs.getString(2).trim()))
{
for(int i=0;i<Clients.size();i++)
{
if(info.Name.equals(Clients.elementAt(i)))
{
return "该用户已登陆";
}
}
return "登录成功";
}
else
{
return "密码错误";
}
}
}
return "用户名不存在";
}
catch(Exception e)
{
return "查询数据库出错";
}
}
synchronized String RegUser(Users info)//处理注册请求
{
String Named;
try
{
Connection SqlCon=DriverManager.getConnection("jdbc:odbc:LocalServer","sa","1629");
Statement SqlState=SqlCon.createStatement();
ResultSet SqlRs=SqlState.executeQuery("select * from ChatRoom..Userlist");
while(SqlRs.next())
{
Named=SqlRs.getString(1).trim();
if(info.Name.equals(Named))
{
return "用户名已在存";
}
}
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
try
{
Connection SqlCon=DriverManager.getConnection("jdbc:odbc:LocalServer","sa","1629");
PreparedStatement SqlPstate=SqlCon.prepareStatement(
"insert into ChatRoom..Userlist values(?,?)");
SqlPstate.setString(1,info.Name);
SqlPstate.setString(2,info.Password);
try
{
SqlPstate.executeUpdate();
return "注册用户成功";
}
catch(Exception e)
{
return "写入数据出错";
}
}
catch(Exception e)
{
return "写入数据出错"+e;
}
}
synchronized void saveMessage(Message cust)//将消息存入容器
{
Mvector.addElement(cust);
Mtotl++;
notifyAll();
}
public void run()
{
while(true)
{
while(Mlocl>=Mtotl)
{
try
{
this.sleep(444);//短时间睡眠,节省服务器资源
}
catch(Exception e)
{
System.out.println("wait failed....\n"+e);
}
}
while(Mlocl<Mtotl)
{
Message Mload=(Message)Mvector.elementAt(Mlocl++);
DoMessage(Mload);
}
}
}
synchronized void DoMessage(Message Mtodo)//处理接收到的消息或从容器中读取的消息
{
switch(Mtodo.type)
//case中,以break结束的,为即将发送的
//以return结束的,为不发送的(部分存入公共容器供所有线程读取)
{
case 1://连接请求 client -> here
{
Mtodo.message="连接服务器成功";
Mtodo.type=1;
System.out.println(inFromClient.getInetAddress().toString()+" Connected....");
break;
}
case 2://注册请求 client -> here
{
Mtodo.message=RegUser(Mtodo.user);
System.out.println(inFromClient.getInetAddress().toString()+" Reg OK.... ");
if(!Mtodo.message.equals("注册用户成功"))
{
Mtodo.type=0;
}
break;
}
case 3://登录请求 client -> here
{
Mtodo.message=CheckUser(Mtodo.user);
if(!Mtodo.message.equals("登录成功"))
{
Mtodo.type=0;
break;
}
else
{
logonName=Mtodo.user.Name;
System.out.println( inFromClient.getInetAddress().toString()+" "
+logonName+" Logon OK....");
Clients.addElement(logonName);
SendtoClient(Mtodo);
Message logonOK=new Message(Mtodo.user,"[系统消息]: "+
logonName+"进入聊天室",7);
saveMessage(logonOK);
}
return;
}
case 4://被接收的消息 client -> here
{
Mtodo.message="<"+Mtodo.user.Name+"> 对 <"+Mtodo.user.Password+"> 说: "
+Mtodo.message.replace("\n","").replace(" ","");
//String.replace("\n","")::将所有换行符"\n"过滤掉
//String.replace(" ","")::将所有分格符(由TAB键产生)过滤掉
Mtodo.type=5;
saveMessage(Mtodo);
return;
}
case 5://即将发送的非私聊的消息,client -> case 4 -> vector -> here
{
break;
}
case 6://获取用户列表的请求 client -> here
{
SendtoClient(Clients);//返回客户端当前在线用户列表,并启动线程
this.start();
return;
}
case 7://即将发送的上线通告 client -> case 3 new -> vector -> here
{
if(Mtodo.user.Name.equals(logonName))//不发送给该用户本身
return;
break;
}
case 8://即将发送的离线通告 waitforclient().catch -> vector -> here
{
break;
}
case 9://被接收的私聊消息 client -> here
{
Mtodo.message="<"+Mtodo.user.Name+"> 悄悄对 <"+Mtodo.user.Password+"> 说: "
+Mtodo.message.replace("\n","").replace(" ","");
Mtodo.type=10;
saveMessage(Mtodo);
return;
}
case 10://即将转发的私聊消息 client -> case9 -> vector -> here
{
if(Mtodo.user.Name.equals(logonName)||Mtodo.user.Password.equals(logonName))
{//只发送给与该私聊消息相关的两个客户端
break;
}
else
{
return;
}
}
}
SendtoClient(Mtodo);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -