在服务器套接字InputStream上调用available()时接收ClassCastException

时间:2017-06-30 06:32:20

标签: codenameone

我按照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

任何想法都非常感激。

2 个答案:

答案 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进行移植。