这是在上一篇博客基础上开展的,第一部分我们只实现了本机的聊天,无法将程序放置另外机器上和本机进行聊天。这篇博客我将介绍如何实现不同机器之间实现聊天,达到真正意义上的聊天。不过这篇博客在其他机器上面运行jar文件需要对方的电脑也要有JDK环境,才能运行jar文件。之后有时间我会说明如何打包成exe可执行文件,让没有装JDK环境的电脑也可以运行。
本文所有基础内容都会在《Java TCP实现高仿版QQ聊天(一)》中讲到,建议先行阅读上一篇文章。
我用了两台电脑实现了聊天。第一幅图是我自己的电脑,第二幅图是对方的。
由于要实现不同机器之间的聊天,那么就必须有一个“公网IP+Port”,也就是说需要有一个服务器来实现。本文所使用的服务器是老师提供的,因为不是自己的,所以在文章中涉及到服务器IP的我会隐藏掉,但我会进行详细的说明。
说了一大堆就是说自己需要有一个服务器地址,还需要设置端口号,才能实现不同机器的聊天。个人的话可以去阿里租服务器,学生的话很便宜,用来做毕业设计再好不过了。
由于是在公网上进行聊天,之前写的博客是只在本地进行聊天,所以代码会有一部分变动,但改动的范围不大。下面将进行详细说明:
把根目录下的db.properties(数据库配置)和MessageSound.wav(QQ信息提示音)两个文件复制至src目录下面,因为把程序导出为jar文件,jar文件中只有src下面的文件。
文件移动后,那么相应的代码也需要进行更改。需要改动的是下面几个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即可解决错误。
数据库配置文件位置的变动,相应的也需改动代码。
pro.load(new FileInputStream("db.properties"));
改为
pro.load(PropertiesUtils.class.getClassLoader().getResourceAsStream("db.properties"));
另外说一下:db.properties文件中的url得改为服务器中的数据库,而不是本地数据库。
之前用的服务端程序时界面化的,但是在服务器上面是不可以运行界面化代码的,并且不改的话,会报错。
在ServerFrame.java文件中的main方法里面new的是界面代码,只有点击的按钮才会运行Server.java文件。所以把ServerFrame.java中的main方法中的new ServerFrame();改为new Server();,这样就是直接运行服务端了,不需要界面。
但是存在一个问题,就是当我们登录和退出的时候我们调用了ServerFrame.java文件中的showMsg()方法,所以需要把调用这个方法都注释掉。我们先把ServerFrame.java文件中的showMsg()方法注释掉,然后可以看到工作空间会有几个文件报错,我们打开着几个报错的文件,找到错误行,注释掉showMsg()方法即可。
好了,具体的代码变动已经完成。下面把程序打包成jar文件。
这一步实现把程序打包为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邮箱应该可以免费试用,我没有用过。
打开后就会出现和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命令操作就可以实现登录了。
最后就可以实现多台机器实现聊天了。