与 AIS 转发器的 Android 套接字连接引发 IOException
Posted
技术标签:
【中文标题】与 AIS 转发器的 Android 套接字连接引发 IOException【英文标题】:Android Socket Connection with AIS Transponder throws IOException 【发布时间】:2018-08-20 15:10:20 【问题描述】:我正在尝试通过创建与 AIS 转发器的 TCP 连接来通过 WiFi 读取 android 设备上的 AIS 串行数据。我正在使用 EM-Trak B360 AIS 转发器并使用以下代码在 android 设备上创建一个套接字:
public class Client extends AsyncTask<Void, Void, Void>
String dstAddress;
int dstPort;
String response = "";
TextView textResponse;
Client(String addr, int port, TextView textResponse)
dstAddress = addr;
dstPort = port;
this.textResponse = textResponse;
@Override
protected Void doInBackground(Void... arg0)
Socket socket = null;
try
socket = new Socket(dstAddress, dstPort);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(1024);
byte[] buffer = new byte[1024];
int bytesRead;
InputStream inputStream = socket.getInputStream();
/*
* notice: inputStream.read() will block if no data return
*/
while ((bytesRead = inputStream.read(buffer)) != -1)
byteArrayOutputStream.write(buffer, 0, bytesRead);
response += byteArrayOutputStream.toString("UTF-8");
catch (UnknownHostException e)
e.printStackTrace();
response = "UnknownHostException: " + e.toString();
catch (IOException e)
e.printStackTrace();
response = "IOException: " + e.toString();
finally
if (socket != null)
try
socket.close();
catch (IOException e)
e.printStackTrace();
return response;
@Override
protected void onPostExecute(Void result)
textResponse.setText(response);
super.onPostExecute(result);
上面的代码通过创建移动热点来实现移动到移动的连接。但是,当连接 AIS 转发器的 Wifi 网络时,它会抛出 I/O 异常:软件导致连接中止。
08-20 17:04:39.089 13505-13534/com.hfad.slave W/System.err: java.net.SocketException: Software caused connection abort
08-20 17:04:39.090 13505-13534/com.hfad.slave W/System.err:
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:334)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:196)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:178)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:356)
at java.net.Socket.connect(Socket.java:586)
at java.net.Socket.connect(Socket.java:535)
at java.net.Socket.<init>(Socket.java:427)
at java.net.Socket.<init>(Socket.java:210)
at com.hfad.slave.Client.doInBackground(Client.java:47)
at com.hfad.slave.Client.doInBackground(Client.java:16)
at android.os.AsyncTask$2.call(AsyncTask.java:304)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:762)
【问题讨论】:
response += byteArrayOutputStream.toString("UTF-8");
。你应该把它放在while循环之后。
The above code works for mobile-to-mobile connection by creating a mobile hotspot.
???
@greenapps 代码在创建套接字时抛出异常
@greenapps 我的意思是在任何其他 Wifi 网络上运行代码时,上述代码都有效。仅当 android 设备连接到 AIS 转发器的 Wifi 网络时才会中断。
【参考方案1】:
我找到了问题的解决方案。我使用了 Apache Commons 的 telnetclient 库。 https://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/telnet/TelnetClient.html
现在我可以与 AIS 转发器通信了。
谢谢!!
【讨论】:
以上是关于与 AIS 转发器的 Android 套接字连接引发 IOException的主要内容,如果未能解决你的问题,请参考以下文章
Expo react-native 将无法连接到 socketio(Android 和 iOS)