(1)添加库
打开网址:https://www.ganymed.ethz.ch/ssh2/
下载:ganymed-ssh2-build210.jar
用我的mqtt的方法,加入库。
(2)把自己写好的文件,拷贝到工程里面。
(3)解决问题
问题一:
使用的时候,我发现总是连不上,我查看了一下日志,发现这个错误:2022-03-23 15:27:08.583 8013-8013/? W/System.err: Caused by: java.net.SocketException: socket failed: EACCES (Permission denied)
我网上搜了一下,网友说这样解决:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tradingstrategy">
添加这一行
<uses-permission android:name="android.permission.INTERNET"/>
<application
//...
</application>
</manifest>
果然,不会出现上面的错了。
问题二:
上面的问题解决后,运行一下,程序崩溃,出现下面的错误:
2022-03-23 16:56:03.380 14260-14260/com.tradingstrategy D/AndroidRuntime: Shutting down VM
2022-03-23 16:56:03.381 14260-14260/com.tradingstrategy E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.tradingstrategy, PID: 14260
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1450)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:355)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:357)
at java.net.Socket.connect(Socket.java:616)
at ch.ethz.ssh2.transport.TransportManager.establishConnection(TransportManager.java:340)
at ch.ethz.ssh2.transport.TransportManager.initialize(TransportManager.java:448)
at ch.ethz.ssh2.Connection.connect(Connection.java:643)
at ch.ethz.ssh2.Connection.connect(Connection.java:490)
at com.tradingstrategy.ui.utils.UtilsScp.connect(MyScp.java:49)
at com.tradingstrategy.ui.update.UpdateFragment.onClick(MyFragment.java:71)
at android.view.View.performClick(View.java:6294)
at android.view.View$PerformClick.run(View.java:24770)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
以前出现这些错误,都是一直点,直接跳到崩溃的地方,然后修改一下代码就可以了。现在点到最后也就是文件StrictMode.java的builder.penaltyLog();怎么办呢?我还找一下其他错误的地方,然后在百度里面搜索。最后也没搜到有用的信息。搞了一个小时左右,我突然灵光一现,根据我之前的经验,最后一行就是最后错误所在的地方,我拷贝at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1450)这行,到百度里面搜一下,结果有答案了。网上这样说:
android.os.NetworkOnMainThreadException是说不要在主线程中访问网络,这个应该是android4.0版本开始就强制不能在主线程中访问网络,要把访问网络放在
独立的线程中。如果一定要忽略这些强制策略问题的话,可以在onCreate()方法里面加上
StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
我在我顶层Activity的onCreate()方法里面加上上面的代码。果然,不会崩溃了。
这样的坑都有啊,哎。还好,我这个多绝招的人还能勉强应付。
问题三:
前几天,我换了服务器,发现我的APP没法连上。我用电脑,可以连上,这说明跟服务器没有关系。我用手机的termux,也能连上,跟手机网络也没有关系。我用旧的版本,只改IP,什么也不改,结果也连不上。说明跟代码也没有关系。
我一开始想,是不是配置问题。原来的服务器的默认配置可以连接上,新服务器的默认配置连接不上。但是我搜了一下配置的问题,没法先什么。原来的服务器打不开了。
后面我想到是不是版本的问题。我沿着这个方法查找问题。
我打开我的代码,看到:ganymed-ssh2-build210.jar
在服务器上面,执行ssh -V,看到:OpenSSH_8.2p1 Ubuntu-4ubuntu0.11, OpenSSL 1.1.1f 31 Mar 2020
找到这个网页:【Java】Ganymed-ssh2.jar包连接服务器报错(OpenSSH高版本)_ganymed-ssh2问题-优快云博客
[1]登录到服务器
[2]sudo vim /etc/ssh/sshd_config
[3]文件最下面添加:
Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com,chacha20-poly1305@openssh.com
#MACs hmac-sha2-512,hmac-sha2-512-etm@openssh.com,hmac-sha2-256,hmac-sha2-256-etm@openssh.com,hmac-sha1,hmac-sha1-etm@openssh.com
MACs hmac-sha1-96,hmac-sha1,hmac-md5-96,hmac-md5,hmac-sha2-512,hmac-sha2-512-etm@openssh.com,hmac-sha2-256,hmac-sha2-256-etm@openssh.com,hmac-sha1,hmac-sha1-etm@openssh.com
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group-exchange-sha256
非常感谢这个作者,否则没办法搞定。