- 相關推薦
用java制作icq
分析icq系統,并嘗試用java編寫。一.序言icq是英文"i seek you "的簡稱,中文意思是我找你。icq最大的功能就是即時信息交流,只要記得對方的號碼,上網時可以呼他,無論他在哪里,只要他上網打開icq,人們就可以隨時交流。icq源于以色列特拉維夫的mirabils公司。該公司成立于1996年7月,也就是在這個時候,互聯網上最出名,下載使用人數最多的免費軟件icq誕生了?赡苁瞧洳粩嘣黾拥挠脩艉蛷V闊的遠景以及廣泛的應用遠景和巨大的市場潛力,mirabils的icq終極被美國在線aol收購。由于icq的成功,推動了icq的本土化,就中文的icq而言,現在已經越來越多,比如著名的深圳騰迅公司推出的oicq(現在由于版權題目,已改名為qq2001),還有由tom.com推出的tomq等,這些軟件技術都很好,而且簡單易用,成為中國網民最喜歡的通訊軟件。但是這些公司都只提供軟件的客戶端程序免費下載,而不提供其服務器程序,因此對于未與互聯網連接的私有網絡,這些軟件就用不上了。當然網上也有免費的類似icq的服務器提供下載,但是好多都不提供源程序,即使有,其說明也很簡單,我很想知道它是怎么回事,所以我就試著做了。二.設計1.為什么選擇java?
java是sun microsystem公司的james gosling開發的編程語言。它以c 為基礎,但是卻是一個全新的軟件開發語言。java是一個簡單,面象對象,分布式,解釋性,強壯,安全,與系統無關,可移植,高性能,多線程和動態的語言-------這是 sun給java的定義。sun公司的口號就是"網絡就是計算機",java能使所有東西從桌面計算平穩的轉變為基于網絡的計算,它是專門為此而建立的,并顯然是為了完成這個任務而來的。使用java,我們可以相對輕松的一天編寫一個有條理的網絡程序。今天,java的網絡功能正在奔騰發展,不斷有新的特性增加到這個有價值的基礎上,javasoft實驗室正在不斷努力使java更加完善。2.數據庫設計
系統可以采用任何一種流行的,java支持的數據庫,本系統采用了microsoft公司的sql server2000作為后臺數據庫。通過對現在流行的一些icq的參考,建立數據庫,名為javaicq,數據庫共建立兩個表,一個是用戶的基本信息,包括呢稱,jicq號碼等。一個是用戶的好友表,包括用戶自己的號碼和好友的號碼。(1)用戶的基本信息表(表名icq)序號字段名含義數據類型null1icqno用戶的號碼intno2nickname用戶的呢稱charno3password用戶的密碼charno4status用戶在線否bitno5ip用戶的ip地址charyes6info用戶的資料varcharyes7pic用戶的頭像號intyes8***用戶性別charyes9email用戶的emailcharyes10place用戶的籍貫charyes其中icqno字段為自動增加。(其他還可以添加諸如電話號碼等字段作為更多選擇)
(2)用戶的好友表(表名friend)序號字段名含義數據類型null1icqno用戶的號碼intno2friend好友的號碼intno
3.系統模式及程序(具體程序參看源程序)
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,***,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;//以下返回用戶的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
【用java制作icq】相關文章:
java畢業論文參考文獻10-13
最新java畢業設計論文參考文獻09-20
動畫制作參考文獻04-12
學生自創小樂器的制作04-28
微課制作論文答辯06-29
都市頻道制作網的設計與實現05-29
簡易雞毛毽的制作的步驟分析09-21
文本方式下圖形提示界面制作05-10
都市頻道新聞制作網的設計與安裝05-31
用PC測量交變磁場05-11