解决了LINUX中的禁用防火墙问题
我在Android和NodeJ上编写了简单的应用程序,我试图在Android和Nodejs之间创建连接。
问题无法连接localhost,但我可以连接到http://socket.io/demos/chat/
成功
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
答案 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);
}
}
我建议在服务中使用它。 玩得开心!