📄 server.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 + -