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

📄 server.java

📁 照书上做的JIM软件,不过不知道为什么还不能运行.要是能调出来功能绝对完善
💻 JAVA
字号:
//Server 类
import java.io.*;
import java.net.*;
import java.sql.*;
import java.util.Vector;

class ServerThread extends Thread
{
	
static String odbcDnsStr="jdbc:odbc:JIM";
//定义ODBC数据源

String user;//访问数据库用户名

String password;//访问数据库口令

private Socket socket;//定义套接字

private BufferedReader in;//定义输入流

private PrintWriter out;//定义输出流
//线程构造函数
   public ServerThread( String dbServerUser,String dbServerPassword,Socket s) throws 
  IOException 
   {
  	user=dbServerUser;
  	password=dbServerPassword;
  	socket=s;//取得传递参数
    in=new BufferedReader(new InputStreamReader(socket.getInputStream( )));
    //创建输入流
   
   out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream( ))),true);//创建输出流
   start( );//启动线程
   }
//处理用户登陆方法
public void processLogin( )
{
	try 
	{ 
	  Connection c=DriverManager.getConnection(odbcDnsStr,user,password);
	  String sql="SELECT NickName,Password FROM Im WHERE ImNo=?";
	  PreparedStatement prepare=c.prepareCall(sql);
	  Sring ImNo=in.readLine( );//取得输入的ImNo
	  int g=Integer.parseInt(ImNo);
	  String passwd=in.readLine( ).trim( );//取得输入的密码
	  prepare.clearParameters( );
	  prepare.setInt(1,g);//设定sql语句的参数
	  ResultSet r=prepare.executeQuery( );//执行数据库查询
	  if(r.next( ))
	  {
	  	String pass=r.getString("Password").trim( );
	  	//以下比较输入的号码与密码是否相同
	  	if(passwd.regionMatches(0,pass,0,pass.length( )))
	  	{
	  		out.println("OK");//如果密码相同就告诉客户OK
	  		out.println("用户名已经正常登陆!");
	  		//以下是注册用户的IP地址
	  		String setip="UPDATE Im SET Ip=?  WHERE  ImNo=?";
	  		PreparedStatement prest=c.prepareCall(setip);
	  		prest.clearParameters();
	  		prest.setString(1,socket.geInetAddress( ).getHostAddress( ));
	  		prest.setInt(2,g);
	  		int set=prest.executeUpdate( );
	  		//以下是更新数据库用户为在线
	  		String Online="UPDATE Im SET Online =1 WHERE ImNo=?";
	  		PreparedStatement prest2=c.prepareCall(Online);
	  		prest2.clearParameters( );
	  		prest2.setInt(1,g);
	  		int set2=prest2.executeUpdate();
	  		}
	  		else                                //若密码不同告诉客户登陆失败
	  		{
	  			out.println("FALSE");
	  			out.println("用户名的密码不正确!");
	  			}
	  			r.close();
	  			c.close();
	  			
	  		}
	  		else
	  		{
	  			out.println("FALSE");
	  			out.println("用户名不存在!");
	  			r.close();
	  			c.close();
	  			}
	  	}
	  	catch(Exception e)                      //若有其他异常发生
	  	{
	  		out.println("FALSE");
	  		out.println("服务器访问数据库出错!");
	  		}
	  }
	  		
	  		
