我试图做什么:把我的 Java代码放到服务器上运行,并成功与客户端进行 socket通信

预备环境:刚安装好 MySQL 和 JVM 的 Linux远程服务器(Debian 8.8)一台。

主要有如下几个步骤:

  1. 将编译好的代码打包成可执行的 jar包 
  2. 在 Debian 上用 JDBC 连接 MySQL
  3. socket客户端进程连接 socket服务端进程
  4. 附加:在无图形操作系统下运行 GUI程序所抛出的异常
  5. 附加二:让程序在断开远程连接后继续运行

1、将编译好的代码打包成可执行的 jar包

参考资料:[IntelliJ IDEA 2017.3 Help] Packaging a Module into a JAR File

设置 Artifacts 有两个关键点,把程序入口写入 MANIFEST.MF 以及把编译后的代码添加进去(一定要包括依赖包,要不然丢服务器上跑会出现 ClassNotFoundException),这样才能创建可运行的 jar包。实测有效:

2、在 Debian 上用 JDBC 连接 MySQL

首先,需要在 Debian 上导入相关的数据库,把预先准备的 .sql 脚本通过 Xftp 传到服务器上,传输好后执行如下操作:

readlink -f schema.sql # 取得 schema.sql 的绝对路径并复制它!
mysql -u root -p
source /root/schema.sql # 导入数据

通过 netstat -tln 确认 MySQL 确实在监听 3306 端口:

Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp 0.0.0.0: 0.0.0.0:* LISTEN
tcp 127.0.0.1: 0.0.0.0:* LISTEN

把 jar包传送到服务器(在这之前,请确认数据库密码是正确的!),并尝试启动它:

java -jar main.jar
Exception in thread "main" java.lang.UnsupportedClassVersionError: chatroom/main/ServerTest : Unsupported major.minor version 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:803)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)

这个时候昨天写的笔记就起作用了 Linux 笔记 #02# Installing MySQL & Installing the Default JRE/JDK ,找到原来的教程安装另外一个版本的 JDK(早知道这样一开始就该安装 Oracle JDK8..

3、socket客户端进程连接 socket服务端进程

安装好后再次运行,大功告成图:

相应客户端:

刚开始连了好久连不上,然后谷歌了很久“如何打开 debian xxx 端口”,最后才想起是没有添加阿里云的“安全组规则”,具体操作可以参考这个:阿里云服务器Tomcat无法从外部访问

4、附加:在无图形操作系统下运行 GUI客户端程序所抛出的异常

root@xkfx:~# java -jar chat.jar
Exception in thread "main" java.awt.HeadlessException:
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:204)
at java.awt.Window.<init>(Window.java:536)
at java.awt.Frame.<init>(Frame.java:420)
at java.awt.Frame.<init>(Frame.java:385)
at javax.swing.JFrame.<init>(JFrame.java:189)
at chatroom.client.ui.component.impl.LoginFrame.<init>(LoginFrame.java:17)
at chatroom.client.model.UIManager.init(UIManager.java:51)
at chatroom.client.controller.InitializationController.main(InitializationController.java:12)

只是有点好奇会发生什么,虽然考虑到无图形操作系统是没有提供这类接口的, 然而还是想试一下,看看会不会跑出来一个字符版的界面,结果显然是想多了。:p

5、附加二:让程序在断开远程连接后继续运行

参考资料一:https://www.ibm.com/developerworks/cn/linux/l-cn-screen/

参考资料二:https://www.zhihu.com/question/20709809

