前言

​ 这是在上一篇博客基础上开展的,第一部分我们只实现了本机的聊天,无法将程序放置另外机器上和本机进行聊天。这篇博客我将介绍如何实现不同机器之间实现聊天,达到真正意义上的聊天。不过这篇博客在其他机器上面运行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 ing印版_Java TCP实现高仿版QQ聊天(二)相关推荐

  1. Java TCP实现高仿版QQ聊天(二)

    前言 ​ 这是在上一篇博客基础上开展的,第一部分我们只实现了本机的聊天,无法将程序放置另外机器上和本机进行聊天.这篇博客我将介绍如何实现不同机器之间实现聊天,达到真正意义上的聊天.不过这篇博客在其他机 ...

  2. Java TCP实现高仿版QQ聊天(一)

    前言 ​ 记录一下这套简陋的系统说明,把所遇到的问题和难点以及操作说明在这篇文档中说明清楚,当个回顾吧,万一以后那一天查看也能及时找到问题.这套系统是在本人大三时期完成的,从GitHub上借鉴了很多经 ...

  3. java ing印版,Java中有趣的事【汇总】持续更新ing

    ×. 有一次,同时说看日志log的时候,发现一个方法前后两次打印同一个对象的时间log格式不一样. 当时也没在意,再一次debug查代码的时候,发现了这个问题的答案.一个时间是Timestamp(da ...

  4. java ing印版,Be alaways javaing...

    Linux之所以受到广大计算机爱好者的喜爱,主要原因有两个,首先它是自由软件,用户不用支付费用就可以使用它,并可根据自己的需要对它进行修改.另外,它具有Unix的全部功能,任何使用Unix系统或想要学 ...

  5. java socket 端口复用_Java TCP/IP协议的Socket如何设置端口复用?

    Java TCP/IP协议的Socket如何设置端口复用? 关注:123  答案:3  mip版 解决时间 2021-01-30 18:33 提问者情婲.毒 2021-01-29 18:58 情境如下 ...

  6. core java第十版_java核心技术第十版 笔记

    1.java区分大小写 2.类名是以大写字母开头 (驼峰) 3.http://docs.oracle.com/javase/specs  java语言规范 4. /* */ 注释不能嵌套 5. Jav ...

  7. java api iphone版_Java Platform, Enterprise Edition 5/6/7 API Specification

    支持中文.英语.日语.韩语.法语.德语.俄语.西班牙语.葡萄牙语.藏语.西语等109种语言翻译.实景AR翻译.拍照翻译.语音翻译.对话翻译.在线翻译.离线翻译更顺畅.[权威词典]完整收录学习型牛津词典 ...

  8. kubernetes权威指南第五版_Java 微服务实用指南(二)

    Java 微服务的部署和测试 请快速回顾一下上一篇文章开头提到的基础知识,任何服务器端的 Java 程序,都是.jar 或.war 文件,因此也包括微服务. 在 Java 生态系统(更确切地说是 JV ...

  9. java 点餐界面_Java小项目点餐系统(二)之服务端 | 学步园

    服务端详解: 服务端的主要功能就是无限监听一个端口号,对客户端发来的连接请求给予回应,然后开辟新线程处理客户端.界面做的比较简单就是显示在线的用户,分为商家和学生. 一.监听客户端的socket连接请 ...

最新文章

  1. 第十六届全国大学智能车竞赛华南赛区成绩汇总
  2. EDM邮件群发十大技巧提升邮件群发效果
  3. 5 Handler与子线程
  4. Android 应用内微信 H5 支付
  5. bzoj1715[Usaco2006 Dec]Wormholes 虫洞
  6. 高仿精仿手机版QQ空间应用源码
  7. Java处理文件BOM头的方式推荐
  8. java 反射api_Java的反射API
  9. 【渝粤教育】广东开放大学 会展项目管理 形成性考核 (59)
  10. Codeforces Round #242 (Div. 2)C(找规律,异或运算)
  11. 用angular中的ng-repeat和ng-show来实现tab选项卡
  12. MYSQL正在使用select发现现场记录方法,包括一个逗号分隔的字符串
  13. 愚公移山第一章伪代码
  14. JavaWeb——JavaScript精讲之DOM、BOM对象与案例实战(动态添加删除表格)
  15. git切换远程分支并拉取最新代码
  16. R语言笔记:机器学习【K近邻】
  17. 动画:面试官问我 JS「变量提升」我头皮发麻,最后把这篇动画甩给了他
  18. 汉语语句的计算机分析,(计算机专业毕业论文)汉语语法自动分析.doc
  19. Chrome/edge inspect远程调试移动设备
  20. 头发合成:手绘草图妙变逼真秀发

热门文章

  1. 给笔记本更换SSD硬盘
  2. 【剑指offer】62、圆圈中最后剩下的数字
  3. java并发包下的lock接口与syschronized关键字的区别
  4. 获取IP及判断IP是否在区间
  5. BZOJ 3875 - SPFA处理带环的DP
  6. 从华为“流程与IT管理部”看IT部门定位
  7. Asp.Net细节性问题精萃
  8. [转载] Python字符串函数
  9. [转载] Python中NumPy简介及使用举例
  10. [转载] 一、第一个Flask程序