Android创建简单套接字

时间:2015-07-24 19:47:36

标签: android node.js sockets socket.io

  

解决了LINUX中的禁用防火墙问题

我在Android和NodeJ上编写了简单的应用程序,我试图在Android和Nodejs之间创建连接。

问题无法连接localhost,但我可以连接到http://socket.io/demos/chat/成功

enter image description here 我的nodejs工作正常,并在启动后收到此消息:

Server listening at port 3000

Nodejs文件内容:

var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
var port = process.env.PORT || 3000;

server.listen(port, function () {
    console.log('Server listening at port %d', port);
});

io.on('connection', function (socket) {
    var addedUser = false;

    socket.on('new message', function (data) {
        socket.broadcast.emit('new message', {
            username: socket.username,
            message: data
        });
    });
});

现在我尝试从android连接到:

public class MainActivity extends ActionBarActivity {
    private Socket mSocket;
    {
        try {
            mSocket = IO.socket("http://192.168.1.3:3000");
        } catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mSocket.on(Socket.EVENT_CONNECT_ERROR, onConnectError);
        mSocket.on(Socket.EVENT_CONNECT_TIMEOUT, onConnectError);
        mSocket.on("new message", onNewMessage);
        mSocket.connect();

        attemptSend();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mSocket.disconnect();
        mSocket.off(Socket.EVENT_CONNECT_ERROR, onConnectError);
        mSocket.off(Socket.EVENT_CONNECT_TIMEOUT, onConnectError);
        mSocket.off("new message", onNewMessage);
    }

    private void attemptSend() {
        mSocket.emit("new message", "say hello from server");
    }

    private void leave() {
        mSocket.disconnect();
        mSocket.connect();
    }

    private Emitter.Listener onConnectError = new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            Log.e("", "error_connect");
        }
    };

    private Emitter.Listener onNewMessage = new Emitter.Listener() {
        @Override
        public void call(final Object... args) {
            Log.e("", "onNewMessage");
        }
    };
}

不幸的是,我在运行android应用程序后得到此消息并且无法连接到nodejs:

logcat的:

error_connect

权限:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.VIBRATE"/>

netstat命令结果:

mahdi sinjim-server # netstat -pan | grep 3000
tcp        0      0 0.0.0.0:3000            0.0.0.0:*               LISTEN      27041/nodejs    
tcp        0      0 192.168.1.3:60146       192.168.1.3:3000        ESTABLISHED 3432/firefox    
tcp        0      0 192.168.1.3:3000        192.168.1.3:60146       ESTABLISHED 27041/nodejs    

1 个答案:

答案 0 :(得分:0)

也许尝试使用此脚本进行连接

    public class TCPClient {

            private String serverMessage;
            public final String SERVERIP = Global.IPAddres; //your computer IP address
            public static final int SERVERPORT = 4444;
            private OnMessageReceived mMessageListener = null;
            private boolean mRun = false;

            PrintWriter out;
            BufferedReader in;

            public TCPClient(OnMessageReceived listener) {
                mMessageListener = listener;
            }

            public void sendMessage(String message) {
                Log.d("log", message);
                if (out != null && !out.checkError()) {
                    out.println(message);
                    out.flush();
                    if (message.equals("logout")) stopClient();
                }
            }

            public void stopClient() {
                mRun = false;
                mTcpClient = null;
            }

            public void run() {

                mRun = true;

                try {
                    //here you must put your computer's IP address.
                    InetAddress serverAddr = InetAddress.getByName(SERVERIP);
                    Log.e("TCP Client", "C: Connecting...");
                    //create a socket to make the connection with the server
                    Socket socket = new Socket(serverAddr, SERVERPORT);

                    try {

                        //send the message to the server
                        out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);

                        Log.e("TCP Client", "C: Sent.");
                        Log.e("TCP Client", "C: Done.");

                        //receive the message which the server sends back
                        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));



                        while (mRun) {
                            serverMessage = in.readLine();
                            if (serverMessage != null && mMessageListener != null) {
                                mMessageListener.messageReceived(serverMessage);
                                Log.d("log", serverMessage);
                            }
                            serverMessage = null;
                        }
                        Log.e("RESPONSE FROM SERVER", "S: Received Message: '" + serverMessage + "'");
                    } catch (Exception e) {
                        Log.e("TCP", "S: Error", e);
                    } finally {
                        //the socket must be closed. It is not possible to reconnect to this socket
                        // after it is closed, which means a new socket instance has to be created.
                        socket.close();
                        mTcpClient = null;
                    }

                } catch (Exception e) {
                    Log.e("TCP", "C: Error", e);
                } finally {
                    mTcpClient = null;
                }
                mTcpClient = null;
            }

        }


private class startTCPClient extends AsyncTask {
        @Override
        protected Object doInBackground(Object[] objects) {
            mTcpClient = new TCPClient(
                    new OnMessageReceived() {

                        @Override
                        //here the messageReceived method is implemented
                        public void messageReceived(String message) {
                            Log.d("log", message);

                        }
                    });
            //start client
            mTcpClient.run();
            return null;
        }
}

你必须在onCreate方法中执行它并记住要销毁它。

new startTCPClient().execute();

还有什么,例如,您可以使用此功能发送测试文本消息

public static void sendMessage(String s) {
        Log.d("sendMessage - ", s);        
        if (mTcpClient != null) {
            mTcpClient.sendMessage(s);
        } else {
            Log.e("Service offline", s);
        }
    }

我建议在服务中使用它。 玩得开心!

相关问题