【发布时间】:2021-06-22 10:56:16
【问题描述】:
我正在尝试创建一个 TCP 客户端来尝试连接到服务器。如果无法访问服务器,则必须在固定时间后重试。如果连接丢失,则应尝试重新连接。连接后,它应该能够从服务器读取数据(ASCII 字符串)。这段代码没有按预期工作[应用程序在没有服务器的情况下崩溃]。 我该如何解决? (注意:服务器非常不可靠,不能期望优雅地断开连接)
package com.thinkalvb.sensorstorm
import android.util.Log
import java.io.BufferedReader
import java.io.IOException
import java.io.InputStreamReader
import java.net.Socket
import java.net.SocketException
private const val TAG = "Storm_Commander"
class Commander : Runnable {
private lateinit var mTcpSocket: Socket
override fun run() {
val serverAddress = MainActivity.serverAddress
val serverPort = MainActivity.portNumber
while(!Thread.currentThread().isInterrupted) {
try {
Log.d(TAG,"Waiting for Server")
mTcpSocket = Socket(serverAddress, serverPort)
mTcpSocket.soTimeout = 5000
mTcpSocket.keepAlive = true
val receiveBuffer = BufferedReader(InputStreamReader(mTcpSocket.getInputStream(), "UTF-8"))
Log.d(TAG,"Connected to Server")
while (true) {
val command = receiveBuffer.readLine()
if (command != null) {
Log.d(TAG, command)
}
}
} catch (e: SocketException) {
Log.e(TAG, "Socket Error:", e)
} catch (e: IOException) {
Log.e(TAG, "IO Error:", e)
} finally {
mTcpSocket.close()
Log.d(TAG,"Client socket closed")
}
}
}
}
整个项目在 Github https://github.com/ThinkalVB/SensorStorm
错误:
2021-03-25 21:05:44.201 1865-1865/com.thinkalvb.sensorstorm D/Storm_Location: Location Service created
2021-03-25 21:05:44.204 1865-1865/com.thinkalvb.sensorstorm D/Storm_Acceleration: Acceleration Sensor created
2021-03-25 21:05:44.204 1865-1865/com.thinkalvb.sensorstorm D/Storm_Orientation: Orientation Sensor created
2021-03-25 21:05:44.290 1865-1865/com.thinkalvb.sensorstorm D/Storm_Camera: Camera Service created
2021-03-25 21:05:44.290 1865-1865/com.thinkalvb.sensorstorm D/Storm_Temperature: Temperature Sensor created
2021-03-25 21:05:44.292 1865-1865/com.thinkalvb.sensorstorm D/Storm_MainActivity: Main Activity created
2021-03-25 21:05:48.986 1865-1865/com.thinkalvb.sensorstorm D/Storm_MainActivity: Service starting
2021-03-25 21:05:48.987 1865-1957/com.thinkalvb.sensorstorm D/Storm_Commander: Waiting for Server
2021-03-25 21:07:56.396 1865-1957/com.thinkalvb.sensorstorm E/Storm_Commander: Socket Error:
java.net.ConnectException: failed to connect to /10.0.2.2 (port 1357) from /:: (port 37528): connect failed: ETIMEDOUT (Connection timed out)
at libcore.io.IoBridge.connect(IoBridge.java:137)
at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:137)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:390)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436)
at java.net.Socket.connect(Socket.java:621)
at java.net.Socket.connect(Socket.java:570)
at java.net.Socket.<init>(Socket.java:450)
at java.net.Socket.<init>(Socket.java:250)
at com.thinkalvb.sensorstorm.Commander.run(Commander.kt:20)
at java.lang.Thread.run(Thread.java:764)
Caused by: android.system.ErrnoException: connect failed: ETIMEDOUT (Connection timed out)
at libcore.io.Linux.connect(Native Method)
at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:118)
at libcore.io.IoBridge.connectErrno(IoBridge.java:151)
at libcore.io.IoBridge.connect(IoBridge.java:129)
at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:137)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:390)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436)
at java.net.Socket.connect(Socket.java:621)
at java.net.Socket.connect(Socket.java:570)
at java.net.Socket.<init>(Socket.java:450)
at java.net.Socket.<init>(Socket.java:250)
at com.thinkalvb.sensorstorm.Commander.run(Commander.kt:20)
at java.lang.Thread.run(Thread.java:764)
2021-03-25 21:07:56.405 1865-1865/com.thinkalvb.sensorstorm D/Storm_MainActivity: Service stopping
【问题讨论】:
-
Note: Server is extremely unreliableAND10.0.2.2不匹配。 -
为什么让你的应用崩溃?抓住那个例外!
-
我在本地主机上有一个服务器,模拟器客户端能够从它接收数据。我特别想测试服务器不可用时的行为。
标签: android android-studio sockets kotlin tcpclient