⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sconnect.java

📁 用JAVA写的聊天室程序
💻 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 + -