//	处理用户注册方法
public void processNew( )
{
	try 
	   {
	   	//通过指定的数据源、用户名和口令建立与数据库的连接
	    Connection c=DriverManager.getConnection(odbcDnsStr,user,password);
	    //下面的代码将获取未使用的JIM号
	    int no=0;
	    String getImNo="SELECT MAX(ImNo) FROM Im";
	    PreparedStatement prepare3=c.prepareCall(getImNo);
	    ResultSet r=prepare3.executeQuery( );
	    while(r.next( ))
	    { 
	      no=r.getInt(1);
	      
	    }
	    no++;
	    //将用户信息添加到数据库中
	    String newsql="INSERT INTO Im(ImNo,NickName,Password,Face,Sex,Age,EMail,HomePage,Phone,Resume)values(?,?,?,?,?,?,?,?,?,?)";
	    PreparedStatement prepare=c.prepareCall(newsql);
	    //从输入流中接收客户端发送过来的用户注册信息
	    String nickname=in.readLine( ).trim( );
	    String password=in.readLine( ).trim( );
	    int face=Integer.parseInt(in.readLine( ));
	    int sex=Integer.parseInt(in.readLine( ));
	    int age=Integer.parseInt(in.readLine( ));
	    String email=in.readLine( ).trim( );
	    String homepage=in.readLine( ).trim( );
	    String phone=in.readLine( ).trim( );
	    String resume=in.readLine( ).trim( );
	    //以下为查询语句准备参数
	    prepare.clearParameters( );
	    prepare.setInt(1,no);
	    prepare.setString(2,nickname);
	    prepare.setString(3,password);
	    prepare.setInt(4,face);
	    prepare.setInt(5,sex);
	    prepare.setInt(6,age);
	    prepare.setString(7,email);
	    prepare.setString(8,homepage);
	    prepare.setString(9,phone);
	    prepare.setString(10,resume);
	    int r2=prepare.executeUpdate( );//执行数据库添加操作
	    //向客户端返回用户的JIM号,并返回操作状态OK
	    out.println(no);
	    out.println("OK");
	    c.close();
	    }
	    catch (Exception e)//当注册操作失败时,返回-1和操作状态FALSE
	    {
	     e.printStackTrace( );
	     out.println("-1");
	     out.println("FALSE");
	     }
	   }
	     
	//  处理用户查寻所有好友方法  
public void processFriend( )
{
	try
	  { 
       Connection c=DriverManager.getConnection(odbcDnsStr,user,password);
       String friend="SELECT Friend FROM Friend WHERE ImNo=?";
       PreparedStatement prepare=c.prepareCall(friend);
       prepare.clearParameters( );
       int ImNo=Integer.parseInt(in.readLine( ));//读取用户JIM号
       prepare.setInt(1,ImNo);
       ResultSet r=prepare.executeQuery( );
       Vector friendNo=new Vector( );       //用户保存好友JIM号码
       while( r.next( ))
       {
       	//保留好友JIM号码
       	friendNo.add(new Integer(r.getInt(1)));
       }
       r.close();
       //以下对所有的好友进行查询其详细信息并返回给客户端
       for(int i=0;i<friendNo.size( );i++)
       {
       	
       	//以下为查询好友的详细信息
       	String friendinfo="SELECT NickName,Face,Sex,Age,Ip,RPort,Online,EMail,HomePage,Phone,Resume FROM Im WHERE ImNO=?";
       	PraparedStatement prepare2=c.prepareCall(friendinfo);
       	prepare2.clearParameters( );
       	prepare2.setObject(1,friendNo.get(i));
       	ResultSet rr=prepare2.executeQuery( );
       	boolean Online;
       	if(rr.next( ))        //以下将好友的详细信息返回给客户端
       	{
       	  out.println(rr.getString("NickName").trim( ));
          out.println(friendNo.get(i));
          out.println(rr.getInt("Face"));
          out.println(rr.getInt("Sex"));
          out.println(rr.getInt("Age"));
          out.println(rr.getString("IP").trim( ));
          out.println(rr.getInt("RPort"));
          Online=rr.getBoolean("Online");
          if(Online)out.println("1");
          else{out.println("0");}
          
        
         out.println(rr.getString("EMail").trim( ));
         out.println(rr.getString("HomePage").trim( ));
         out.println(rr.getString("Phone").trim( ));
         out.println(rr.getString("Resume").trim( ));
       	}
       	rr.close( );
       	}
       	out.println("OVER");            //用户好友信息发送完毕
       	c.close( );
       	}
       	catch(Exception e)
       	{
       		e.printStackTrace( );
       	 
       	}
      }
