我正在尝试修改现有的TCPSockets插件以使用Cordova 5.0。我已将其更改为在新线程中运行,因此它不会从主线程运行。这似乎可以解决,直到我从插件收到callbackId。它似乎是虚假的,因为应用程序无法识别它。我在标题中收到错误,然后显示“未捕获的参考错误:选项未定义”。有人能说出这个插件有什么问题吗?
public class TCPSockets extends CordovaPlugin {
private CallbackContext callbackContext;
@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) {
// PluginResult r = new PluginResult(PluginResult.Status.NO_RESULT);
this.callbackContext = callbackContext;
// Log.d("TCPSockets", "Plugin Called");
try {
if (action.equals("sendMessage")) {
if (args != null)
{
final int port = args.getInt(0);
final String host = args.getString(1);
final String message = args.getString(2);
final int connectionTimeout = args.getInt(3);
final boolean secureConnection = args.getBoolean(4);
sendMessage(port, host, message, connectionTimeout, secureConnection);
} else {
// return new PluginResult(PluginResult.Status.ERROR, "User did not specify host information");
callbackContext.error("User did not specify host information");
return true;
}
} else {
// return new PluginResult(PluginResult.Status.INVALID_ACTION);
callbackContext.error("Invalid Action");
return true;
}
}
catch (JSONException e) {
Log.d("TCPSockets", "JSONException: " + e.getMessage());
// return new PluginResult(PluginResult.Status.JSON_EXCEPTION);
callbackContext.error("JSON Exception");
return true;
}
// return r;
// callbackContext.sendPluginResult(r);
return true;
}
public void sendMessage(final int port, final String host, final String message, final int connectionTimeout, final boolean secureConnection)
{
cordova.getThreadPool().execute(new Runnable() {
public void run() {
String reply = "";
PluginResult result = new PluginResult(PluginResult.Status.NO_RESULT);
try {
// If we don't want secure connections, then use Socket class
if(!secureConnection)
{
// Not SSL socket
Socket sock = new Socket(host, port);
Log.d("TCPSockets", "Socket created");
sock.setSoTimeout(connectionTimeout); // Time out all actions for 30 seconds
PrintWriter out = new PrintWriter(sock.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
Log.d("TCPSockets", "Created reader/writer");
out.println(message);
Log.d("TCPSockets", "Sent message");
reply = in.readLine();
Log.d("TCPSockets", "Received message: " + reply);
out.flush();
out.close();
in.close();
sock.close();
}
else // If we want secure connections, then use SSLSocket class
{
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
// Trust always
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
// Trust always
}
}
};
SSLContext sslContext = null;
try {
sslContext = SSLContext.getInstance("SSL");
} catch (NoSuchAlgorithmException e) {
Log.d("SSLTCPSockets", "No such algorithm");
// return new PluginResult(PluginResult.Status.IO_EXCEPTION, "Cannot connect to server. Please, try again");
result = new PluginResult(PluginResult.Status.IO_EXCEPTION, "Cannot connect to server. Please, try again");
result.setKeepCallback(false);
callbackContext.sendPluginResult(result);
return;
}
try {
sslContext.init(null, trustAllCerts, new SecureRandom());
} catch (KeyManagementException e) {
Log.d("SSLTCPSockets", "Key manager exception");
// return new PluginResult(PluginResult.Status.IO_EXCEPTION, "Cannot connect to server. Please, try again");
result = new PluginResult(PluginResult.Status.IO_EXCEPTION, "Cannot connect to server. Please, try again");
result.setKeepCallback(false);
callbackContext.sendPluginResult(result);
return;
}
SSLSocketFactory socketFactory = sslContext.getSocketFactory();
SSLSocket socket = (SSLSocket)socketFactory.createSocket(host, port);
socket.setSoTimeout(connectionTimeout);
socket.setUseClientMode(true);
Log.d("SSLTCPSockets", "Connected to host");
SSLSession session = socket.getSession();
if (session.isValid())
{
Log.i(getClass().toString(), "Secure connection");
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out.println(message);
Log.d("SSLTCPSockets", "Sent message");
reply = in.readLine();
Log.d("SSLTCPSockets", "Received message: " + reply);
out.flush();
out.close();
in.close();
}
else
{
Log.d("SSLTCPSockets", "Cannot create a secure connection");
// return new PluginResult(PluginResult.Status.IO_EXCEPTION, "Cannot connect to server. Please, try again");
result = new PluginResult(PluginResult.Status.IO_EXCEPTION, "Cannot connect to server. Please, try again");
result.setKeepCallback(false);
callbackContext.sendPluginResult(result);
return;
}
socket.close();
}
Log.d("TCPSockets", "Saving pluginResult");
result = new PluginResult(PluginResult.Status.OK, reply);
result.setKeepCallback(true);
callbackContext.sendPluginResult(result);
}
catch (UnknownHostException e) {
Log.d("TCPSockets", "Unknown Host");
// return new PluginResult(PluginResult.Status.IO_EXCEPTION, "Cannot connect to server. Please, try again");
result = new PluginResult(PluginResult.Status.IO_EXCEPTION, "Cannot connect to server. Please, try again");
result.setKeepCallback(false);
callbackContext.sendPluginResult(result);
return;
}
catch (java.net.SocketTimeoutException e) {
Log.d("TCPSockets", "Connection timed out");
// return new PluginResult(PluginResult.Status.IO_EXCEPTION, "Connection timed out. Please, try again");
result = new PluginResult(PluginResult.Status.IO_EXCEPTION, "Connection timed out. Please, try again");
result.setKeepCallback(false);
callbackContext.sendPluginResult(result);
return;
}
catch (IOException e) {
Log.d("TCPSockets", "IOException");
// return new PluginResult(PluginResult.Status.IO_EXCEPTION, "Unexpected error. Please, try again");
result = new PluginResult(PluginResult.Status.IO_EXCEPTION, "Unexpected error. Please, try again");
result.setKeepCallback(false);
callbackContext.sendPluginResult(result);
return;
}
}
});
}
}
答案 0 :(得分:1)
这是javascript代码中的错误。事实上,对js代码的回调确实成功。