package Server;
import java.io.*;
import java.net.*;
import java.sql.*;
import java.util.Vector;
class ServerThread extends Thread{//继承线程
private Socket socket;//定义套接口
private BufferedReader in;//定义输入流
private PrintWriter out;//定义输出流
int no;//定义申请的jicq号码
public ServerThread(Socket s) throws IOException {//线程构造函数
socket=s;//取得传递参数
in=new BufferedReader(new InputStreamReader(socket.getInputStream()));//创建输入流
out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);//创建输出流
start();//启动线程
}
public void run(){//线程监听函数
try{
while(true){
String str=in.readLine();//取得输入字符串
if(str.equals("end")){System.out.println("receive 'end'");break;}//如果是结束就关闭连接
else if(str.equals("login")) {//如果是登录
try{
System.out.println("login");
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//连接数据库
Connection c=DriverManager.getConnection("jdbc:odbc:javaicq"," "," ");
String sql="select nickname,password,ip,status,pic,email,info,place,sex from icq where icqno=?";
//准备从数据库选择呢称和密码
PreparedStatement prepare=c.prepareCall(sql);//设定数据库查寻条件
String icqno=in.readLine();
int g=Integer.parseInt(icqno);//取得输入的jicq号码
System.out.println("the icpno login:"+icqno);
String passwd=in.readLine().trim();//取得输入的密码
System.out.println("the password received:"+passwd);
prepare.clearParameters();
prepare.setInt(1,g);//设定参数
ResultSet r=prepare.executeQuery();//执行数据库查寻
if(r.next()){//以下比较输入的号码于密码是否相同
String pass = r.getString("password").trim();
System.out.println("the password from database:" + pass);
//如果相同就告诉客户ok
//并且更新数据库用户为在线
//以及注册用户的ip 地址
if(passwd.regionMatches(0,pass,0,pass.length()))
{
//if (passwd.equals(pass)) {
System.out.println("password matched successfully");
//out.println("ok");
// System.out.println("send 'OK' to client");
//*************register ipaddress
String setip = "update icq set ip=? where icqno=?";
PreparedStatement prest = c.prepareCall(setip);
prest.clearParameters();
prest.setString(1, socket.getInetAddress().getHostAddress());
prest.setInt(2, g); //g为取得输入的jicq号码
int set = prest.executeUpdate();
System.out.println("update IP Status:"+set);
//*************ipaddress
//set status online
String status = "update icq set status=1 where icqno=?";
PreparedStatement prest2 = c.prepareCall(status);
prest2.clearParameters();
prest2.setInt(1, g); //g为取得输入的jicq号码
int set2 = prest2.executeUpdate();
System.out.println("set the icqno status online(1):"+set2);
//set online
out.println("ok");
System.out.println("send 'OK' to client,login finished");
//开始发送登录者的个人信息
out.println(r.getString("nickname"));
out.println(r.getString("ip"));
out.println(r.getString("status"));
out.println(r.getString("pic"));
out.println(r.getString("email"));
out.println(r.getString("info"));
out.println(r.getString("place"));
out.println(r.getString("sex"));
System.out.println("Send the loginer's info successfully");
}
//否者告诉客户失败
else {
System.out.println("password error!");
out.println("pwderror");/ send false
r.close();
c.close();
}
}
else{
System.out.println("the icqno is wrong,not in the db!");
out.println("usererror");/// send false
System.out.println("send false");
r.close();
c.close();
}
}catch (Exception e){
out.println("false");
e.printStackTrace();}
socket.close();break;
}//end login
//登录结束
//以下为处理客户的新建请求
else if(str.equals("new")){
try{
System.out.println("new");
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//连接数据库
Connection c2=DriverManager.getConnection("jdbc:odbc:javaicq"," "," ");
//以下为查询表icp的总人数
String totalSql="select * from icq";
Statement totalstmt=c2.createStatement();
ResultSet rsTotal=totalstmt.executeQuery(totalSql);
int total=0;
//System.out.println("whether is the first row:"+rsTotal.isFirst());
while(rsTotal.next()) total++;//tochange
rsTotal.close();
String newsql="insert into icq(nickname,password,email,info,place,pic,sex,ip,icqno) values(?,?,?,?,?,?,?,?,?)";
//准备接受用户的呢称,密码,email,个人资料,籍贯,头像等信息
PreparedStatement prepare2=c2.prepareCall(newsql);
String nickname=in.readLine().trim();
String password=in.readLine().trim();
String email=in.readLine().trim();
String info=in.readLine().trim();
String place=in.readLine().trim();
int picindex=Integer.parseInt(in.readLine());
String sex=in.readLine();/changed:add
String ip=in.readLine();/changed:add
prepare2.clearParameters();
prepare2.setString(1,nickname);
prepare2.setString(2,password);
prepare2.setString(3,email);
prepare2.setString(4,info);
prepare2.setString(5,place);
prepare2.setInt(6,picindex);
prepare2.setString(7,sex);//changed:add
prepare2.setString(8,ip);//changed:add
prepare2.setInt(9,total);//changed:add
int r3=prepare2.executeUpdate();//执行数据库添加
String sql2="select icqno from icq where nickname=?";//tochang:if two person has same name,
//the following will return two icqno.
//以下告诉客户其注册的号码
PreparedStatement prepare3=c2.prepareCall(sql2);
prepare3.clearParameters();
prepare3.setString(1,nickname);
ResultSet r2=prepare3.executeQuery();
while(r2.next()){
//out.println(r2.getInt(1));
no=r2.getInt(1);
System.out.println(no);
}
out.println(no);
out.println("ok");
c2.close();
//完毕
}catch (Exception e)
{e.printStackTrace();out.println("false");System.out.println("send false");}/ send false
socket.close();
}//end new
//新建用户结束
//以下处理用户查找好友
else if(str.equals("find")){
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection c3=DriverManager.getConnection("jdbc:odbc:javaicq"," "," ");
//以下连接数据库,并且返回其他用户的呢称,性别,籍贯,个人资料等信息
String cmd=in.readLine().toString();
if(cmd.equals("getonline")){
System.out.println("findOnlines");
String find =
"select nickname,sex,place,ip,email,info,pic,icqno from icq where status=true";
Statement st = c3.createStatement();
ResultSet result = st.executeQuery(find);
//查询所有在线信息的发送次序:nickname sex place ip email info icqno pic
while (result.next()) {
out.println(result.getString("nickname"));
out.println(result.getString("sex"));
out.println(result.getString("place"));
out.println(result.getString("ip"));
out.println(result.getString("email"));
out.println(result.getString("info"));
out.println(result.getString("icqno"));
out.println(result.getString("pic"));
} //while end
out.println("over");
c3.close();
//result.close(); //changed
}
else//查询特定用户
{ System.out.println("查询特定用户");
String findcondition=in.readLine().trim();
if(findcondition.equals("jicq"))//按jicq号查询
{
System.out.println("按JICQ查找");
int jicq = Integer.parseInt(in.readLine());
System.out.println("要查询的JICQ:"+jicq);
String find =
"select nickname,ip,status,pic,email,info,place,sex from icq where icqno=?";
PreparedStatement st = c3.prepareStatement(find);
st.clearParameters();
st.setInt(1,jicq);
ResultSet result = st.executeQuery();
//按JICQ查询信息的发送次序:nickname sex place ip email info jicq pic status
while (result.next()) {
out.println(result.getString("nickname"));
out.println(result.getString("sex"));
out.println(result.getString("place"));
out.println(result.getString("ip"));
out.println(result.getString("email"));
out.println(result.getString("info"));
out.println(jicq);
out.println(result.getString("pic"));
if(result.getBoolean("status"))
out.println("1");
else
out.println("0");
} //while end
out.println("over");
System.out.println("发送查询信息成功");
c3.close();
//result.close(); //changed
}//end if
if(findcondition.equals("nickname")){
System.out.println("按nickname查找");
String name = in.readLine().toString();
System.out.println("要查询的nickname:"+name);
String find =
"select nickname,sex,place,ip,email,info,pic,icqno,status from icq where nickname=?";
PreparedStatement st = c3.prepareStatement(find);
st.clearParameters();
st.setString(1,name);
ResultSet result = st.executeQuery();
//按nickname查询信息的发送次序:nickname sex place ip email info icqno pic
while (result.next()) {
out.println(result.getString("nickname"));
out.println(result.getString("sex"));
out.println(result.getString("place"));
out.println(result.getString("ip"));
out.println(result.getString("email"));
out.println(result.getString("info"));
out.println(result.getString("icqno"));
out.println(result.getString("pic"));
if(result.getBoolean("status"))
out.println("1");
else
out.println("0");
} //while end
out.println("over");
System.out.println("发送查询信息成功");
c3.close();
result.close(); //changed
}
if(findcondition.equals("email")){
System.out.println("按email查找");
String email = in.readLine().toString();
System.out.println("要查询的email:"+email);
String find =
"select nickname,sex,place,ip,email,info,pic,icqno,status from icq where email=?";
PreparedStatement st = c3.prepareStatement(find);
st.clearParameters();
st.setString(1,email);
ResultSet result = st.executeQuery();
//email信息发送次序:nickname sex place ip email info icqno pic
while (result.next()) {
out.println(result.getString("nickname"));
out.println(result.getString("sex"));
out.println(result.getString("place"));
out.println(result.getString("ip"));
out.println(result.getString("email"));
out.println(result.getString("info"));
out.println(result.getString("icqno"));
out.println(result.getString("pic"));
if(result.getBoolean("status"))
out.println("1");
else
out.println("0");
} //while end
out.println("over");
System.out.println("发送查询信息成功");
c3.close();
//result.close(); //changed
}
}
}catch (Exception e){e.printStackTrace();System.out.println("false");}
//socket.close();
} //查找好友结束
else if(str.equals("readinfo")){
try{
//System.out.println("friend");
System.out.println("readinfo");
System.out.println("begin to read friends'info");
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection c4=DriverManager.getConnection("jdbc:odbc:javaicq"," "," ");
//以下连接好友表,返回用户的好友名单
String friend="select friend,chatmsg from friend where icqno=?";
PreparedStatement prepare4=c4.prepareCall(friend);
prepare4.clearParameters();
int icqno=Integer.parseInt(in.readLine());
System.out.println("the icqno readed:"+icqno);
prepare4.setInt(1,icqno);
ResultSet r4=prepare4.executeQuery();
ResultSet r5;
Vector friendno=new Vector();//该矢量保存好友号码
Vector chatmsg=new Vector();
while(r4.next()){
friendno.add(new Integer(r4.getInt("friend")));
chatmsg.add(r4.getString("chatmsg"));
}
//以下告诉客户其好友的呢称,号码,ip地址,状态,头像,个人资料等信息
//out.println(friendno.size());
System.out.println("send client the no of friends:"+friendno.size());
for(int i=0;i<friendno.size();i++){
String friendinfo="select nickname,icqno,ip,status,pic,email,info,place,sex from icq where icqno=?";
PreparedStatement prepare5=c4.prepareCall(friendinfo);
prepare5.clearParameters();
prepare5.setInt(1,Integer.parseInt(friendno.get(i).toString()));
//prepare5.setInt(2 ,icqno);
r5=prepare5.executeQuery();
int index=0;
boolean status;
while(r5.next()){
out.println(r5.getString("nickname"));
out.println(r5.getInt("icqno"));
out.println(r5.getString("ip"));
status=r5.getBoolean("status");
if (status)out.println("1");
else {out.println("0");}
out.println(r5.getInt("pic"));
out.println(r5.getString("email"));
out.println(r5.getString("info"));
System.out.println("the indrx:"+index);
out.println(chatmsg.get(index).toString());
index++;
out.println(r5.getString("place"));
out.println(r5.getString("sex"));
} //while
}//for
//发送完毕
out.println("friendover");//changedfrom:"over"
System.out.println("send friendinfo over");
System.out.println("begin to getwhoaddme");
//连接数据库,根据我的号码,从好友表中选择谁加了我
//int myicqno=Integer.parseInt(in.readLine());
String getwhoaddme="select icqno,chatmsg from friend where friend=?";
PreparedStatement prepare6=c4.prepareCall(getwhoaddme);
prepare6.clearParameters();
prepare6.setInt(1,icqno);
ResultSet r6=prepare6.executeQuery();
Vector who=new Vector();
chatmsg.clear();
chatmsg=new Vector();
while(r6.next()){
who.add(new Integer(r6.getInt("icqno")));
chatmsg.add(r6.getString("chatmsg"));
}//end while
//下面处理筛选出 陌生人
Vector temp=(Vector)who.clone();
int s=who.size();
for (int i=0;i<s;i++){
for(int j=0;j<friendno.size();j++)
{ //System.out.println(who.get(i)+":"+friendno.get(j));
if(Integer.parseInt(friendno.get(j).toString())==Integer.parseInt(temp.get(i).toString())){
who.remove(i);
chatmsg.remove(i);
System.out.println("remove one unknown from friend");
}
}//end for
}//end for
//然后发送陌生人信息
// out.println(who.size());
for(int i=0;i<who.size();i++){
// String whoinfo="select nickname,icqno,ip,status,pic,email,info from icq where icqno=?";
String whoinfo="select nickname,icqno,ip,status,pic,email,info,place,sex from icq where icqno=?";
PreparedStatement prepare=c4.prepareCall(whoinfo);
prepare.clearParameters();
prepare.setInt(1,Integer.parseInt(who.get(i).toString()));
//prepare.setObject(2,who.get(i));
ResultSet r=prepare.executeQuery();
boolean status;
int index=0;
while(r.next()){
out.println(r.getString("nickname"));
out.println(r.getInt("icqno"));
out.println(r.getString("ip"));
status=r.getBoolean("status");
if (status)out.println("1");
else {out.println("0");}
out.println(r.getInt("pic"));
out.println(r.getString("email"));
out.println(r.getString("info"));
out.println(chatmsg.get(index).toString());
i++;
out.println(r.getString("place"));
out.println(r.getString("sex"));
} //while
r.close();
}//for
out.println("unknownsover");
System.out.println("Send unknownsinfo over");
c4.close();
//r6.close();//changed
}catch (Exception e){e.printStackTrace();out.println("false");System.out.println("false");}
}//end readreadinfo
//以下处理用户添加好友
else if(str.equals("addfriend")){
System.out.println("addfriend");
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection c6=DriverManager.getConnection("jdbc:odbc:javaicq"," "," ");
//连接数据库,根据接受的用户号码及好友号码向好友表添加记录
int friendicqno=Integer.parseInt(in.readLine());
System.out.println(friendicqno);
int myicqno=Integer.parseInt(in.readLine());
System.out.println(myicqno);
String addfriend="insert into friend values(?,?,?)";
PreparedStatement prepare6=c6.prepareCall(addfriend);
prepare6.clearParameters();
prepare6.setInt(1,myicqno);
prepare6.setInt(2,friendicqno);
prepare6.setString(3,"聊天记录");
int r6=0;
r6=prepare6.executeUpdate();
if(r6==1) System.out.println("ok addfrien");
else System.out.println("false addfriend");
}catch (Exception e){e.printStackTrace();System.out.println("false");}
//socket.close();
System.out.println("over addfriend");
}//end addfriend
//用户添加好友结束
//add new friend who add me
//以下处理其他用户如果加我,我就加他
else if(str.equals("addnewfriend")){
System.out.println("addnewfriend who add me");
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection c6=DriverManager.getConnection("jdbc:odbc:javaicq"," "," ");
//连接数据库,根据接受的用户号码及好友号码向好友表添加记录
int friendicqno=Integer.parseInt(in.readLine());
System.out.println(friendicqno);
int myicqno=Integer.parseInt(in.readLine());
System.out.println(myicqno);
String addfriend="insert into friend values(?,?)";
PreparedStatement prepare6=c6.prepareCall(addfriend);
prepare6.clearParameters();
prepare6.setInt(1,myicqno);
prepare6.setInt(2,friendicqno);
int r6=0;
r6=prepare6.executeUpdate();
if(r6==1) System.out.println("ok addfrien");
else System.out.println("false addfriend");
String friendinfo="select nickname,icqno,ip,status,pic,email,info from icq where icqno=?";
//如果成功,就向用户传递好友的基本信息,比如呢称等
PreparedStatement prepare5=c6.prepareCall(friendinfo);
prepare5.clearParameters();
prepare5.setInt(1,friendicqno);
ResultSet r5=prepare5.executeQuery();
boolean status;
while(r5.next()){
System.out.println("dsf");
out.println(r5.getString("nickname"));
out.println(r5.getInt("icqno"));
out.println(r5.getString("ip"));
status=r5.getBoolean("status");
if (status)out.println("1");
else {out.println("0");}
out.println(r5.getInt("pic"));
out.println(r5.getString("email"));
out.println(r5.getString("info"));
} //while
out.println("over");
r5.close();
c6.close();
}catch (Exception e){e.printStackTrace();System.out.println("false");}
System.out.println("over addnewfriend");
}//end addfriend
//结束处理其他用户如果加我,我就加他
//delete friend
//以下执行用户删除好友
else if(str.equals("delfriend")){
System.out.println("处理删除好友请求。。。");
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection c7=DriverManager.getConnection("jdbc:odbc:javaicq"," "," ");
//连接数据库,根据接受的用户号码及好友号码向好友表删除记录
int friendicqno=Integer.parseInt(in.readLine());
System.out.println(friendicqno);
int myicqno=Integer.parseInt(in.readLine());
System.out.println(myicqno);
String addfriend="delete from friend where icqno=? and friend=?";
PreparedStatement prepare7=c7.prepareCall(addfriend);
prepare7.clearParameters();
prepare7.setInt(1,myicqno);
prepare7.setInt(2,friendicqno);
int r7=0;
r7=prepare7.executeUpdate();
if(r7==1) System.out.println("ok delfrien");//成功
else System.out.println("false delfriend");//失败
}catch (Exception e){e.printStackTrace();System.out.println("del false");}
}//end delete friend
//执行用户删除好友结束
//以下处理用户退出程序
else if(str.equals("logout")){
try{
System.out.println("logout");
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection c8=DriverManager.getConnection("jdbc:odbc:javaicq"," "," ");
//连接数据库,根据接受的用户号码,将其状态字段设为0,及ip地址设为空
int myicqno=Integer.parseInt(in.readLine().toString());
System.out.println(myicqno);
String status="update icq set status=0 , ip=' ' where icqno=?";
PreparedStatement prest8=c8.prepareCall(status);
prest8.clearParameters();
prest8.setInt(1,myicqno);
int r8=prest8.executeUpdate();
if(r8==1)
{System.out.println("ok logout");break;}
else System.out.println("false logout");
}catch (Exception e){e.printStackTrace();System.out.println("logout false");}
} //处理用户退出程序结束
//处理上线结束
System.out.println("finished:"+str);
} //end while
//处理str="end"
System.out.println("Close Socket...");
this.socket.close();//changed:add
System.out.println("end thread...");
this.yield();//changed:add
}
catch(IOException e){}//捕或异常
finally {try{socket.close();}
catch(IOException e){}
}//end try
}//end run
}//end class ServerThread
//主服务器类
public class Server{
public static void main(String args[])throws IOException{
ServerSocket s=new ServerSocket(10000);//在10000端口创建套接口
System.out.println("Server start.."+s);
try{
while(true){
Socket socket=s.accept();//无限监听客户的请求
System.out.println("Connection accept:"+socket+"(new Socket created)");
System.out.println("HOST:"+socket.getInetAddress().getHostAddress());
try{new ServerThread(socket);//创建新线程
}
catch(IOException e){
System.out.println(e.getMessage());
socket.close();}
}
}finally{s.close();}//捕或异常
}//end main
}//服务器程序结束