//处理用户增加好友方法
 public void processAddNewFriend( )
       	{
       		try
       		{
       			Connection c=DriverManager.getConnection(odbcDnsStr,user,password);
       			int friendImNo=Integer.parseInt(in.readLine( ));//读取好友的JIM号
       			int myImNo=Integer.parseInt(in.readLine( ));//读取用户的JIM号
       			
       			//以下为查询好友是否存在
       			String sqlStr="SELECT ImNo FROM Im WHERE ImNO=?";
       			PreparedStatement prepare=c.prepareCall(sqlStr);
       			prepare.clearParameters();
       			prepare.setInt(1,friendImNo);
       			ResultSet rr=prepare.executeQuery();
       			if(!rr.next( ))
       			{
       				//若好友不存在,向客户端返回错误信息。
       				out.println("FALSE");
       			    out.println("这个JIM编号的人不存在!");
       			    return;
       			}
       			rr.close( );
       			prepare.cancel( );
       			
       			//以下为判断好友0是否已经被加
       			sqlStr="SELECT ImNo,Friend FROM Friend WHERE ImNo=? AND Friend=?";
       			prepare=c.prepareCall(sqlStr);
       			prepare.clearParameters( );
       			prepare.setInt(1,myImNo);
       			prepare.setInt(2,friendImNo);
       			rr=prepare.executeQuery();
       			if(rr.next( ))
       			{
       				//好友已经被加,向客户端返回错误信息
       				out.println("FALSE");
       				our.println("该朋友已经加入了!");
       				return;
       				
                }
                rr.close( );
                prepare.cancel( );
                
                //以下为加好友的操作
                sqlStr="Insert INTO Friend values(?,?)";
                prepare=c.prepareCall(sqlStr);
                prepare.clearParameters( );
                prepare.setInt(1,myImNo);
                prepare.setInt(2,friendImNo);
                int r=0;
                r=prepare.executeUpdate();
                if(r!=1)
                {
                	//若加好友操作出错,向客户端返回提示信息
                	out.println("FALSE");
                	out.println("加入好友时操作数据库出现错误!");
                	
                }
                else
                {
                	//以下为查询好友的详细信息,并返回个客户端
                String friendInfoSql="SELECT NickName,Face,Sex,Age,Ip,RPort,Online,EMail,HomePage,Phone,Resume FROM Im WHERE ImNo=?";
                prepare=c.prepareCall(friendInfoSql);
                prepare.clearParameters( );
                prepare.setInt(1,friendImNo);
                
                rr=prepare.executeQuery();
                boolean Online;
                if(rr.next())          //向客户端返回好友的详细信息
                {
                	out.println(rr.getString("NickName").trim());
                	out.println(friendImNo);
                	out.println(rr.getInt("Face"));
                	out.println(rr.getInt("Sex"));
                	out.println(rr.getInt("Age"));
                	out.println(rr.getString("Ip").trim( ));
                	
                	out.println(rr.getInt("RPort"));
                	Online=rr.getBoolean("Online");
                	if(Online)  out.println("1");
                	else {out.println("0");}
                	out.println(rr.getString("EMail").trim( ));
                	out.println(rr.getString("HomePage").trim( ));
                	out.println(rr.getString("Phone").trim());
                    out.println(rr.getString("Resume").trim());
                }
                else
                {//若查询好友详细信息时出错,则向客户端返回错误信息,,并从好友表中删除该好友
                	
                	out.println("FALSE");
                	out.println("好友数据不存在!");
                	String delFriendStr="DELETE Friend WHERE ImNo=? AND Friend=?";
                	prepare=c.prepareCall(delFriendStr);
                	prepare.clearParameters( );
                	prepare.setInt(1,myImNo);
                	prepare.setInt(2,friendImNo);
                	r=prepare.executeUpdate( );
                }
                rr.close( );
                out.println("OVER");  //向客户端返回一个结束信息
              }
              c.close( );
            }
            catch(Exception e)
            {
            	e.printStackTrace( );
            }
          }
 //处理用户删除好友方法
  public void processDelFriend( )
 {
	try
	{
        Connection c=DriverManager.getConnection(odbcDnsStr,user,password);
        int friendImNo=Integer.parseInt(in.readLine( ));
        int myImNo=Integer.parseInt(in.readLine( ));
        String sqlStr="DELETE FROM Friend WHERE ImNo=? and Friend=?";
        PreparedStatement prepare=c.prepareCall(sqlStr);
        prepare.clearParameters( );
        prepare.setInt(1,myImNo);
        prepare.setInt(2,friendImNo);
        int  r=0;
        r=prepare.executeUpdate( );
        c.close( );
      }
      catch (Exception e)
      {
      	e.printStackTrace( );
      	}
     }
 //处理用户退出的方法
 public void processLogout( )
 {
 	try
 	{
      Connection c=DriverManager.getConnection(odbcDnsStr,user,password);
      int ImNo=Integer.parseInt(in.readLine( ));
      String Online="UPDATE Im SET Online=0,IP='',RPort=-1 WHERE ImNo=?";
      PreparedStatement prep=c.prepareCall(Online);
      prep.clearParameters( );
      prep.setInt(1,ImNo);
      int r=prep.executeUpdate( );
      c.close( );
    }
    catch (Exception e)
    {
    	e.printStackTrace( );
     }
     
 
//处理用户登陆UDP通讯端口的方法

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -