我按照this blog post创建一个服务器套接字但是只要它到达int pending = is.available();
(上一个链接的第88行),我就会收到以下异常
[Connection 5432] 0:0:8,306 - Exception: java.lang.ClassCastException - java.net.Socket cannot be cast to com.codename1.impl.android.AndroidImplementation$SocketImpl
java.lang.ClassCastException: java.net.Socket cannot be cast to com.codename1.impl.android.AndroidImplementation$SocketImpl
at com.codename1.impl.android.AndroidImplementation.getSocketAvailableInput(AndroidImplementation.java:7420)
at com.codename1.io.Socket$SocketInputStream.available(Socket.java:168)
at com.adilam.aw2mob.SocketListener$SocketDataWorker.connectionEstablished(Unknown Source)
at com.codename1.io.Socket$1Listener$1.run(Socket.java:105)
at com.codename1.impl.CodenameOneThread$1.run(CodenameOneThread.java:60)
at java.lang.Thread.run(Thread.java:856)
[Listening on 5432] 0:0:8,323 - Exception: java.lang.NullPointerException - null
java.lang.NullPointerException
at com.codename1.impl.android.AndroidImplementation.getSocketErrorCode(AndroidImplementation.java:7415)
at com.codename1.io.Socket$1Listener.run(Socket.java:110)
at com.codename1.impl.CodenameOneThread$1.run(CodenameOneThread.java:60)
at java.lang.Thread.run(Thread.java:856)
CN1版本为3.7
正在使用的Android版本是4.0
任何想法都非常感激。
答案 0 :(得分:1)
我设法使用Native Interface实现解决了这个问题。
This youtube vid提供了在CN1中调用本机接口的简明概述。我创建了一个NativeSocketListener接口
public interface NativeSocketListener extends NativeInterface {
public void SocketListener(int port);
}
和NativeSocketListenerImpl for android
public class NativeSocketListenerImpl {
public void SocketListener(int port) {
new Thread(new SocketListener2(port)).start();
}
public boolean isSupported() {
return true;
}
class SocketListener2 implements Runnable {
private ServerSocket serverSocket;
public SocketListener2(int port) {
try {
serverSocket = new ServerSocket(port);
} catch (IOException e) {
Log.e(e);
}
}
public void run() {
while (true) {
try {
java.net.Socket socket = serverSocket.accept();
InputStream is = socket.getInputStream();
byte[] buffer = new byte[1024];
while (true) {
int pending = is.available();
if (pending > 0) {
int size = is.read(buffer, 0, 1024);
if (size == -1) {
return;
}
if (size > 0) {
String data = new String(buffer, 0, size).trim();
// do something with the data
}
} else {
Thread.sleep(50);
}
}
} catch (Exception e) {
Log.e(e);
}
}
}
}
}
显然,这个实现并不能处理多个连接,但是有大量的在线教程可以实现它。
如上所述,这是针对Android的,因此我无法保证其对其他设备的效果如何。希望即将发布的版本不再需要使用本机接口。
答案 1 :(得分:0)
服务器套接字代码中似乎存在一个错误,我们会在下次更新时修复它。
请注意,您正在使用的是一个侦听套接字,它本身不太便于移植,只适用于JavaSE和Android。如果您使用套接字,我们建议客户端套接字使用connect
代替listen
进行移植。