Java TCP实现高仿版QQ聊天(二)
前言
? 這是在上一篇博客基礎上開展的,第一部分我們只實現了本機的聊天,無法將程序放置另外機器上和本機進行聊天。這篇博客我將介紹如何實現不同機器之間實現聊天,達到真正意義上的聊天。不過這篇博客在其他機器上面運行jar文件需要對方的電腦也要有JDK環境,才能運行jar文件。之后有時間我會說明如何打包成exe可執行文件,讓沒有裝JDK環境的電腦也可以運行。
? 本文所有基礎內容都會在《Java TCP實現高仿版QQ聊天(一)》中講到,建議先行閱讀上一篇文章。
效果圖
? 我用了兩臺電腦實現了聊天。第一幅圖是我自己的電腦,第二幅圖是對方的。
服務器
? 由于要實現不同機器之間的聊天,那么就必須有一個“公網IP+Port”,也就是說需要有一個服務器來實現。本文所使用的服務器是老師提供的,因為不是自己的,所以在文章中涉及到服務器IP的我會隱藏掉,但我會進行詳細的說明。
? 說了一大堆就是說自己需要有一個服務器地址,還需要設置端口號,才能實現不同機器的聊天。個人的話可以去阿里租服務器,學生的話很便宜,用來做畢業設計再好不過了。
代碼變動
? 由于是在公網上進行聊天,之前寫的博客是只在本地進行聊天,所以代碼會有一部分變動,但改動的范圍不大。下面將進行詳細說明:
文件移動
? 把根目錄下的db.properties(數據庫配置)和MessageSound.wav(QQ信息提示音)兩個文件復制至src目錄下面,因為把程序導出為jar文件,jar文件中只有src下面的文件。
? 文件移動后,那么相應的代碼也需要進行更改。需要改動的是下面幾個java文件。
utils.MyTools.java
? QQServerPort由6776變為你自己服務器對TCP開發的端口。我這邊用的是9559端口。
? QQServerIP由"127.0.0.1"(本地IP)變為服務器官網IP,由于是老師的服務器,我就不寫IP地址了。
? playMsgSound()方法中的
sun.audio.AudioPlayer.player.start(new sun.audio.AudioStream(new FileInputStream(new File("MessageSound.wav"))));? 變為
sun.audio.AudioPlayer.player.start(new sun.audio.AudioStream(MyTools.class.getClassLoader().getResourceAsStream("MessageSound.wav")));? 這個方法是實現QQ信息語音提醒的,由于文件的變動,那么代碼業需要隨之改變。MyTools.class.getClassLoader()的意思就是獲得本類的加載器,然后獲得流,最后去讀取文件,功能和之前是一樣的。
? 提醒一下:加載聲音文件如果直接寫的話可能會報錯,下面說明如何解決。
? 訪問限制:由于對必需的庫 jre\lib\rt.jar 具有一定限制,因此無法訪問類型 AudioStream。
? 所以需要作如下修改:右鍵項目–>Properties–>Java Compiler–>Errors/Warnings–>勾選“Enable project specific settings”–>Deprecated and restricted API–>將“Deprecated API”改為Warnings即可解決錯誤。
utils.PropertiesUtils.java
? 數據庫配置文件位置的變動,相應的也需改動代碼。
pro.load(new FileInputStream("db.properties"));? 改為
pro.load(PropertiesUtils.class.getClassLoader().getResourceAsStream("db.properties"));? 另外說一下:db.properties文件中的url得改為服務器中的數據庫,而不是本地數據庫。
view.ServerFrame.java
? 之前用的服務端程序時界面化的,但是在服務器上面是不可以運行界面化代碼的,并且不改的話,會報錯。
? 在ServerFrame.java文件中的main方法里面new的是界面代碼,只有點擊的按鈕才會運行Server.java文件。所以把ServerFrame.java中的main方法中的new ServerFrame();改為new Server();,這樣就是直接運行服務端了,不需要界面。
? 但是存在一個問題,就是當我們登錄和退出的時候我們調用了ServerFrame.java文件中的showMsg()方法,所以需要把調用這個方法都注釋掉。我們先把ServerFrame.java文件中的showMsg()方法注釋掉,然后可以看到工作空間會有幾個文件報錯,我們打開著幾個報錯的文件,找到錯誤行,注釋掉showMsg()方法即可。
? 好了,具體的代碼變動已經完成。下面把程序打包成jar文件。
Export
? 這一步實現把程序打包為jar文件,因為我們需要把java代碼部署到服務器上面,就需要這一步操作。
? 右鍵項目–>Export–>打開java文件夾–>選擇Runnable JAR file–>next–>在Launch configuration中選擇ServereFrame - QQ_v2–>然后導出路徑可以導出到桌面,文件名為設置為server–>在Library handling中選擇Package required libraries inio generated JAR–>Finish–>完成后可以看見桌面有一個server.jar文件。
? 上面這邊操作是導出服務端的jar文件,客戶端的文件也是這樣導出,在Launch configuration中選擇LoginFrame - QQ_v2–>然后導出路徑可以導出到桌面,文件名為設置為client,然后的操作一樣,可以看見桌面有了一個client.jar文件。
? 到這一步我們把jar文件打包完成了。下面將進行服務器的部署。
軟件下載
? 把文件上傳到服務器我們用的軟件是FileZilla,將jar文件部署到服務器的文件是putty。好像現在很多人用的是Xshell,它集上傳和部署于一身,不過他是收費軟件,用學生的edu郵箱應該可以免費試用,我沒有用過。
FileZilla
putty
? 打開后就會出現和Windows cmd命令符一樣的界面,輸入賬號密碼,其實這就是一個遠程登錄器,登錄到你的服務器的Linux操作系統下面。這里的命令行就Linux操作,老師用的這個服務器是Ubuntu的。
? 成功登錄到服務器后可以輸入命令cd /usr到usr目錄下,然后輸入命令ls查看當前目錄下的文件名,可以看到有server.jar這個文件,這個文件就是之前用FileZilla上傳到服務器的。
? 之后我們就可以開始運行服務端了,輸入命令
nohup java -jar server.jar out > /usr/wei_out_server.out 2>&1 &? 這行命令的意思就是運行servere.jar文件,并且不影響命令行的運行,如果不不加nohub,就會占用命令行,不能執行其他操作,錯誤信息也會在命令行打印出來,out后面就是指定日志輸出文件,放在usr文件下。
? 日志信息在FileZilla的右側面板雙擊或者拖動到桌面,用記事本打開就可以查看了,如果運行出錯就會在里面顯示。如果日志信息為端口號,證明運行成功。一般當運行客戶端的時候卡住不動,就可能是服務端出錯了,這時候就需要查看日志文件看錯誤是什么。
運行客戶端
? 當我們把服務端部署成功后,下面就可以運行客戶端了。客戶端有兩種運行方式,第一種是直接在eclipse中運行Loginframe.java文件,不需要運行服務端,然后就可以實現登錄了。
? 第二種就是運行jar文件,一般在別的機器上面運行這個程序,運行jar文件就可以了。但這種方式運行時需要對方電腦也有JDK環境才能運行成功。下次有時間講講這么打包成exe文件,及時對方無JDK,也可以用這個程序和你聊天。
? 打開cmd命令行,輸入命令cd xxx,這個xxx是你桌面的路徑,命令行跳轉到你的桌面目錄下,然后執行命令java -jar client.jar就可以成功運行客戶端,登錄界面就會出現。如果是服務端出錯了的話,可能這邊會卡住或者在命令行打印連接服務器失敗。
? 要想在別的機器上面運行這個程序,把client.jar發給對方,然后對方執行上面的cmd命令操作就可以實現登錄了。
? 最后就可以實現多臺機器實現聊天了。
總結
以上是生活随笔為你收集整理的Java TCP实现高仿版QQ聊天(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fatal: bad numeric c
- 下一篇: 在记事本中编辑Java代码,通过cmd运