1. 论坛系统升级为Xenforo,欢迎大家测试!
    排除公告

类似QQ程序的源码原理!

本帖由 notnull2006-02-24 发布。版面名称:源码讨论

  1. notnull

    notnull New Member

    注册:
    2005-09-27
    帖子:
    11,720
    赞:
    37
    代码:
    (1)用户的基本信息表(表名icq) 
    序号 字段名 含义 数据类型 NULL 
    1 Icqno 用户的号码 Int No 
    2 Nickname 用户的呢称 Char No 
    3 Password 用户的密码 Char No 
    4 Status 用户在线否 Bit No 
    5 Ip 用户的IP地址 Char Yes 
    6 Info 用户的资料 Varchar Yes 
    7 Pic 用户的头像号 Int Yes 
    8 Sex 用户性别 Char Yes 
    9 Email 用户的email Char Yes 
    10 Place 用户的籍贯 Char yes 
    其中Icqno字段为自动增加。(其他还可以添加诸如电话号码等字段作为更多选择) 
    (2)用户的好友表(表名friend) 
    序号 字段名 含义 数据类型 NULL 
    1 Icqno 用户的号码 Int No 
    2 Friend 好友的号码 Int No 
    1. 服务器程序: 
    服务器与客户间通过套接口Socket(TCP)连接。 
    在java中使用套接口相当简单,Java API为处理套接口的通信提供了一个类java.net.Socket. 
    ,使得编写网络应用程序相对容易.服务器采用多线程以满足多用户的请求,通过JDBC与后台数据库连接, 
    并通过创建一个ServerSocket对象来监听来自客户的连接请求,默认端口为8080, 
    然后无限循环调用accept()方法接受客户程序的连接 
    服务器程序代码如下:(部分) 
    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")) break;//如果是结束就关闭连接 
    else if(str.equals("login")) 
    {//如果是登录 
    try{ 
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//连接数据库 
    Connection c=DriverManager.getConnection("jdbc:odbc:javaicq"," "," "); 
    String sql="select nickname,password from icq where icqno=?"; //准备从数据库选择呢称和密码 PreparedStatement prepare=c.prepareCall(sql);//设定数据库查寻条件 
    String icqno=in.readLine(); 
    int g=Integer.parseInt(icqno);//取得输入的jicq号码 
    System.out.println(icqno); 
    String passwd=in.readLine().trim();//取得输入的密码 
    System.out.println(passwd); 
    prepare.clearParameters(); 
    prepare.setInt(1,g);//设定参数 
    ResultSet r=prepare.executeQuery();//执行数据库查寻 
    if(r.next()) 
    {//以下比较输入的号码于密码是否相同 
    String pass=r.getString("password").trim(); 
    System.out.println(pass); 
    if(passwd.regionMatches(0,pass,0,pass.length())){ 
    out.println("ok"); 
    //如果相同就告诉客户ok//并且更新数据库用户为在线 
    //以及注册用户的ip 地址 //*************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); int set=prest.executeUpdate(); 
    System.out.println(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); 
    int set2=prest2.executeUpdate(); 
    System.out.println(set2); //set online 
    }//否者告诉客户失败 
    else out.println("false");r.close();c.close();} 
    else{ out.println("false"); 
    System.out.println("false"); r.close(); c.close();} } 
    catch (Exception e){e.printStackTrace();} 
    socket.close(); }//end login //登录结束 //以下为处理客户的新建请求 
    else if(str.equals("new")){ 
    try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
    //连接数据库 
    Connection c2=DriverManager.getConnection("jdbc:odbc:javaicq"," "," "); 
    String newsql="insert into icq(nickname,password,email,info,place,pic) 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()); 
    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); 
    int r3=prepare2.executeUpdate();//执行数据库添加 
    String sql2="select icqno from icq where nickname=?";//以下告诉客户其注册的号码 
    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");} 
    socket.close(); }//end new //新建用户结束 //以下处理用户查找好友 
    else if(str.equals("find")){ 
    try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
    Connection c3=DriverManager.getConnection("jdbc:odbc:javaicq"," "," "); 
    //以下连接数据库,并且返回其他用户的呢称,性别,籍贯,个人资料等信息 
    String find="select nickname,sex,place,ip,email,info from icq"; 
    Statement st=c3.createStatement(); 
    ResultSet result=st.executeQuery(find); 
    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")); }//while end 
    out.println("over"); ////////GET ICQNO 
    int d,x;boolean y; 
    //以下返回用户的jicq号码,头像号,及是否在线 
    ResultSet iset=st.executeQuery("select icqno,pic,status from icq"); 
    while(iset.next()){ 
    d=iset.getInt("icqno"); 
    out.println(d); 
    x=iset.getInt("pic");//pic info 
    out.println(x); 
    y=iset.getBoolean("status"); 
    if (y){out.println("1");} 
    else {out.println("0");} // 
    System.out.println(d); } // end send jicqno 
    iset.close(); /////////icqno end 
    c3.close(); 
    result.close(); } 
    catch (Exception e){ 
    e.printStackTrace(); 
    System.out.println("false");} //socket.close(); }//end find 
    //查找好友结束 //以下处理用户登录时读取其好友资料 
    else if(str.equals("friend")){ 
    try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
    Connection c4=DriverManager.getConnection("jdbc:odbc:javaicq"," "," "); 
    //以下连接好友表,返回用户的好友名单 
    String friend="select friend from friend where icqno=?"; 
    PreparedStatement prepare4=c4.prepareCall(friend); 
    prepare4.clearParameters(); 
    int icqno=Integer.parseInt(in.readLine()); 
    System.out.println(icqno); 
    prepare4.setInt(1,icqno); 
    ResultSet r4=prepare4.executeQuery(); 
    Vector friendno=new Vector();//该矢量保存好友号码 
    while(r4.next()){ 
    friendno.add(new Integer(r4.getInt(1))); } //read friend info 
    //以下告诉客户其好友的呢称,号码,ip地址,状态,头像,个人资料等信息 
    out.println(friendno.size()); 
    for(int i=0;i String friendinfo="select nickname,icqno,ip,status,pic,email,info from icq where icqno=?"; 
    PreparedStatement prepare5=c4.prepareCall(friendinfo); 
    prepare5.clearParameters(); 
    prepare5.setObject(1,friendno.get(i)); 
    ResultSet r5=prepare5.executeQuery(); 
    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")); } //while 
    r5.close();}//for//发送完毕 
    out.println("over"); 
    System.out.println("over"); 
    c4.close(); 
    r4.close(); } 
    catch (Exception e){ 
    e.printStackTrace(); 
    System.out.println("false");} //socket.close(); }//end friend //读取好友信息完毕 
    //以下处理用户添加好友 
    else if(str.equals("addfriend")){ 
    System.out.println("add"); 
    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"); } 
    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("add"); 
    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("del"); 
    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{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
    Connection c8=DriverManager.getConnection("jdbc:odbc:javaicq"," "," "); //连接数据库,根据接受的用户号码,将其状态字段设为0,及ip地址设为空 
    int myicqno=Integer.parseInt(in.readLine()); 
    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"); 
    else System.out.println("false logout"); } 
    catch (Exception e){e.printStackTrace();System.out.println("logout false");} 
    }//logout end //处理用户退出程序结束 //get who add me as friend 
    //以下处理那些人加了我为好友,以便上线通知他们 
    else if(str.equals("getwhoaddme")){ 
    System.out.println("getwhoaddme"); 
    try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
    Connection c9=DriverManager.getConnection("jdbc:odbc:javaicq"," "," "); //连接数据库,根据我的号码,从好友表中选择谁加了我 
    int myicqno=Integer.parseInt(in.readLine()); 
    System.out.println(myicqno); 
    String getwhoaddme="select icqno from friend where friend=?"; 
    PreparedStatement prepare6=c9.prepareCall(getwhoaddme); 
    prepare6.clearParameters(); 
    prepare6.setInt(1,myicqno); 
    ResultSet r6=prepare6.executeQuery(); 
    Vector who=new Vector(); 
    while(r6.next()){ who.add(new Integer(r6.getInt(1))); }//end while //然后告诉这些好友的ip地址,然后发给用户以便告诉其他客户我上线了 
    for(int i=0;i { String whoinfo="select ip from icq where icqno=? and status=1"; 
    PreparedStatement prepare=c9.prepareCall(whoinfo); 
    prepare.clearParameters(); 
    prepare.setObject(1,who.get(i)); 
    ResultSet r=prepare.executeQuery(); 
    while(r.next()){ out.println(r.getString("ip"));} //while 
    r.close(); }//for 
    out.println("over"); 
    System.out.println("over"); 
    c9.close(); 
    r6.close(); } 
    catch (Exception e) 
    {e.printStackTrace();System.out.println("false");} 
    }//end get who add me as friend //处理上线结束 
    System.out.println("Echo ing :"+str); } 
    System.out.println("Close..."); } 
    catch(IOException e){}//捕或异常 
    finally {try{socket.close();} 
    catch(IOException e){} } }} 
    public class Server 
    {//主服务器类 
    public static void main(String args[]) 
    throws IOException{ ServerSocket s=new ServerSocket(8080);//在8080端口创建套接口 
    System.out.println("Server start.."+s); 
    try{ 
    while(true) 
    {Socket socket=s.accept();//无限监听客户的请求 
    System.out.println("Connectino accept:"+socket); 
    try{new ServerThread(socket);}//创建新线程 
    catch(IOException e){socket.close();} 
    } 
    } 
    finally{s.close();}//捕或异常 
    } 
    }//服务器程序结束
     
  2. A君

    A君 Well-Known Member

    注册:
    2005-08-31
    帖子:
    19,987
    赞:
    98
    不清楚
     
  3. swenge

    swenge New Member

    注册:
    2005-11-28
    帖子:
    386
    赞:
    1
  4. fgjkl

    fgjkl New Member

    注册:
    2006-01-12
    帖子:
    74
    赞:
    0
    .....................
     
  5. woshidianpa

    woshidianpa New Member

    注册:
    2005-11-08
    帖子:
    89
    赞:
    1
    QQ就是这样的吗?
     
  6. notnull

    notnull New Member

    注册:
    2005-09-27
    帖子:
    11,720
    赞:
    37
    原理
    这是JAVA的代码