【正文】
If a = 0 Then MsgBox 數(shù)據(jù)庫文件出錯(cuò),: End ServerName = Left$(str_tem, Len(Trim$(str_tem)) 1) Nian = Mid(ServerName, 1, 4) Yue = Mid(ServerName, 5, 2) Ri = Mid(ServerName, 7, 2) Shi = Mid(ServerName, 9, 2) Fen = Mid(ServerName, 11, 2) I = MsgBox(數(shù)據(jù)庫恢復(fù)將會(huì)覆蓋當(dāng)前數(shù)據(jù)庫,你恢復(fù)到 amp。 年 amp。 月 amp。 日 amp。 時(shí) amp。 分 amp。 \bat\ strDestination = amp。點(diǎn)擊文件菜單的查看服務(wù)器信息按鈕就可以顯示以下的窗口,: 服務(wù)器信息界面圖關(guān)鍵代碼如下: = 本機(jī)IP地址是: amp。 vbCrLf = 程序是 amp。 啟動(dòng)的 amp。 vbCrLf = 當(dāng)前 amp。 人 amp。 (2).Text amp。 vbCrLf = 用戶登陸最多時(shí)達(dá) amp。 人 amp。其中“選擇日期”是mand1,“日志信息”是mand2,“聊天信息”是mand3。 \data\ amp。 amp。 str DoEventsLoopClose 1If t = Then Text1 = 這一天沒有任何日志信息 Else Text1 = tExit Sub30:Close 1Text1 = 這一天的日志信息不存在,或文件已丟失End SubPrivate Sub Command3_Click()On Error GoTo 30Dim t, str As Stringc1 = FalseOpen amp。 amp。 .txt For Input As 1Do Until EOF(1) Input 1, str t = t amp。相關(guān)代碼如下:Public Sub ProcMsg(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long, Result As Long)Dim hdrX As NMHDROn Error Resume NextSelect Case uMsgCase WM_NOTIFYCopyMemory hdrX, ByVal lParam, Len(hdrX)If = Or = DTN_DATETIMECHANGE ThenLabel1 = Format(, yyyymmdd)End IfEnd SelectEnd Sub: 查看記錄的界面圖 更改管理員密碼服務(wù)器端登陸需要身份確認(rèn)才能登陸,帳號(hào)和密碼可以自定義,以免其他人盜用管理員身份。鍵值位置:HKEY_CURRENT_USER\Software\VB and VBA Program Settings\即時(shí)通訊軟件服務(wù)器\server: 更改密碼的界面圖 發(fā)布通知發(fā)布通告是在菜單欄的工具里,點(diǎn)擊即可發(fā)布你所輸入的信息。關(guān)鍵核心代碼介紹:Dim I As Integertongz = InputBox(vbCrLf amp。 你要通知什么事情?, 通知, tongz)If Trim(tongz) = Then tongz = 歡迎你使用本軟件。 tongz End If DoEventsNext = Len(Text2) = Date amp。 Time amp。 tongz amp。標(biāo)簽欄接收并顯示服務(wù)器發(fā)來的通告信息。關(guān)鍵代碼如下:Private Sub List1_DblClick()If sckConnected Then MsgBox 你還沒有登陸!, vbOKOnly + 64, 提示 ein_Click Exit SubElse formactive = False = Left(Right(, 7), 6) 04| amp。qlIf = True Then = False = 0End IfEnd SubPrivate Sub Option2_Click() 39。 Text2 Text2 = Else If = 無 Or Left(Right(, 7), 6) = id Or = Then = 0: MsgBox 私聊對象錯(cuò)誤, vbOKOnly + 64, 提示: Exit Sub 07| amp。 | amp。 id = TrueEnd IfEnd Sub客戶端主界面見圖615:其中菜單中的文件里,分別有登陸、注冊和注銷功能,這些功能的相關(guān)代碼如下:Private Sub ein_Click()formactive = FalseEnd SubPrivate Sub zhuche_Click() = 1formactive = FalseEnd SubPrivate Sub zhuxiao_Click() = True = False = Truecloseflag = False = Len(Text1) = 【系統(tǒng)消息】你已經(jīng)注銷了 amp。:注冊窗口和個(gè)人信息窗口也顯示在下面了,通過注冊界面可以自定義個(gè)人信息,完成注冊并且用自己隨機(jī)獲取的ID號(hào)進(jìn)行登陸,登陸后可以通過雙擊在線名單的某一行,查看對應(yīng)的人員信息。發(fā)送數(shù)據(jù)使用的是多個(gè)端口,設(shè)置數(shù)組控件會(huì)使程序具有很大的靈活性,發(fā)送端口會(huì)自動(dòng)定義,而且不重復(fù)使用同一端口,所以端口是多少都無所謂,這不是我們需要關(guān)心的,在某用戶斷開連接時(shí)候,空閑的winsock還可以接收新的用戶。主Winsock——Winsock(0)發(fā)生消息 I = 1 While I = maxconnext And nowconnext(I) 39。在當(dāng)前裝載的Socket中發(fā)現(xiàn)有用戶已經(jīng)離開 Winsock1(I).LocalPort = 0 39。接收 nowconnext(I) = True 39。在當(dāng)前裝載的Socket中沒發(fā)現(xiàn)有用戶離開 maxconnext = maxconnext + 1 39。生成新的Winsock Winsock1(maxconnext).LocalPort = 0 Winsock1(maxconnext).Accept requestID 39。對于每一個(gè)信息都要有對應(yīng)的信息反饋回去。發(fā)送一個(gè)數(shù)據(jù),等待響應(yīng)信息的回來,客戶端是通過服務(wù)器回復(fù)信息的頭命令,判定消息類型。為了能正確接收并區(qū)分這些信息 ,系統(tǒng)采用了信息前加不同的首字符的方法,也就是前文所說的頭命令,從而有效地解決了客戶端的接收問題。頭命令 ClientData, vbStringtou = Val(Left(ClientData, 2))Select Case touCase 1’代碼省略Case 2’代碼省略……End SelectEnd Sub服務(wù)器和客戶端之間的連接:其中winsock控件需要正確設(shè)置服務(wù)器的IP地址(這里仍假設(shè)為本機(jī)) ,設(shè)置服務(wù)器端口為客戶端中所要求的遠(yuǎn)程端口號(hào) , 這樣才能保證通訊。采用了由客戶提出斷開連接而由服務(wù)器正式關(guān)閉的辦法 ,避免了這種錯(cuò)誤的發(fā)生。相關(guān)代碼如下:Private Sub Winsock1_Close(Index As Integer)Dim I As IntegerWinsock1(Index).ClosePrivate Sub Winsock1_Close()If closeflag Then 39。最小化 form3flag = True 39。這次是重連接,和登陸的效果一樣 39。 id amp。 password amp。 strc = 0 Unload Form3結(jié) 論經(jīng)過兩個(gè)月的設(shè)計(jì)和開發(fā),基于socket的即時(shí)通訊軟件基本開發(fā)完畢。對于數(shù)據(jù)的一致性的問題也通過程序進(jìn)行了有效的解決。本文重點(diǎn)討論客戶端/服務(wù)器的程序的設(shè)計(jì)方法和過程,對整個(gè)系統(tǒng)進(jìn)行了詳細(xì)設(shè)計(jì),利用面向?qū)ο蟮姆椒ǎM(jìn)行整個(gè)系統(tǒng)的設(shè)計(jì)。(2) 陳述了客戶端/服務(wù)器程序的設(shè)計(jì)原理和過程(3) 根據(jù)系統(tǒng)需求,進(jìn)行整個(gè)系統(tǒng)的各個(gè)部分的詳細(xì)設(shè)計(jì)。比如 ,服務(wù)器不能向各客戶廣播消息的問題 ,經(jīng)過反復(fù)調(diào)試、分析 ,發(fā)現(xiàn)各客戶已經(jīng)接收了消息 ,只不過是系統(tǒng)忙于服務(wù)器和各客戶的連接而顧不上顯示所致 ,在需要系統(tǒng)停下來做他事情的位置添加了一個(gè) Doevents 函數(shù),問題就可得以解決。可以在網(wǎng)絡(luò)中用一個(gè)固定的機(jī)地址作為服務(wù)器地址 ,其他用戶都選該機(jī)地址連接進(jìn)入群聊或一對一私聊.本文主要是對本軟件服務(wù)器端的設(shè)計(jì)作了比較詳細(xì)的介紹??蛻舳耸墙o用戶使用的,從方便和美觀上,還都還有很多需要改進(jìn)的地方。如果要使本系統(tǒng)成為一個(gè)實(shí)際應(yīng)用系統(tǒng)并在局域網(wǎng)上實(shí)際應(yīng)用,除了完成客戶端的功能外,我認(rèn)為還應(yīng)做以下的完善和開發(fā)工作:(1) 一步完善底層通訊協(xié)議,使其能夠更好的處理數(shù)據(jù)的發(fā)送和接收。(3) 對本地用戶的密碼的加密問題,在本程序中,沒有對本地密碼進(jìn)行加密。本次設(shè)計(jì)使我對已學(xué)過的基礎(chǔ)知識(shí)有了更深入的理解,在設(shè)計(jì)時(shí)也遇到了各種各樣的問題,通過在圖書館查閱書籍資料,上網(wǎng)搜索相關(guān)信息,以及向老師和同學(xué)的請教,我基本解決了這些問題。通過這次的課程設(shè)計(jì),我初步體會(huì)到了作為一個(gè)工程技術(shù)人員所應(yīng)該具備的細(xì)心與嚴(yán)密的素質(zhì)和吃苦耐勞的精神,也懂得了團(tuán)體合作的重要,也學(xué)到了課本上沒有東西。千萬不要忽略程序的正確書寫格式,這對程序的調(diào)試及維護(hù)方面都用極為重要的作用。時(shí)刻存盤和經(jīng)常備份,可以大大避免由于意外事故的發(fā)生而對自己造成不必要的損失,進(jìn)行重復(fù)工作而浪費(fèi)精力和時(shí)間。在程序設(shè)計(jì)中,有許多不引人注意的地方,恰恰是這些地方的失誤,會(huì)產(chǎn)生極大的錯(cuò)誤。在兩個(gè)多月的設(shè)計(jì)開發(fā)中,我還碰到了很多讓我深有感觸的地方,比如同組成員間的相互討論,他們給了我非常大的幫助,鍛煉了我在軟件開發(fā)方面的團(tuán)結(jié)協(xié)作能力,同時(shí)也能避免個(gè)人思考問題的局限性。也可以做計(jì)時(shí)器用,在連了很長時(shí)間仍然沒連接上的時(shí)候,自動(dòng)斷開連接,提示用戶重新連接,這個(gè)時(shí)間量由用戶在控件的interval屬性設(shè)置。在本程序中這些都得到體現(xiàn),比如實(shí)現(xiàn)了限制同一IP地址連續(xù)注冊ID號(hào)的功能。張老師淵博的知識(shí)和誨人不倦的教誨使我受益匪淺,嚴(yán)謹(jǐn)?shù)膽B(tài)度及孜孜不倦的研究作風(fēng)是我今后工作和學(xué)習(xí)的楷模。在畢業(yè)設(shè)計(jì)期間,我還得到身邊同學(xué)的大力幫助和寶貴意見,在此表示衷心的感謝!借此機(jī)會(huì),我還要對四年大學(xué)生活中的所有任課老師、系辦的各位老師,表示誠心的感謝。最后還要特別感謝審稿老師在百忙之中抽出寶貴時(shí)間審閱本論文。 A responsive server must always have enough AcceptEx calls outstanding so that any client connection can be immediately handled. The number of posted AcceptEx operations will depend on the type of traffic your server expects. A high ining connection rate (because of shortlived connections or spurts in traffic) requires more outstanding AcceptEx calls than an application where the clients connect infrequently. It may be wise to let the number of posted AcceptEx operations vary between applicationspecific low and high watermarks, and avoid deciding on one fixed number as the magic figure.On Windows 2000, Winsock provides some help in determining if the application is falling behind on posting AcceptEx requests. When creating the listening socket, associate it with an event by using the WSAEventSelect API and registering for an FD_ACCEPT notification. If there are no accept operations pending, the event will be signaled by an ining connection. This event can thus be used as an indication that you need to post more AcceptEx requests or detect a possible misbehaving remote entity, as we39