Linux 笔记 #03# 在 Debian远程服务器上运行 Java socket程序的更多相关文章

  1. 自动输入密码执行远程服务器上的java -version命令

    自动输入密码执行远程服务器上的java -version命令 for i in $(seq 1 253);do sshpass -p "W123hz" ssh weili@192. ...

  2. visualvm 监控 远程 机器上的 Java 程序

    JDK里面本身就带了很多的监控工具,如JConsole等. 我们今天要讲的这款工具visualvm,就是其中的一款.但是这款工具是在JDK1.6.07及以上才有的.它能够对JAVA程序的JVM堆.线程 ...

  3. 转:visualvm监控远程机器上的Java程序

    转自:http://hanwangkun.iteye.com/blog/1195526 JDK里面本身就带了很多的监控工具,如JConsole等.我们今天要讲的这款工具visualvm,就是其中的一款 ...

  4. 使用pycharm调试远程服务器上的程序

    一.PyCharm实现远程调试代码 1. 和远程服务器建立连接,tools àDeploymentàConfiguration 2. 点击“+”号,按照远程服务器信息配置信息 点击“Advanced ...

  5. scp 从远程服务器上一下载文件

    scp -P202 xx3.x6.xx.xx:/usr/local/zookeeper-.zip /tmp #指定远程服务器的端口和远程服务器的目标文件 ,最后指定要下载到本的地目录 也可以从远程服务 ...

  6. jenkins 把包传到远程服务器上

    首先我们在 一台服务器上部署svn,maven,jdk,tomcat,nexus,还有Jenkins. 这里我主要记录Jenkins. 首先我们从网上下载Jenkins的包 wget http://m ...

  7. 解决git pull 命令失效,不能从远程服务器上拉取代码问题

    用时候在用Git pull命令的时候不管用,拉取不下来远程分支上的代码,是因为本地分支和远程分支没有建立关联. 处理这种问题很简单就按照提示执行命令即可:git branch --set-upstre ...

  8. 解放双手:如何在本地调试远程服务器上的Node代码

    写在前面 谈到node断点调试,目前主要有三种方式,通过node内置调试工具.通过IDE(如vscode).通过node-inspector,三者本质上差不多.本文着重点在于介绍 如何在本地通过nod ...

  9. 在远程服务器上完成本地设备的程序烧写和调试(基于vivado ,SDK软件)

    在使用vivado和SDK进行设计开发的时候,通常需要登录到远程服务器上进行,但是会遇到一个问题就是,所使用的开发板通常是连接在自己的电脑上(local-PC),那要怎么才能让运行在服务器上的设计软件 ...

随机推荐

  1. Microsoft Graph 桌面应用程序

    作者:陈希章 发表于 2017年3月22日 桌面应用程序,在我这篇文章的语境中,我是特指在Windows桌面上面直接运行的.NET应用程序,包括Console Application,WPF Appl ...

  2. 如何在Gulp中提高Browserify的打包速度

    使用Browserify打包js时如果项目变得越来越大,编译时间就会相应变得越来越长.使用官方的插件watchify是个比较有效的提高速度方案. 提速原理 watchify的用法和gulp的watch ...

  3. 用vue做app内嵌页遇到的坑

    公司要求用vue做一个微信端的网站,其中还包含一些app的内嵌页.开始的时候没想那么多,就直接用vue-cli搭了一个单页的vue项目,可随着项目越做越大,页面越来越多,问题就开始暴露出来了. 众所周 ...

  4. 移植 MQTT broker mosquitto 到 omapl138

    概述 本次移植使用创龙的 TL138-EVM 开发板,基于 TI 的 MCSDK 开发环境.具体上位机系统为 Ubuntu 12.04-32bit,软件环境基于创龙的用户手册搭建. 为了移植后在 13 ...

  5. 前后端分离ueditor富文本编辑器的使用-Java版本

    最近在写一个自己的后台管理系统(主要是写着玩的,用来熟悉后端java的知识,目前只是会简单的写点接口),想在项目中编写一个发布新闻文章的功能,想到了使用百度的ueditor富文本编辑器,网上找了很多j ...

  6. django+Echarts实现数据可视化

    1.实时异步加载(从mysql读取数据) 2.scatter散点图 3.雷达图(参数选择要注意) time_1 time_2 time_3 4.面积图 我上传的源码请到github下载:https:/ ...

  7. IEEE1588协议简介

    IEEE1588协议,又称PTP(precise time protocol,精确时间协议),可以达到亚微秒级别时间同步精度,于2002年发布version1,2008年发布version2. IEE ...

  8. jmeter监控服务资源

    转:http://www.cnblogs.com/chengtch/p/6079262.html  1.下载需要的jmeter插件 如图上面两个是jmeter插件,可以再下面的链接中下载: https ...

  9. cors解决Web跨域访问问题

    首先了解一下什么是跨域以及解决的几种常见方式. 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器施加的安全限制. 所谓同源是指,域名,协议,端口均相同. 举例: 相对于 ...

  10. iOS动态性 运行时runtime初探(强制获取并修改私有变量,强制增加及修改私有方法等)

    借助前辈的力量综合一下资料. OC是运行时语言,只有在程序运行时,才会去确定对象的类型,并调用类与对象相应的方法.利用runtime机制让我们可以在程序运行时动态修改类.对象中的所有属性.方法,就算是 ...