8000 client got Connection reset by peer error when try to send binary message · Issue #716 · koush/AndroidAsync · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
client got Connection reset by peer error when try to send binary message #716
Open
@chenzx

Description

@chenzx

Server side code:

public class AsyncMessageReceiver extends Thread implements AsyncHttpServer.WebSocketRequestCallback {
    static final String TAG = "BRTC/AsyncMessageReceiver";
    int listenPort;
    AsyncHttpServer asyncHttpServer;
    List<WebSocket> sockets = new ArrayList<>();
    Map<String, WebSocket> id2sockets = new HashMap<>();
    MessageListener listener;

    @Override
    public void onConnected(WebSocket webSocket, AsyncHttpServerRequest request) {
        sockets.add(webSocket);
        //WebSocket is only a interface, no getId() method, so cast to Object then get a hashcode as client connection id;
        final String id = ""+((Object)webSocket).hashCode();
        id2sockets.put(id, webSocket);
        webSocket.setDataCallback(new DataCallback() {
            @Override
            public void onDataAvailable(DataEmitter emitter, ByteBufferList bb) {
                byte[] data = bb.getAllByteArray();
                Log.d(TAG, "onDataAvailable: data="+AsyncMessageUtils.ByteArray2String(data));
                if(AsyncMessageReceiver.this.listener!=null){
                    AsyncMessageReceiver.this.listener.onBinaryMessage(data);
                }
            }
        });
        webSocket.setClosedCallback(new CompletedCallback() {
            @Override
            public void onCompleted(Exception e) {
                try {
                    if (e != null)
                        Log.e(TAG, e.getMessage(), e);
                } finally {
                    sockets.remove(webSocket);
                    id2sockets.remove(id);
                }
            }
        });
    }

    interface MessageListener {
        void onBinaryMessage(byte[] msg);
    }

    public AsyncMessageReceiver(int port){
        Log.d(TAG, "ctor: port="+port);
        this.listenPort = port;
        asyncHttpServer = new AsyncHttpServer();
        asyncHttpServer.websocket("/msg", this);
    }

    public void run(){
        Log.d(TAG, "run: enter");
        asyncHttpServer.listen(AsyncServer.getDefault(), this.listenPort); //how to stop?
    }

    public void setMessageListener(MessageListener listener){
        this.listener = listener;
    }
}

Client:

public class AsyncMessageSender implements AsyncHttpClient.WebSocketConnectCallback {
    static final String TAG = "BRTC/AsyncMessageSender";
    public final static int MAX_MTU_LIMIT = 1450;

    private String url;
    private AsyncHttpClient asyncHttpClient;
    private WebSocket webSocket;

    public AsyncMessageSender(String host, int port){
        url = "http://"+host+":"+port+"/msg";
        asyncHttpClient = AsyncHttpClient.getDefaultInstance();
        Log.i(TAG, "ctor: connect to "+url);
        asyncHttpClient.websocket(url, (String)null, (AsyncHttpClient.WebSocketConnectCallback) this);
    }

    public void emit(byte[] msg){
        if(msg.length>MAX_MTU_LIMIT){
            throw new RuntimeException("msg size "+msg.length+" over MAX_MTU_LIMIT!");
        }
        Log.d(TAG, "emit: send msg="+AsyncMessageUtils.ByteArray2String(msg));
        this.webSocket.send(msg);
    }

    @Override
    public void onCompleted(Exception ex, WebSocket webSocket) {
        if(ex!=null){
            Log.e(TAG, "onCompleted: ERROR "+ex.getMessage(), ex);
            throw new RuntimeException("Cannot connect to "+url);
        }
        Log.d(TAG, "onCompleted: connected to "+this.url);
        this.webSocket = webSocket; //TODO: reconnect when temp connect error?
        //no setDataCallback since client is send-only;
    }

    public void close(){
        Log.d(TAG, "close");
        this.webSocket.close();
    }
}

Error:

E/NIO: Unhandled exception
    java.io.IOException: Connection reset by peer
        at sun.nio.ch.FileDispatcherImpl.read0(Native Method)
        at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43)
        at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
        at sun.nio.ch.IOUtil.read(IOUtil.java:197)
        at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:421)
        at com.koushikdutta.async.SocketChannelWrapper.read(SocketChannelWrapper.java:30)
        at com.koushikdutta.async.AsyncNetworkSocket.onReadable(AsyncNetworkSocket.java:134)
        at com.koushikdutta.async.AsyncServer.runLoop(AsyncServer.java:878)
        at com.koushikdutta.async.AsyncServer.run(AsyncServer.java:726)
        at com.koushikdutta.async.AsyncServer.access$800(AsyncServer.java:46)
        at com.koushikdutta.async.AsyncServer$8.run(AsyncServer.java:680)

I have not seen emit log, so the client first try to read something when connected to server?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      0