- 相關(guān)推薦
用java制作icq
分析icq系統,并嘗試用java編寫(xiě)。一.序言icq是英文"i seek you "的簡(jiǎn)稱(chēng),中文意思是我找你。icq最大的功能就是即時(shí)信息交流,只要記得對方的號碼,上網(wǎng)時(shí)可以呼他,無(wú)論他在哪里,只要他上網(wǎng)打開(kāi)icq,人們就可以隨時(shí)交流。icq源于以色列特拉維夫的mirabils公司。該公司成立于1996年7月,也就是在這個(gè)時(shí)候,互聯(lián)網(wǎng)上最出名,下載使用人數最多的免費軟件icq誕生了?赡苁瞧洳粩嘣黾拥挠脩(hù)和廣闊的遠景以及廣泛的應用遠景和巨大的市場(chǎng)潛力,mirabils的icq終極被美國在線(xiàn)aol收購。由于icq的成功,推動(dòng)了icq的本土化,就中文的icq而言,現在已經(jīng)越來(lái)越多,比如著(zhù)名的深圳騰迅公司推出的oicq(現在由于版權題目,已改名為qq2001),還有由tom.com推出的tomq等,這些軟件技術(shù)都很好,而且簡(jiǎn)單易用,成為中國網(wǎng)民最喜歡的通訊軟件。但是這些公司都只提供軟件的客戶(hù)端程序免費下載,而不提供其服務(wù)器程序,因此對于未與互聯(lián)網(wǎng)連接的私有網(wǎng)絡(luò ),這些軟件就用不上了。當然網(wǎng)上也有免費的類(lèi)似icq的服務(wù)器提供下載,但是好多都不提供源程序,即使有,其說(shuō)明也很簡(jiǎn)單,我很想知道它是怎么回事,所以我就試著(zhù)做了。二.設計1.為什么選擇java?
java是sun microsystem公司的james gosling開(kāi)發(fā)的編程語(yǔ)言。它以c 為基礎,但是卻是一個(gè)全新的軟件開(kāi)發(fā)語(yǔ)言。java是一個(gè)簡(jiǎn)單,面象對象,分布式,解釋性,強壯,安全,與系統無(wú)關(guān),可移植,高性能,多線(xiàn)程和動(dòng)態(tài)的語(yǔ)言-------這是 sun給java的定義。sun公司的口號就是"網(wǎng)絡(luò )就是計算機",java能使所有東西從桌面計算平穩的轉變?yōu)榛诰W(wǎng)絡(luò )的計算,它是專(zhuān)門(mén)為此而建立的,并顯然是為了完成這個(gè)任務(wù)而來(lái)的。使用java,我們可以相對輕松的一天編寫(xiě)一個(gè)有條理的網(wǎng)絡(luò )程序。今天,java的網(wǎng)絡(luò )功能正在奔騰發(fā)展,不斷有新的特性增加到這個(gè)有價(jià)值的基礎上,javasoft實(shí)驗室正在不斷努力使java更加完善。2.數據庫設計
系統可以采用任何一種流行的,java支持的數據庫,本系統采用了microsoft公司的sql server2000作為后臺數據庫。通過(guò)對現在流行的一些icq的參考,建立數據庫,名為javaicq,數據庫共建立兩個(gè)表,一個(gè)是用戶(hù)的基本信息,包括呢稱(chēng),jicq號碼等。一個(gè)是用戶(hù)的好友表,包括用戶(hù)自己的號碼和好友的號碼。(1)用戶(hù)的基本信息表(表名icq)序號字段名含義數據類(lèi)型null1icqno用戶(hù)的號碼intno2nickname用戶(hù)的呢稱(chēng)charno3password用戶(hù)的密碼charno4status用戶(hù)在線(xiàn)否bitno5ip用戶(hù)的ip地址charyes6info用戶(hù)的資料varcharyes7pic用戶(hù)的頭像號intyes8***用戶(hù)性別charyes9email用戶(hù)的emailcharyes10place用戶(hù)的籍貫charyes其中icqno字段為自動(dòng)增加。(其他還可以添加諸如電話(huà)號碼等字段作為更多選擇)
(2)用戶(hù)的好友表(表名friend)序號字段名含義數據類(lèi)型null1icqno用戶(hù)的號碼intno2friend好友的號碼intno
3.系統模式及程序(具體程序參看源程序)
1.服務(wù)器程序: 服務(wù)器與客戶(hù)間通過(guò)套接口socket(tcp)連接。在java中使用套接口相當簡(jiǎn)單,java api為處理套接口的通訊提供了一個(gè)類(lèi)java.net.socket.,使得編寫(xiě)網(wǎng)絡(luò )應用程序相對輕易.服務(wù)器采用多線(xiàn)程以滿(mǎn)足多用戶(hù)的請求,通過(guò)jdbc與后臺數據庫連接,并通過(guò)創(chuàng )建一個(gè)serversocket對象來(lái)監聽(tīng)來(lái)自客戶(hù)的連接請求,默認端口為8080,然后無(wú)窮循環(huán)調用accept()方法接受客戶(hù)程序的連接服務(wù)器程序代碼如下:(部分)import java.io.*; import java.net.*; import java.sql.*; import java.util.vector; class serverthread extends thread{//繼續線(xiàn)程 private socket socket;//定義套接口 private bufferedreader in;//定義輸進(jìn)流 private printwriter out;//定義輸出流 int no;//定義申請的jicq號碼 public serverthread(socket s) throws ioexception {//線(xiàn)程構造函數 socket=s;//取得傳遞參數 in=new bufferedreader(new inputstreamreader(socket.getinputstream()));//創(chuàng )建輸進(jìn)流 out=new printwriter(new bufferedwriter(new outputstreamwriter(socket.getoutputstream())),true);//創(chuàng )建輸出流 start();//啟動(dòng)線(xiàn)程 } public void run(){//線(xiàn)程監聽(tīng)函數 try{ while(true){ string str=in.readline();//取得輸進(jìn)字符串 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=?"; //預備從數據庫選擇呢稱(chēng)和密碼 preparedstatement prepare=c.preparecall(sql);//設定數據庫查尋條件 string icqno=in.readline(); int g=integer.parseint(icqno);//取得輸進(jìn)的jicq號碼 system.out.println(icqno); string passwd=in.readline().trim();//取得輸進(jìn)的密碼 system.out.println(passwd); prepare.clearparameters(); prepare.setint(1,g);//設定參數 resultset r=prepare.executequery();//執行數據庫查尋 if(r.next()){//以下比較輸進(jìn)的號碼于密碼是否相同 string pass=r.getstring("password").trim(); system.out.println(pass); if(passwd.regionmatches(0,pass,0,pass.length())){ out.println("ok");//假如相同就告訴客戶(hù)ok//并且更新數據庫用戶(hù)為在線(xiàn)//以及注冊用戶(hù)的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}//否者告訴客戶(hù)失敗 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 //登錄結束 //以下為處理客戶(hù)的新建請求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(?,?,?,?,?,?)";//預備接受用戶(hù)的呢稱(chēng),密碼,email,個(gè)人資料,籍貫,頭像等信息 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=?";//以下告訴客戶(hù)其注冊的號碼 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 //新建用戶(hù)結束 //以下處理用戶(hù)查找好友 else if(str.equals("find")){ try{ class.forname("sun.jdbc.odbc.jdbcodbcdriver"); connection c3=drivermanager.getconnection("jdbc:odbc:javaicq"," "," "); //以下連接數據庫,并且返回其他用戶(hù)的呢稱(chēng),性別,籍貫,個(gè)人資料等信息 string find="select nickname,***,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("***")); 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;//以下返回用戶(hù)的jicq號碼,頭像號,及是否在線(xiàn) 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 //查找好友結束 //以下處理用戶(hù)登錄時(shí)讀取其好友資料 else if(str.equals("friend")){ try{ class.forname("sun.jdbc.odbc.jdbcodbcdriver"); connection c4=drivermanager.getconnection("jdbc:odbc:javaicq"," "," "); //以下連接好友表,返回用戶(hù)的好友名單 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 //以下告訴客戶(hù)其好友的呢稱(chēng),號碼,ip地址,狀態(tài),頭像,個(gè)人資料等信息 out.println(friendno.size()); for(int i=0;i
【用java制作icq】相關(guān)文章:
用java實(shí)現二重積分的計算03-07
用RMI開(kāi)發(fā)基于Java的企業(yè)分布式應用03-19
java畢業(yè)論文參考文獻05-11
JAVA五子棋游戲03-07